先说需求:对于SDN的路由器,需要有一个总的带宽限制,同时,某些客户可能会需要,限制某一个FLOATING IP的带宽
发现使用tbf在软件ROUTER中是一种非常不准的模式,htb是比较简单的模式,cbq是一种很复杂的模式,参数非常地多,这一点很多文章都介绍过了。
另外一点,tc以及cgroup等kernel中实现QOS的东西,很重要的一个概念是quality of service,即:服务质量保障,也就是说,保障和限制是相辅相乘的。
几种实现方式:
#####HTB实现的两种类别分别限制最高速度
totalbandwidth=1000mbit
bandwidth=100mbit
ipbandwidth=30mbit
oipaddr=192.168.210.159
iipaddr=10.0.0.36
interface=qg-0ae2fc37-96
./wrap /sbin/tc qdisc del dev $interface root
./wrap /sbin/tc qdisc add dev $interface root handle 1: htb default 10
./wrap /sbin/tc class add dev $interface parent 1: classid 1:1 htb rate $bandwidth ceil $bandwidth
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:10 htb rate $bandwidth ceil $bandwidth
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:20 htb rate $ipbandwidth ceil $ipbandwidth
./wrap /sbin/tc qdisc add dev $interface parent 1:10 sfq perturb 10
./wrap /sbin/tc qdisc add dev $interface parent 1:20 sfq perturb 10
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip dst $oipaddr classid 1:20
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip src $oipaddr classid 1:20
interface=qr-8994d48e-8c
./wrap /sbin/tc qdisc del dev $interface root
./wrap /sbin/tc qdisc add dev $interface root handle 1: htb default 10
./wrap /sbin/tc class add dev $interface parent 1: classid 1:1 htb rate $bandwidth ceil $bandwidth
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:10 htb rate $bandwidth ceil $bandwidth
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:20 htb rate $ipbandwidth ceil $ipbandwidth
./wrap /sbin/tc qdisc add dev $interface parent 1:10 sfq perturb 10
./wrap /sbin/tc qdisc add dev $interface parent 1:20 sfq perturb 10
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip dst $iipaddr classid 1:20
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip src $iipaddr classid 1:20
./wrap /sbin/tc -s qdisc ls dev $interface
./wrap /sbin/tc -s class ls dev $interface
./wrap /sbin/tc -s filter ls dev $interface
#####cbq实现的两种规则分别限制最高速度
totalbandwidth=1000Mbit
bandwidth=100Mbit
ipbandwidth=30Mbit
oipaddr=192.168.210.159
iipaddr=10.0.0.36
interface=qg-0ae2fc37-96
./wrap /sbin/tc qdisc del dev $interface root
./wrap /sbin/tc qdisc add dev $interface root handle 1: cbq bandwidth $totalbandwidth allot 1514 cell 8 avpkt 1000
./wrap /sbin/tc class add dev $interface parent 1:0 classid 1:1 cbq bandwidth $totalbandwidth rate $bandwidth weight 1Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:3 cbq bandwidth $totalbandwidth rate $bandwidth weight 1Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 borrow
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:4 cbq bandwidth $totalbandwidth rate $ipbandwidth weight 1Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
./wrap /sbin/tc qdisc add dev $interface parent 1:3 handle 30: sfq
./wrap /sbin/tc qdisc add dev $interface parent 1:4 handle 40: sfq
./wrap /sbin/tc filter add dev $interface parent 1:0 protocol ip prio 1 u32 match ip dst 192.168.210.159 flowid 1:4
./wrap /sbin/tc filter add dev $interface parent 1:0 protocol ip prio 1 u32 match ip src 192.168.210.159 flowid 1:4
./wrap /sbin/tc filter add dev $interface parent 1:0 protocol ip prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:3
./wrap /sbin/tc filter add dev $interface parent 1:0 protocol ip prio 1 u32 match ip src 0.0.0.0/0 flowid 1:3
interface=qr-8994d48e-8c
./wrap /sbin/tc qdisc del dev $interface root
./wrap /sbin/tc qdisc add dev $interface root handle 1: cbq bandwidth $totalbandwidth allot 1514 cell 8 avpkt 1000
./wrap /sbin/tc class add dev $interface parent 1:0 classid 1:1 cbq bandwidth $totalbandwidth rate $bandwidth weight 1Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:3 cbq bandwidth $totalbandwidth rate $bandwidth weight 1Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 borrow
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:4 cbq bandwidth $totalbandwidth rate $ipbandwidth weight 1Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
./wrap /sbin/tc qdisc add dev $interface parent 1:3 handle 30: sfq
./wrap /sbin/tc qdisc add dev $interface parent 1:4 handle 40: sfq
./wrap /sbin/tc filter add dev $interface parent 1:0 protocol ip prio 1 u32 match ip dst 10.0.0.36 flowid 1:4
./wrap /sbin/tc filter add dev $interface parent 1:0 protocol ip prio 1 u32 match ip src 10.0.0.36 flowid 1:4
./wrap /sbin/tc filter add dev $interface parent 1:0 protocol ip prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:3
./wrap /sbin/tc filter add dev $interface parent 1:0 protocol ip prio 1 u32 match ip src 0.0.0.0/0 flowid 1:3
./wrap /sbin/tc -s qdisc ls dev $interface
./wrap /sbin/tc -s class ls dev $interface
./wrap /sbin/tc -s filter ls dev $interface
#####htb实现的在总带宽下面,限制(保证)指定IP的带宽,然后剩余的共享剩余的带宽
totalbandwidth=1000mbit
bandwidth=100mbit
ipbandwidth=30mbit
oipaddr=192.168.210.159
iipaddr=10.0.0.36
interface=qg-0ae2fc37-96
./wrap /sbin/tc qdisc del dev $interface root
./wrap /sbin/tc qdisc add dev $interface root handle 1: htb default 10
./wrap /sbin/tc class add dev $interface parent 1: classid 1:1 htb rate $bandwidth burst 15k
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:10 htb rate 1kbit ceil $bandwidth burst 15k
./wrap /sbin/tc qdisc add dev $interface parent 1:10 sfq perturb 10
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:20 htb rate $ipbandwidth burst 15k
./wrap /sbin/tc qdisc add dev $interface parent 1:20 sfq perturb 10
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip dst $oipaddr classid 1:20
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip src $oipaddr classid 1:20
interface=qr-8994d48e-8c
./wrap /sbin/tc qdisc del dev $interface root
./wrap /sbin/tc qdisc add dev $interface root handle 1: htb default 10
./wrap /sbin/tc class add dev $interface parent 1: classid 1:1 htb rate $bandwidth burst 15k
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:10 htb rate 1kbit ceil $bandwidth burst 15k
./wrap /sbin/tc qdisc add dev $interface parent 1:10 sfq perturb 10
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:20 htb rate $ipbandwidth burst 15k
./wrap /sbin/tc qdisc add dev $interface parent 1:20 sfq perturb 10
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip dst $iipaddr classid 1:20
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip src $iipaddr classid 1:20
./wrap /sbin/tc -s qdisc ls dev $interface
./wrap /sbin/tc -s class ls dev $interface
./wrap /sbin/tc -s filter ls dev $interface
#####htb实现的在总带宽下面,限制(保证)指定IP的带宽,其余的共享剩余的带宽
#####本来想实现设置其余的优先级更高,所以即使指定IP的带宽达到了总带宽也不影响其余的IP,但是filter匹配和分配的优先级是共用的,所以注释掉的两行代码会让指定IP被匹配进去,就实现不了指定IP带宽限制了,失败!
totalbandwidth=1000mbit
bandwidth=100mbit
ipbandwidth=100mbit
oipaddr=192.168.210.159
iipaddr=10.0.0.36
interface=qg-0ae2fc37-96
./wrap /sbin/tc qdisc del dev $interface root
./wrap /sbin/tc qdisc add dev $interface root handle 1: htb default 10
./wrap /sbin/tc class add dev $interface parent 1: classid 1:1 htb rate $bandwidth burst 15k
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:10 htb rate 1kbit ceil $bandwidth burst 15k
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:20 htb rate $ipbandwidth burst 15k
./wrap /sbin/tc qdisc add dev $interface parent 1:10 sfq perturb 10
#./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 1 u32 match ip dst 0.0.0.0/0 classid 1:10
#./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 1 u32 match ip src 0.0.0.0/0 classid 1:10
./wrap /sbin/tc qdisc add dev $interface parent 1:20 sfq perturb 10
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip dst $oipaddr classid 1:20
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip src $oipaddr classid 1:20
interface=qr-8994d48e-8c
./wrap /sbin/tc qdisc del dev $interface root
./wrap /sbin/tc qdisc add dev $interface root handle 1: htb default 10
./wrap /sbin/tc class add dev $interface parent 1: classid 1:1 htb rate $bandwidth burst 15k
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:10 htb rate 1kbit ceil $bandwidth burst 15k
./wrap /sbin/tc class add dev $interface parent 1:1 classid 1:20 htb rate $ipbandwidth burst 15k
./wrap /sbin/tc qdisc add dev $interface parent 1:20 sfq perturb 10
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip dst $iipaddr classid 1:20
./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 50 u32 match ip src $iipaddr classid 1:20
./wrap /sbin/tc qdisc add dev $interface parent 1:10 sfq perturb 10
#./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 1 u32 match ip dst 0.0.0.0/0 classid 1:10
#./wrap /sbin/tc filter add dev $interface protocol ip parent 1: prio 1 u32 match ip src 0.0.0.0/0 classid 1:10
./wrap /sbin/tc -s qdisc ls dev $interface
./wrap /sbin/tc -s class ls dev $interface
./wrap /sbin/tc -s filter ls dev $interface
参考:http://dog250.blog.51cto.com/2466061/1568267