Linux
橋接埠上的 tc
我有一個 4 埠網橋:
root@Linux-Switch:~# brctl show bridge name bridge id STP enabled interfaces br0 8000.000024cd2cb0 no eth0 eth1 eth2 eth3
我的目標是限制eth2介面的上傳速度。(eth0 是上游交換機的上行介面)。我一直在嘗試通過 tc 和 iptables 來做到這一點。
# tried in both the filter table and mangle table iptables -A FORWARD -t mangle -m physdev --physdev-in eth2 -j MARK --set-mark 5 tc qdisc add dev eth0 root handle 1:0 htb default 2 tc class add dev eth0 parent 1:0 classid 1:1 htb rate 1mbit ceil 1mbit tc class add dev eth0 parent 1:0 classid 1:2 htb rate 5mbit ceil 5mbit tc filter add dev eth0 parent 1:0 handle 5 fw flowid 1:1
我可以看到
iptables
規則是匹配的-root@Linux-Switch:~# iptables -vL -t mangle ... Chain FORWARD (policy ACCEPT 107K packets, 96M bytes) pkts bytes target prot opt in out source destination 38269 11M MARK all -- any any anywhere anywhere PHYSDEV match --physdev-in eth2 MARK set 0x5 ... root@Linux-Switch:~#
但是 tc 配置沒有讀取 fw 標記;埠 eth2 中的所有流量都被限制為 5Mb 預設值,而不是我嘗試配置的 1Mb。
root@Linux-Switch:~# tc -s class show dev eth0 class htb 1:1 root prio 0 rate 1000Kbit ceil 1000Kbit burst 100Kb cburst 100Kb Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) rate 0bit 0pps backlog 0b 0p requeues 0 lended: 0 borrowed: 0 giants: 0 tokens: 200000 ctokens: 200000 class htb 1:2 root prio 0 rate 5000Kbit ceil 5000Kbit burst 100Kb cburst 100Kb Sent 11465766 bytes 39161 pkt (dropped 0, overlimits 0 requeues 0) rate 6744bit 3pps backlog 0b 0p requeues 0 lended: 39161 borrowed: 0 giants: 0 tokens: 2454400 ctokens: 2454400 root@Linux-Switch:~#
我究竟做錯了什麼?
我想通了——我必須在過濾器中指定一個“協議”。我可以找到很多關於此的文件-我可以找到的所有範例都將協議指定為“ip”,但由於這是一個開關,我想我會嘗試“全部”並且它有效!
tc qdisc add dev eth0 root handle 1:0 htb default 2 tc class add dev eth0 parent 1:0 classid 1:1 htb rate 1mbit ceil 1mbit tc class add dev eth0 parent 1:0 classid 1:2 htb rate 5mbit ceil 5mbit tc filter add dev eth0 parent 1:0 handle protocol all 5 fw flowid 1:1