Tc:入口監管和 ifb 鏡像
我正在嘗試在 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 樹,而不僅僅是簡單的過濾器。