我试图在 Ubuntu 16.06 机器上延迟针对特定 IP 地址的流量,但没有成功。有很多资源这 这 这或者这我研究了一下。我最终得到了以下两组命令,但都不起作用:
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 100ms
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.19.0.2/32 flowid 1:1
- 或者 -
tc qdisc add dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 100ms
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.19.0.2/32 flowid 1:1
执行这些操作后,所有流量都将被阻止 - 即,没有任何流量流出,主机无法访问:
$ ping pingserver2
PING pingserver2 (172.19.0.4) 56(84) bytes of data.
From 14d25a894559 (172.19.0.3) icmp_seq=1 Destination Host Unreachable
From 14d25a894559 (172.19.0.3) icmp_seq=2 Destination Host Unreachable
$ ping pingserver
PING pingserver (172.19.0.2) 56(84) bytes of data.
From 14d25a894559 (172.19.0.3) icmp_seq=1 Destination Host Unreachable
From 14d25a894559 (172.19.0.3) icmp_seq=2 Destination Host Unreachable
在我执行第一行之后它甚至就完成了。
有人知道我采取的方法有什么问题吗?
答案1
我终于明白了。在仔细研究了这和这通过这些章节,我对它如何工作以及如何tc
处理数据包有了更好的理解。
所以基本上我需要做的是构建这种树:
1: root qdisc
/ | \
/ | \
/ | \
1:1 1:2 1:3 classes
| | |
10: 20: 30: qdiscs qdiscs
netem sfq ---
band 0 1 2
这意味着,除了添加netem
qdisc 之外,我还需要添加sfq
第二个频段并添加用于“catch-all”情况的过滤器。以下是我使用的所有命令:
tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst 172.19.0.2 match ip dport 6363 0xffff flowid 1:1
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:2
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip protocol 1 0xff flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10ms
tc qdisc add dev eth0 parent 1:2 handle 20: sfq
以下是对上述每一行的解释:
在接口上用句柄 (id)(0 不是必需的)
prio
向根添加排队规则。qdisc默认有三个类 - 1:1 1:2 和 1:3。这些类将在接下来的三行中分配过滤器(顺序很重要!)。了解传出数据包的处理方式非常重要 - 它们从根进入树,然后1:0
eth0
prio
也从根目录退出(叶子不会掉下来!)。为我们要减慢的流量添加过滤器(在我的情况下是进入
172.19.0.2
端口的流量6363
)。过滤器附加到根节点(parent 1:
) - 这意味着所有传出的数据包都将由此过滤器检查。过滤器检查 ip 和端口(ip dst ... ip dport ...
)并重定向到类1:1
(flowid 1:1
)。与上述类似,这是“catch-all”过滤器的设置方式(感谢这个邮政),重定向到类
1:2
。类似地,此过滤器是 ICMP 数据包(ping 数据包)的“万能过滤器”,也会重定向到
1:2
。附加
qdisc
到类1:1
,赋予它一个句柄10:0
,并让它成为netem
延迟 10ms 的 qdisc。将 qdisc附加
sfq
到类1:2
- 此 qdisc 将以“随机公平”方式处理与“catch-all”过滤器匹配的所有其他数据包。
我强烈建议阅读我提供链接的那些章节,因为它们澄清了很多事情,让你不再拼命地在谷歌上寻找解决方案,而是开始自己设计网络整形。
此外,我发现这些命令对于调试/检查非常有用:
tc -s qdisc ls dev eth0
tc -s filter ls dev eth0