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


20

我是使用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

我的猜测是,我最后需要某种通用过滤器来指定所有剩余流量都不应通过netem。但是我什么都无法工作。我将如何工作?

Answers:


14

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


感谢您回来并发布答案。奇怪的是,我发现它在两种情况下都可以正常工作,但是无论如何。我围绕这三个命令编写了一个包装器脚本,以帮助进行测试,只是以为我会给一点点 :)
Arran Cudbard-Bell 2013年

13

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

首先,实际上并不需要以下命令。

tc qdisc del dev eth0根目录

它会“删除”根qdisc,但会立即被pfifo_fast替换(这样就不会失去连接性)。

第二条命令:

tc qdisc添加dev eth0根句柄1:prio

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

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

tc qdisc ls

查看“ priomap”值。

然后,添加一个netem qdisc:

tc qdisc添加dev eth0父对象1:1处理2:netem延迟500ms

使用此命令,您可以延迟所有流向1:1频段的流量(直到安装了过滤器)。

但是有两个警告:

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

以下解决了我的问题,即在未应用过滤器的情况下不受netem的影响。代替上述步骤,我做了:

tc qdisc添加dev eth0根句柄1:prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

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

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

tc qdisc添加dev eth0父对象1:1句柄10:netem延迟100ms 10ms

这将在波段0中创建qdisc,但是由于所有流量都进入了波段3,因此它对我没有影响。

之后,我添加了过滤器:

tc过滤器添加dev eth0协议ip父1:0 prio 1 u32匹配ip dst 10.0.0.1/32匹配ip dport 80 0xffff flowid 1:1

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

所有其他流量继续流向频段3,因此不受影响。


什么是“ ip dst 10.0.0.1/32”?那是目的地IP吗?这是否意味着存在“ ip src xxx.yyy.zz.www / aa”?
Zach Folwick

是的,在我的示例中是目标IP。是的,有一个“ ip src”选项。
电报员

第一个命令(tc qdisc del)的原因是清除所有以前的状态-就像您尝试进行这项工作时可能会遇到的状态。FWIW接受的答案对我有用。
丹·普里兹

谢谢,这个答案真的很有帮助。
PepeHands

1

来自https://wiki.linuxfoundation.org/networking/netem的简单示例,即使在配置过程中,您也可以将数据包延迟到给定IP而不影响任何其他流量:

tc qdisc del dev eth0 root # Ensure you start from a clean slate
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 500ms
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
   match ip dst 192.168.1.2 flowid 1:3

我必须补充一个警告,后来看来延迟的应用范围超出了我的预期,我无法深入探究。并非所有流量似乎都被延迟了。
NeilenMarais

0

使用此线程中描述的方法,我没有设法延迟到一个IP的流量,而又保持正常的流量到其他IP的正常。

但是,我设法使用以下命令来做到这一点。

tc qdisc add dev eth0 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
tc qdisc add dev eth0 parent 1:2 handle 20: netem delay 0ms
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip src `hostname -I` flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 15001ms
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 1.2.3.4 flowid 1:1

延迟从执行命令的主机15001ms到IP的流量1.2.3.4。该命令hostname -I用于获取主机的主IP,但该值可以在命令内部直接替换。

我必须0ms延迟添加另一个过滤器,以匹配来自主机的流量。当然,它不是很优雅,但是我还没有更好的工作方法。

可以替换最后一个命令以匹配单个端口。

tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 18583 0xffff flowid 1:1

延迟到端口18583而不是IP的流量1.2.3.4


我还找到了此答案第二种方法,可以在不影响其他流量的情况下延迟流量。1.2.3.4:18583

tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip  parent 1: prio 1 u32 match ip dst 1.2.3.4 match ip dport 18583 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.