我是新手碳和网状结构。我想延迟发送到特定 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。但我无法让任何功能正常工作。我该如何让它工作?
答案1
所选答案不正确/不完整。我遇到过类似的问题,所选答案提供了一些帮助,但还不够。
首先,以下命令并不是真正需要的。
tc qdisc del dev eth0 root
它将“删除”根 qdisc,但立即被 pfifo_fast 替换(因此您不会失去连接)。
第二条命令:
tc qdisc 添加 dev eth0 根句柄 1:prio
将用 prio 队列规定替代 pfifo_fast 队列规定。默认情况下,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 延迟 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 add dev eth0 parent 1:1 handle 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
现在有了过滤器,只有选定的 IP/端口会受到影响,因为我们将选定的流量重定向到频段 0。
所有其他流量均不受影响,因为它们继续流向频段 3。
答案2
好的,我解决了自己的问题。事实证明,如果您执行上面的前 3 行(“tc qdisc”),它将延迟所有数据包,因为还没有过滤器。第 4 行将其更改为仅延迟来自该单个 IP 地址的数据包。可以添加其他过滤器行以将其他 IP 地址添加到“延迟”列表中。因此:不要创建没有指向它的过滤器的“netem delay”行。
答案3
简单示例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
答案4
我无法使用此线程中描述的方法延迟到一个 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 的流量。该命令用于获取主机的主 IP,但可以在命令内部直接替换该值。1.2.3.4
hostname -I
我必须添加另一个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