Linux

使用 tc 將數據包延遲到僅單個 IP 地址

  • September 18, 2019

我是使用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。但我什麼都做不了。我怎樣才能讓它工作?

好的,我解決了我自己的問題。事實證明,如果您執行上面的前 3 行(“tc qdisc”行),它將延遲所有數據包,因為還沒有過濾器。第 4 行將其更改為僅延遲來自該單個 IP 地址的數據包。可以添加其他過濾器行以將其他 IP 地址添加到“延遲”列表中。所以:不要在沒有指向它的過濾器的情況下創建“netem 延遲”行。

選擇的答案不正確/不完整。我遇到了類似的問題,選擇的答案提供了一些幫助,但還不夠。

首先,以下命令並不是真正需要的。

tc qdisc del dev eth0 root

它將“刪除”根 qdisc,但會立即被 pfifo_fast 替換(這樣您就不會失去連接)。

第二條命令:

tc qdisc 添加 dev eth0 根句柄 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 句柄 2:netem 延遲 500ms

使用此命令,您可以延遲所有進入 1:1 頻段的流量(直到過濾器到位)。

但有兩個警告:

  • 您的流量可以具有不同的 TOS 值,然後被發送到另一個頻段。
  • 可以配置prio qdisc,以便流量轉到另一個頻段。

以下解決了我在未應用過濾器時不受網路影響的問題。而不是上述步驟,我做了:

tc qdisc 添加 dev eth0 根句柄 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 句柄 10:netem 延遲 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​​。

引用自:https://serverfault.com/questions/389290