我正在尝试使用 tc 和 iptables 模拟多个数据中心 (dc) 之间的网络延迟、丢失等。
使用 iptables,我已经配置了每个节点来标记数据包要发送到哪个 dc:下面是 2 个 dc(a1 和 a2)的 mangle 规则示例。
*mangle
-A POSTROUTING -j CLASSIFY --set-class 1:a1 -d 174.22.0.5
-A POSTROUTING -j CLASSIFY --set-class 1:a1 -d 174.22.0.6
-A POSTROUTING -j CLASSIFY --set-class 1:a2 -d 174.22.0.2
-A POSTROUTING -j CLASSIFY --set-class 1:a2 -d 174.22.0.4
COMMIT
到目前为止一切都很好(我认为)。
当我启用 tc 规则时出现了问题(甚至还没有开始使用 netem):
tc qdisc del dev eth0 root
tc qdisc add dev eth0 parent root handle 1:0 htb default aff
tc class add dev eth0 parent 1:0 classid 1:a htb rate 1000kbit
tc class add dev eth0 parent 1:a classid 1:a1 htb rate 333kbit
tc class add dev eth0 parent 1:a classid 1:a2 htb rate 333kbit
tc class add dev eth0 parent 1:a classid 1:aff htb rate 333kbit
这样,所有数据包都会被丢弃:
tc -s qdisc show
qdisc noqueue 0: dev lo root refcnt 2
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc htb 1: dev eth0 root refcnt 2 r2q 10 default aff direct_packets_stat 0 direct_qlen 0
Sent 0 bytes 0 pkt (dropped 15221, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
tc -s class show dev eth0
class htb 1:a2 parent 1:a prio 0 rate 333Kbit ceil 333Kbit burst 1599b cburst 1599b
Sent 0 bytes 0 pkt (dropped 7308, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 600593 ctokens: 600593
class htb 1:a root rate 1Mbit ceil 1Mbit burst 1600b cburst 1600b
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 200000 ctokens: 200000
class htb 1:aff parent 1:a prio 0 rate 333Kbit ceil 333Kbit burst 1599b cburst 1599b
Sent 0 bytes 0 pkt (dropped 1675, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 600593 ctokens: 600593
class htb 1:a1 parent 1:a prio 0 rate 333Kbit ceil 333Kbit burst 1599b cburst 1599b
Sent 0 bytes 0 pkt (dropped 7231, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 600593 ctokens: 600593
- 为何流量会下降?
- 我不一定需要进行速率限制,有没有更好的选择?
注意:此示例使用 IPv4,但也需要适用于 IPv6,这就是我使用 iptables 进行分类的原因。