You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSL2中Docker容器间tc/netem延迟规则无法生效求助

在WSL2 Ubuntu中为Docker容器配置netem延迟失败的问题

我在WSL2的Ubuntu发行版中,尝试使用tcconfig(tc模块的Python封装包)及tc命令为两个Docker容器配置netem延迟,但未能成功,tc命令无法应用到正确的地址。

执行的操作

# 创建并启动3个Docker容器:
sudo docker run --name dc1 -itd --cap-add NET_ADMIN archlinux bash
sudo docker run --name dc2 -itd --cap-add NET_ADMIN archlinux bash
sudo docker run --name dc3 -itd --cap-add NET_ADMIN archlinux bash

# 使用tcconfig在dc1和dc2间设置100ms延迟
sudo tcset dc1 --src-container dc1 --dst-container dc2 --docker --delay 100ms

预期与实际结果

预期从dc2 ping dc1或反向操作时能看到100ms延迟,但实际未生效。查看dc1对应的veth设备,通过tcconfig的tcshow命令看到已应用的规则:

(.venv) johnsmith@AP-HYB-AmXNp8wl:~/python-scripts$ sudo tcshow veth605f18a
{
    "veth605f18a": {
        "outgoing": {
            "src-network=172.17.0.2/32, dst-network=172.17.0.3/32, protocol=ip": {
                "filter_id": "800::800",
                "delay": "100ms",
                "rate": "10Gbps"
            }
        },
        "incoming": {}
    }
}

地址验证

我推测问题在于规则应用到了172.17.0.2/32和172.17.0.3/32,而非容器正确的地址+子网172.17.0.2/16和172.17.0.3/16。验证dc1的地址:

[root@7cee5e6f43bc /]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet **172.17.0.2/16** brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

查看底层tc命令

通过--tc-script选项查看tcconfig生成的底层tc命令:

/usr/sbin/tc qdisc add dev veth605f18a root handle 17e0: htb default 1
/usr/sbin/tc class add dev veth605f18a parent 17e0: classid 17e0:1 htb rate 10000000.0kbit
/usr/sbin/tc class add dev veth605f18a parent 17e0: classid 17e0:76 htb rate 10000000.0Kbit ceil 10000000.0Kbit
/usr/sbin/tc qdisc add dev veth605f18a parent 17e0:76 handle 22d8: netem delay 100.0ms
/usr/sbin/tc filter add dev veth605f18a protocol ip parent 17e0: prio 5 u32 match ip src 172.17.0.2/32 match ip dst 172.17.0.3/32 flowid 17e0:76 

修改子网掩码后的尝试

我尝试将子网掩码改为/16后重新执行tc命令:

/usr/sbin/tc qdisc add dev veth605f18a root handle 17e0: htb default 1
/usr/sbin/tc class add dev veth605f18a parent 17e0: classid 17e0:1 htb rate 10000000.0kbit
/usr/sbin/tc class add dev veth605f18a parent 17e0: classid 17e0:76 htb rate 10000000.0Kbit ceil 10000000.0Kbit
/usr/sbin/tc qdisc add dev veth605f18a parent 17e0:76 handle 22d8: netem delay 100.0ms
/usr/sbin/tc filter add dev veth605f18a protocol ip parent 17e0: prio 5 u32 match ip src 172.17.0.2/16 match ip dst 172.17.0.3/16 flowid 17e0:76 

但仍未生效,查看规则发现过滤器被应用到了整个172.17.0.0/16子网,而非指定的两个IP:

(.venv) johnsmith@AP-HYB-AmXNp8wl:~/python-scripts$ tcshow veth605f18a 
{
    "veth605f18a": {
        "outgoing": {
            "src-network=172.17.0.0/16, dst-network=172.17.0.0/16, protocol=ip": {
                "filter_id": "800::800",
                "delay": "100ms",
                "rate": "10Gbps"
            }
        },
        "incoming": {}
    }
}

我刚接触tc网络整形,恳请指点我哪里出错,以及如何在Docker容器间正确配置延迟,非常感谢!

内容的提问来源于stack exchange,提问作者Yue Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:20:56