基于HTB(Hierarchical Token Bucket)队列的流量控制

发表于:2007-07-04来源:作者:点击数: 标签:
防止局域网中有人大量下载,用mrtg及时发现问题,然后用ntop查处时谁在干坏事,把他的ip地址的数据包放到限制的通道里。避免影响其他人正常访问 网络 。开两个通道一个正常通道,一个限制通道! 内网:eth0 外网:eth2 NAT共享上网 [color=red:841a5dcdf1]关

防止局域网中有人大量下载,用mrtg及时发现问题,然后用ntop查处时谁在干坏事,把他的ip地址的数据包放到限制的通道里。避免影响其他人正常访问网络。开两个通道一个正常通道,一个限制通道!
内网:eth0 
外网:eth2 
NAT共享上网

[color=red:841a5dcdf1]关于参数的说明[/color:841a5dcdf1] 
(1)rate: 是一个类保证得到的带宽值.如果有不只一个类,请保证所有子类总和是小于或等于父类. 
(2)ceil: ceil是一个类最大能得到的带宽值. 
(3)prio: 是优先权的设置,数值越大,优先权越小.如果是分配剩余带宽,就是数值小的会最优先取得剩余的空闲的带宽权. 
具体每个类要分配多少rate,要根据实际使用测试得出结果.一般大数据的话,控制在50%-80%左右吧,而ceil最大建议不超过85%,以免某一个会话占用过多的带宽.rate可按各类所需分配
[color=red:841a5dcdf1]限制下载[/color:841a5dcdf1]
tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit burst 15k 
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10Mbit burst 15k 
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 80Kbit ceil 80Kbit burst 15k 

/sbin/tc qdisc add dev eth0 parent 1:10 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth0 parent 1:20 sfq quantum 1514b perturb 15 

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.111.1.116 flowid 1:20

[color=red:841a5dcdf1]限制上传[/color:841a5dcdf1]
tc qdisc add dev eth2 root handle 2: htb default 30
tc class add dev eth2 parent 2: classid 2:1 htb rate 2Mbit burst 15k
tc class add dev eth2 parent 2:1 classid 2:10 htb rate 2Mbit burst 15k
tc class add dev eth2 parent 2:1 classid 2:20 htb rate 80Kbit ceil 80Kbit burst 15k

tc qdisc add dev eth2 parent 2:10  sfq quantum 1514b perturb 15 
tc qdisc add dev eth2 parent 2:20  sfq quantum 1514b perturb 15 

tc filter add dev eth2 protocol ip parent 2:0 prio 1 handle 6 fw flowid 2:20
iptables -t mangle -A PREROUTING -i eth0 -s 192.111.1.116 -j MARK --set-mark 6
iptables -t mangle -A PREROUTING -i eth0 -s 192.111.1.116 -j RETURN

注1:要想对不同队列(比如pfifo、SFQ、TBF、HTB、CBQ)的概念使用有所了解可以参考《Linux的高级路由和流量控制HOWTO》一本很不错的书
注2:我这里只是用HTB实现了单个主机限速的功能,非常简单。对于大型网络可以使用HTB对不同类型的数据包进行分流以达到合理利用有限的网络资源的目的,但是一定要注意实际带宽使用和分配的值,需要通过一定时间的总结。可以参考,cu里KindGeorge 的大作《用TC(Traffic Control)解决ADSL宽带速度技术(tc+iptables+HTB) 》

 KindGeorge 回复于:2005-03-12 12:25:51
[quote:e8d1f3eef4="hrcxf"]
tc qdisc add dev eth2 root handle 2: htb default 30
tc class add dev eth2 parent 2: classid 2:1 htb rate 2Mbit burst 15k
tc class add dev eth2 parent 2:1 classid 2:10 htb rate 2Mbit burst 15k
tc c..........[/quote:e8d1f3eef4]

留意一下:"tc qdisc add dev eth0 root handle 1: [color=blue:e8d1f3eef4]htb default 30 [/color:e8d1f3eef4]"
tc class add dev eth0 parent 1: classid 1:1 htb rate 10Mbit burst 15k 
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10Mbit burst 15k 
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 80Kbit ceil 80Kbit burst 15k 

上面default 30 在下面的通道中还没定义. &可以定义为10或20. 

