使用“tc netem”进行网络整形似乎不起作用

使用“tc netem”进行网络整形似乎不起作用

我试图在 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

这意味着,除了添加netemqdisc 之外,我还需要添加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

以下是对上述每一行的解释:

  1. 在接口上用句柄 (id)(0 不是必需的)prio向根添加排队规则。qdisc默认有三个类 - 1:1 1:2 和 1:3。这些类将在接下来的三行中分配过滤器(顺序很重要!)。了解传出数据包的处理方式非常重要 - 它们从根进入树,然后1:0eth0prio也从根目录退出(叶子不会掉下来!)。

  2. 为我们要减慢的流量添加过滤器(在我的情况下是进入172.19.0.2端口的流量6363)。过滤器附加到根节点(parent 1:) - 这意味着所有传出的数据包都将由此过滤器检查。过滤器检查 ip 和端口(ip dst ... ip dport ...)并重定向到类1:1flowid 1:1)。

  3. 与上述类似,这是“catch-all”过滤器的设置方式(感谢这个邮政),重定向到类1:2

  4. 类似地,此过滤器是 ICMP 数据包(ping 数据包)的“万能过滤器”,也会重定向到1:2

  5. 附加qdisc到类1:1,赋予它一个句柄10:0,并让它成为netem延迟 10ms 的 qdisc。

  6. 将 qdisc附加sfq到类1:2- 此 qdisc 将以“随机公平”方式处理与“catch-all”过滤器匹配的所有其他数据包。

我强烈建议阅读我提供链接的那些章节,因为它们澄清了很多事情,让你不再拼命地在谷歌上寻找解决方案,而是开始自己设计网络整形。

此外,我发现这些命令对于调试/检查非常有用:

tc -s qdisc ls dev eth0
tc -s filter ls dev eth0

相关内容