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
相关产品推荐
相关产品推荐