另外还有一个值得留意的地方.因为本来局域网是通过100M网卡进行连接的高速网络,如果对内网网卡eth0进行控制了,例如你有两个网段,192.168.1.0,192.168.2.0.那么它们需要互相访问交换数据,通过网关的eth0时,也会受到默认设置htb default 速度的影响. 所以这个默认通道要选择得当.


"tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.111.1.116 flowid 1:20 " 中就是说:凡是访问目标为dst 192.111.1.116的都限制在80Kbit. 本来的想法是限制通过互联网疯狂下载的机器.但内网中其他网段的机器访问该机器时是否也受到限制了,要测试一下

 wingger 回复于:2005-03-12 13:38:38
不错,呵

[code:1:65bdaa2863]tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.111.1.116 flowid 1:20 [/code:1:65bdaa2863]

这个不需要用u32吧,一样也可以handle 6,整齐些吧

 wingger 回复于:2005-03-12 13:40:03
[quote:90d385f8ec="KindGeorge"]
"tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.111.1.116 flowid 1:20 " 中就是说:凡是访问目标为dst 192.111.1.116的都限制在80Kbit. 本来的想法是限制通过互联网疯狂下载的机器.但内网中其他网段的机器访问该机器时是否也受到限制了,要测试一下[/quote:90d385f8ec]

嗯。如果是多个网段,有可能,一个网段应该没有问题

 守夜人 回复于:2005-03-12 15:10:33
能实现一个分类将1000个用户都分成如100K/ser,而不是只能对一个IP或一个段,怎么做??

 wingger 回复于:2005-03-12 16:00:12
散列表或写个循环脚本应该可以解决

 KindGeorge 回复于:2005-03-12 17:26:48
个人建议针对每个ip的服务,即是端口来做限制,例如80,20,21等较好.

 wingger 回复于:2005-03-13 15:25:11
[quote:81a900eab3="守夜人"]能实现一个分类将1000个用户都分成如100K/ser,而不是只能对一个IP或一个段,怎么做??[/quote:81a900eab3]

用u32的match ip 不可以吗?或者iptables打个mark?

难道TC会自动计算一个网段的速率?

 hrcxf 回复于:2005-03-13 23:06:23
[quote:92da70ae93="wingger"]
"tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.111.1.116 flowid 1:20 " 中就是说:凡是访问目标为dst 192.111.1.116的都限制在80Kbit. 本来的想法是限制通过互联网疯狂下载的机器.但内网中其他网段的机器访问该机器时是否也受到限制了,要测试一下
[/quote:92da70ae93]
测试过了 不影响其他人的带宽使用

 wingger 回复于:2005-03-13 23:14:12
[quote:39c8885c73="hrcxf"]
测试过了 不影响其他人的带宽使用[/quote:39c8885c73]


[quote:39c8885c73]能实现一个分类将1000个用户都分成如100K/ser,而不是只能对一个IP或一个段,怎么做??[/quote:39c8885c73]

hrcxf兄,帮忙:

按理,用u32的match ip应该可以做到吧,我没有环境,你能不能测试一下

 KindGeorge 回复于:2005-03-15 09:10:22
hrcxf 兄,既然你有这个环境,帮忙测试考虑这种情况,把:"tc qdisc add dev eth0 root handle 1: htb default 10 " 
tc class add dev eth0 parent 1: classid 1:1 htb rate 10kbit burst 15k 
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10kbit burst 15k 
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 80Kbit ceil 80Kbit burst 15k 

上面default 10 在下面的通道中定义为很小的10K带宽, 那么看看网络是否有延时感觉出来.  因为假如你默认的是10M的带宽,这是比较高速的,很难感觉是否有影响. 内网互拷贝是否有慢的感觉. 假如测试是有慢的感觉出来后,就说明你设置的eth0的控制是对网络有影响的.如果我们的网络是100M的连接,你设置为10M,就浪费了点啦

 hrcxf 回复于:2005-03-16 10:17:42
[quote:7912123bab="wingger"]
能实现一个分类将1000个用户都分成如100K/ser,而不是只能对一个IP或一个段,怎么做??[/quote:7912123bab]

我能想到的只能写脚本实现。

原文转自:http://www.ltesting.net