Traffic-Shaping

Tc:入口監管和 ifb 鏡像

  • July 10, 2014

我正在嘗試在 Linux 網關上設置流量整形,如此所述。該腳本需要自定義,因為我有多個 LAN 介面。因此,為了塑造 LAN 端,我計劃創建一個 ifb 偽設備,如下所示:

    modprobe ifb
    ip link set dev ifb0 up
   /sbin/tc qdisc add dev $WAN_INTERFACE ingress
   /sbin/tc filter add dev $WAN_INTERFACE parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

上面提到的 gist repo 中的腳本有以下幾行:

/sbin/tc qdisc add dev $WAN_INTERFACE handle ffff: ingress
   /sbin/tc filter add dev $WAN_INTERFACE parent ffff: protocol ip prio 1 u32 match ip sport $INTERACTIVE_PORT 0xffff flowid :1
   /sbin/tc filter add dev $WAN_INTERFACE parent ffff: protocol ip prio 1 u32 match ip dport $INTERACTIVE_PORT 0xffff flowid :1
   /sbin/tc filter add dev $WAN_INTERFACE parent ffff: protocol ip prio 5 0 u32 match ip src 0.0.0.0/0 police rate $MAX_DOWNRATE_INGRESS burst 20k drop flowid :2

這段程式碼和 ifb 介面創建程式碼不能很好地結合在一起。自定義腳本被執行,但 ifb0 設備不顯示任何流量統計資訊。如果我註釋掉入口要點 repo 程式碼(上面引用),那麼 ifb0 設備會顯示傳輸的數據包數。這些行也不能一起執行:

/sbin/tc qdisc add dev $WAN_INTERFACE ingress
/sbin/tc qdisc add dev $WAN_INTERFACE handle ffff: ingress

我得到文件存在錯誤。那麼,如何在 WAN_INTERFACE 上塑造入口,同時塑造通過 ifb0 設備進入 LAN 的流量?

IFB 是用於處理入口流量的 tc 過濾器的替代方案,通過將其重定向到虛擬介面並將其視為出口流量。您需要每個物理介面一個 ifb 介面,將入口流量從 eth0 重定向到 ifb0,將 eth1 重定向到 ifb1 等等在。

插入 ifb 模組時,告訴它您需要的虛擬介面數量。預設值為 2:

modprobe ifb numifbs=1

現在,啟用所有 ifb 介面:

ip link set dev ifb0 up # repeat for ifb1, ifb2, ...

並將入口流量從物理介面重定向到相應的 ifb 介面。對於 eth0 -> ifb0:

tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

再次,重複 eth1 -> ifb1、eth2 -> ifb2 等,直到覆蓋您想要塑造的所有介面。

現在,您可以應用您想要的所有規則。eth0 的出口規則在 eth0 中照常執行。讓我們限制頻寬,例如:

tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit

不用說,重複 eth1, eth2, …

eth0 的入口規則,現在作為 ifb0 的出口規則(進入 ifb0 的任何東西都必須出來,只有 eth0 入口流量進入 ifb0)。同樣,頻寬限制範例:

tc qdisc add dev ifb0 root handle 1: htb default 10
tc class add dev ifb0 parent 1: classid 1:1 htb rate 1mbit
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 1mbit

這種方法的優點是出口規則比入口過濾器靈活得多。例如,過濾器只允許您丟棄數據包,而不是引入等待時間。通過將入口流量作為出口處理,您可以設置隊列規則、流量類別以及(如果需要)過濾器。您可以訪問整個 tc 樹,而不僅僅是簡單的過濾器。

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