大多数 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/ (页面快照备份)