使用tc将数据包延迟到只有一个IP地址

我是使用tc和netem的新手 。 我想延迟发送到特定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 

我的猜测是,我最后需要一些全面的filter来指定所有剩余的stream量不应该经过netem。 但是我什么都不能工作。 我将如何得到这个工作?

好的,我解决了我自己的问题。 事实certificate,如果你执行上面的第3行(“tc qdisc”ones),它将延迟所有的数据包,因为还没有filter。 第4行将其更改为仅延迟来自单个IP地址的数据包。 可以添加额外的filter行来添加额外的IP地址到“延迟”列表。 所以:不要创build一个“netem延迟”行,没有filter指向它。

select的答案是不正确的/不完整的。 我面临类似的问题,select的答案给了一些帮助,但还不够。

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

tc qdisc del dev eth0 root

它会'删除'根qdisc,但立即被一个pfifo_fast取代(所以你不会失去连接)。

第二个命令:

tc qdisc add dev eth0 root handle 1:prio

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

数据包将使用IP包的TOS字段发送到其中一个频段。 执行时会显示此configuration:

tc qdisc ls

看着'priomap'的价值。

然后,你添加一个netem qdisc:

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

使用此命令可以延迟所有stream量进入1:1频段(直到filter到位)。

但默认情况下并不总是如此:

  • 您的stream量可以有不同的TOS值,然后发送到另一个频段。
  • 可以configurationprio qdisc,使stream量进入另一个频段。

这解决了我的问题,不受networking的影响,而不适用filter。 我做了:

tc qdisc add dev eth0 root handle 1:priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

这将默认将所有stream量发送到1:3频段。

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

tc qdisc add dev eth0 parent 1:1句柄10:networking延迟100ms 10ms

这在0乐队里创造了qdisc,但是由于所有的stream量到了乐队3,所以并没有影响到我。

之后,我添加了filter:

tcfilteradd dev eth0协议ip父节点1:0 prio 1 u32匹配ip dst 10.0.0.1/32 match ip dport 80 0xffff flowid 1:1

现在使用filter,只有选定的IP /端口会受到影响,因为我们将select的stream量redirect到带0。

所有其他stream量继续不受影响,因为它继续stream向带3。