使用 tc 将数据包延迟到单个 IP 地址

Mat*_*ite 22 linux traffic-shaping tc

我是使用tcnetem 的新手。我想延迟发送到特定 IP 地址的数据包。但是,以下命令会导致系统上的所有数据包延迟,而不仅仅是 IP 地址 1.2.3.4:

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 1.2.3.4 flowid 2:1
Run Code Online (Sandbox Code Playgroud)

我的猜测是我最后需要某种全能过滤器来指定所有剩余流量不应通过 netem。但我什么也做不了。我如何让这个工作?

小智 17

选择的答案不正确/不完整。我遇到了类似的问题,选择的答案提供了一些帮助,但还不够。

首先,下面的命令并不是真正需要的。

tc qdisc del dev eth0 root

它将“删除”根 qdisc,但会立即被 pfifo_fast 替换(因此您不会失去连接)。

第二条命令:

tc qdisc add dev eth0 root handle 1: prio

将 pfifo_fast qdisc 替换为 prio 一个。默认情况下,prio 队列有 3 个频段(0、1、2),每个频段由一个类(1:1、1:2 和 1:3)管理。

数据包将使用 IP 包的 TOS 字段发送到这些频段之一。执行时会显示此配置:

tc qdisc ls

查看“priomap”值。

然后,添加一个 netem qdisc:

tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms

使用此命令,您可以延迟进入 1:1 频段的所有流量(直到过滤器就位)。

但是有两个警告:

  • 您的流量可以具有不同的 TOS 值,然后被发送到另一个频段。
  • 可以配置 prio qdisc,以便流量进入另一个频段。

以下解决了我在未应用过滤器时不受网络影响的问题。而不是上述步骤,我做了:

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

默认情况下,这会将所有流量发送到频段 1:3。

然后,我添加了延迟流量的规则:

tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 100ms 10ms

这会在频段 0 中创建 qdisc,但由于所有流量都进入频段 3,因此不会影响我。

之后,我添加了过滤器:

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 10.0.0.1/32 match ip dport 80 0xffff flowid 1:1

现在有了过滤器,只有选定的 IP/端口会受到影响,因为我们将选定的流量重定向到频段 0。

所有其他流量继续不受影响,因为它继续流向波段 3​​。


Mat*_*ite 14

好的,我解决了我自己的问题。事实证明,如果您执行上面的前 3 行(“tc qdisc”),它将延迟所有数据包,因为还没有过滤器。第 4 行将其更改为仅延迟来自该单个 IP 地址的数据包。可以添加额外的过滤器行以将额外的 IP 地址添加到“延迟”列表中。所以:不要在没有指向它的过滤器的情况下创建“netem delay”线。