使用 Linux 内置 tc 命令来模拟弱网环境

大多数 Linux 发行版中都带有流量控制的命令 tc。

关于 tc 的 qdisc 可以文末的文章可以理解更多 tc 的 qdisc 相关的内容。

这里直接给出模拟弱网的命令。

直接作用于指定物理网卡:

# 200m 延迟 30ms 抖动 + 10%丢包 + 10%重复 + 10% 乱序
tc qdisc add dev ens256 root netem delay 200ms 30ms loss 10% duplicate 10% reorder 10%

作用于网卡下指定的端口,这里以 2000 端口为例:

tc qdisc add dev ens256 root handle 1: htb
tc class add dev ens256 parent 1: classid 1:10 htb rate 10000mbit
tc qdisc add dev ens256 parent 1:10 handle 10: netem delay 200ms 30ms loss 10% duplicate 10% reorder 10%
tc filter add dev ens256 parent 1:0 protocol ip prio 1 u32 match ip dport 2000 0xffff flowid 1:10

更复杂一点的情况,若当前机器为路由设备,出口网卡为 ens192, 内部网络为 ens256 网段为 192.168.200.0/24, 对传入该网段 2000 端口和从 2000 端口传出的数据全部执行流量控制:

tc qdisc del dev ens192 root
tc qdisc add dev ens192 root handle 1: htb
tc class add dev ens192 parent 1: classid 1:10 htb rate 10000mbit
tc qdisc add dev ens192 parent 1:10 handle 10: netem delay 150ms 30ms
tc filter add dev ens192 parent 1:0 protocol ip prio 1 u32 match ip src 192.168.200.0/24 match ip sport 2000 0xffff flowid 1:10

tc qdisc del dev ens256 root
tc qdisc add dev ens256 root handle 1: htb
tc class add dev ens256 parent 1: classid 1:10 htb rate 10000mbit
tc qdisc add dev ens256 parent 1:10 handle 10: netem delay 150ms 30ms
tc filter add dev ens256 parent 1:0 protocol ip prio 1 u32 match ip dst 192.168.200.0/24 match ip dport 2000 0xffff flowid 1:10

另外一种,除了 192.168.200.0/24 相关 22/3389 端口之外所有的转发流量进行丢包:

tc qdisc del dev ens192 root
tc qdisc add dev ens192 root handle 1: htb
tc class add dev ens192 parent 1: classid 1:1 htb rate 10000mbit
tc class add dev ens192 parent 1: classid 1:2 htb rate 10000mbit
tc filter add dev ens192 parent 1: protocol ip prio 1 u32 match ip src 192.168.200.0/24 match ip sport 22 0xffff flowid 1:1
tc filter add dev ens192 parent 1: protocol ip prio 2 u32 match ip src 192.168.200.0/24 match ip sport 3389 0xffff flowid 1:1
tc filter add dev ens192 parent 1: protocol ip prio 3 u32 match ip src 192.168.200.0/24 flowid 1:2
tc qdisc add dev ens192 parent 1:2 handle 20: netem delay 100ms 15ms loss 2% duplicate 2% reorder 2%

tc qdisc del dev ens224 root
tc qdisc add dev ens224 root handle 1: htb
tc class add dev ens224 parent 1: classid 1:1 htb rate 10000mbit
tc class add dev ens224 parent 1: classid 1:2 htb rate 10000mbit
tc filter add dev ens224 parent 1: protocol ip prio 1 u32 match ip dst 192.168.200.0/24 match ip dport 22 0xffff flowid 1:1
tc filter add dev ens224 parent 1: protocol ip prio 2 u32 match ip dst 192.168.200.0/24 match ip dport 3389 0xffff flowid 1:1
tc filter add dev ens224 parent 1: protocol ip prio 3 u32 match ip dst 192.168.200.0/24 flowid 1:2
tc qdisc add dev ens224 parent 1:2 handle 10: netem delay 100ms 15ms loss 2% duplicate 2% reorder 2%

移除流量控制规则:

 tc qdisc del dev ens256 root

查看状态:

tc -s qdisc show dev ens256
tc -s class show dev ens256
tc -s filter show dev ens256

其他相关命令

# 删除 filter 
tc filter del dev ens256 parent 1: handle 800::800 prio 1 protocol ip u32

参考文章

tc(8), tc-netem(8)
https://arthurchiao.art/blog/lartc-qdisc-zh/ (页面快照备份)

发表评论