Linux-Networking

嘗試為 IPv4 和 IPv6 調整流量會導致衝突

  • August 11, 2019

在我的伺服器上,我正在嘗試設置流量整形,如果我為 IPv4 或 IPv6 設置,一切都很好:安裝了該特定協議的所有過濾規則。但是,當嘗試對兩者進行整形時,我遇到了錯誤,並且某些過濾器規則被拒絕並顯示以下錯誤消息:

Error: Filter with specified priority/protocol not found.
We have an error talking to the kernel, -1

稍微修改一下 tc 規則,我發現了以下特性:當我只有 IPv4 或 IPv6 整形處於活動狀態時,我可以啟用另一個協議的最高優先級的過濾器,它仍然可以工作,但只要我嘗試添加更多,較低優先級的將被上述錯誤消息拒絕。

因此,考慮到這可能是對可以附加的過濾器數量的一些模糊限制,我註釋掉了每個協議的優先級最低的兩條規則,並保留了啟用最高優先級的兩條規則,但這也無濟於事. 僅安裝另一個塊中優先級最高的規則(即 IPv6,因為首先安裝 IPv4 的規則),優先級較低的規則被拒絕。

然後我嘗試反過來做,取消註釋其中一個協議的所有規則,並註釋掉另一個協議的所有內容,但優先級最低的規則除外,但這也被拒絕了。

TL;DR:嘗試在 IPv4 和 IPv6 上調整網路流量會失敗,因為嘗試安裝多個具有不同句柄和優先級的過濾器顯然會引發某種衝突,只允許安裝具有最高優先級的過濾器。

腳本的相關部分是這樣的:

/sbin/tc qdisc add dev eth0 root handle 1:0 htb default 16
/sbin/tc class add dev eth0 parent 1:0 classid 1:20 htb rate 102000kbit ceil 102000kbit
/sbin/tc class add dev eth0 parent 1:20 classid 1:1 htb rate 25kbit ceil 102000kbit prio 0 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:2 htb rate 25kbit ceil 102000kbit prio 1 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:3 htb rate 10200kbit ceil 102000kbit prio 2 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:4 htb rate 20400kbit ceil 102000kbit prio 3 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:16 htb rate 71350kbit ceil 102000kbit prio 4 quantum 3000
/sbin/tc qdisc add dev eth0 parent 1:4 hhf
/sbin/tc qdisc add dev eth0 parent 1:16 hhf
/sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ip handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ip handle 4/0xF fw flowid 1:4
/sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ipv6 handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ipv6 handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ipv6 handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ipv6 handle 4/0xF fw flowid 1:4

我正在使用 iptables 為過濾器適當地標記網路數據包。

  • 優先級 0:小數據包(最大 128 字節)和 DNS(也是 IPv6 NDP 的 ICMP)
  • 優先級 1:互動式 SSH
  • 優先級 2:埠映射器/NFS
  • 優先級 3:IPsec
  • 大容量流量沒有專門的過濾器,優先級最低。

現在我不知道這裡可能出了什麼問題。如果我在這裡犯了一個錯誤,我目前看不到森林的樹木。

過濾器優先級不是特定於家庭的。

因此,您創建過濾器的命令應如下所示:

/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ip handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ip handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 4 protocol ip handle 4/0xF fw flowid 1:4
/sbin/tc filter add dev eth0 parent 1:0 prio 5 protocol ipv6 handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 6 protocol ipv6 handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 7 protocol ipv6 handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 8 protocol ipv6 handle 4/0xF fw flowid 1:4

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