我负责一个基于Linux的(运行Debian的)分支机构路由器,它需要一个单一的高速互联网连接(eth2),并把它变成大约20个内部networking,每个networking有一个独立的子网(192.168.1.0/24到192.168 .20.0 / 24)和一个单独的VLAN(eth0.101到eth0.120)。 我正试图限制一个内部子网上的带宽,这个内部子网一直在嚼碎更多的带宽。 做这个的最好方式是什么?
我第一次尝试在这里是奇迹般的,我在这里听到超级用户。 不幸的是,这对我恰恰相反的情况非常有用……它在客户端而不是在互联网端很有用。
我的第二次尝试是使用在http://www.topwebhosts.org/tools/traffic-control.phpfind的脚本,我修改了这样的活动部分是:
tc qdisc add dev eth0.113 root handle 13: htb default 100 tc class add dev eth0.113 parent 13: classid 13:1 htb rate 3mbps tc class add dev eth0.113 parent 13: classid 13:2 htb rate 3mbps tc filter add dev eth0.113 protocol ip parent 13:0 prio 1 u32 match ip dst 192.168.13.0/24 flowid 13:1 tc filter add dev eth0.113 protocol ip parent 13:0 prio 1 u32 match ip src 192.168.13.0/24 flowid 13:2
我想要做的是将VLAN 113(子网192.168.13.0/24)上的带宽限制为3mbit和3mbit。 不幸的是,这似乎没有任何作用! 我对tc命令很缺乏经验,所以帮助得到这个工作将不胜感激。
从开发人员引用到试图做同样事情的人: 在vlan上进行stream量控制可能无法按预期工作,因为vlan伪设备没有任何传输队列。
既然你已经写了你的规则来限制子网的限制 ,那么要让Linux对它进行评级控制。
我会build议通过将VLAN放在一个网桥中来解决这个问题(尽pipe为了一致性的缘故,您可能需要为每个VLAN创build一个网桥):
brctl addbr br113 btctl addif br113 eth0.113
然后,您可以将您的tc规则应用于br113而不是eth0.113 。
(configuration/etc/network/interfaces留给读者练习,如果这样做的话)
或者将stream量控制规则应用到您的广域网接口eth2可能会更简单; 最终的结果应该是一样的。
您需要一个ifb接口来镜像eth0的入口stream量到ifb0的出口侧。
尝试这个:
# Interface virtual for incomming traffic tin1="ifb0" # Interface connect to out lan int1="eth0" # Clean interface tc qdisc del dev $int1 handle ffff: ingress tc qdisc del root dev $tin1 tc qdisc add dev $int1 handle ffff: ingress # Redirecto ingress eth0 to egress ifb0 tc filter add dev $int1 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $tin1 # Add classes per ip tc qdisc add dev $tin1 root handle 2: htb default 20 tc class add dev $tin1 parent 2: classid 2:1 htb rate 20480kbit tc class add dev $tin1 parent 2:1 classid 2:5 htb rate 80kbit ceil 20480kbit tc filter add dev $tin1 protocol ip parent 2: prio 1 u32 match ip src 192.168.1.5/32 flowid 2:15
但之前,加载这个模块在内核做:
modprobe ifb numifbs=1 ip link set dev $tin1 up