由于条件限制,需要在局域网模拟广域网丢包,延迟等现象。linux 已经原生提供了用户空间工具流量控制tc,网络模拟netem。我试了桥接的虚拟机,loopback 接口, 设置了无效,不会丢包, 至少需要两台物理机器连到同一局域网。下面的例子参考了[1],[2]。
最简单的是无类别配置
tc qdisc add dev eth0 root netem loss 50%
ping www.baidu.com
tc qdisc del dev eth0 root #撤销
ping www.baidu.com
发送数据丢包50%,除了5007,5001端口
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 10: sfq
tc qdisc add dev eth0 parent 1:2 handle 20: prio netem loss 50%
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 \
match ip dport 5007 0xffff \
match ip dport 5001 0xffff flowid 1:1
这里flowid 和class parent对应,注意匹配顺序是从小的id开始。
设定特定ip地址延迟1秒,随机丢包~N(0.0.2)
#建立根队列(cbq, htb可限制带宽,prio不限制带宽)
tc qdisc add dev eth0 root handle 1: prio
#建立子队列class 1:4
tc qdisc add dev eth0 parent 1:4 handle 40: \
netem delay 1s distribution normal loss 2%
#端口为14100的IP包过滤到class 1:4
tc filter add dev eth0 protocol ip parent 1:0 prio 4 u32 \
match ip dport 14100 0xffff flowid 1:4
#指定路由
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 2 flowid 1:2
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 3 flowid 1:3
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 4 flowid 1:4
ip route add 192.168.1.24 dev eth0 via 192.168.1.66 realm 2
ip route add 192.168.1.30 dev eth0 via 192.168.1.66 realm 3
ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4
限制特定端口流量
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 1024kbps
tc class add dev eth0 parent 1:1 classid 1:5 htb rate 512kbps ceil 640kbps prio 1
tc class add dev eth0 parent 1:1 classid 1:6 htb rate 100kbps ceil 160kbps prio 0
tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 5 fw flowid 1:5
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 6 fw flowid 1:6
iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 5
iptables -A OUTPUT -t mangle -p tcp --sport 22 -j MARK --set-mark 6
iptables save
查询设置结果
sudo tc -s qdisc ls dev eth0
sudo tc -s class ls dev eth0
sudo tc -s filter show dev eth0
sudo ip route
sudo tc filter del dev lo pref 4
[1] http://lartc.org/howto/lartc.qdisc.filters.html
[2] http://www.linuxfoundation.org/collaborate/workgroups/networking/netem