![桥接端口上的 tc](https://linux22.com/image/30645/%E6%A1%A5%E6%8E%A5%E7%AB%AF%E5%8F%A3%E4%B8%8A%E7%9A%84%20tc.png)
我有一个 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 配置没有读取固件标记;端口 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:~#
我究竟做错了什么?
答案1
我想通了 - 我必须在过滤器中指定一个“协议”。我可以找到很多关于此的文档 - 我可以找到的所有示例都将协议指定为“ip”,但由于这是一个开关,我想我应该尝试“all”并且它有效!
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