基于CBQ(Class Based Queueing)队列的流量控制

发表于:2007-07-04来源:作者:点击数: 标签:
参考了cu的很多文档,沿着前辈的脚印,整理了一篇自己的配置记录。在实际使用过程中效果良好,局域网规模不是很大40多台机器。 内网:eth0 外网:eth2 NAT共享上网 CBQ是通过硬件的闲置时间来计算队列,硬件不同,效果也不同,对于比较大的 网络 使用HTB比较

参考了cu的很多文档,沿着前辈的脚印,整理了一篇自己的配置记录。在实际使用过程中效果良好,局域网规模不是很大40多台机器。
内网:eth0
外网:eth2
NAT共享上网

CBQ是通过硬件的闲置时间来计算队列,硬件不同,效果也不同,对于比较大的网络使用HTB比较好。以下限制上传和下载的方法可以写成脚本,通过mrtg发现流量的异常情况,然后通过ntop查处是谁在干坏事,最后用写好的tc脚本限制他的流量,避免影响其他人的网络使用。

其基本使用步骤为: 
1) 针对网络物理设备(如以太网卡eth0)绑定一个CBQ队列
2) 在该队列上建立分类
3) 为每一分类建立一个基于路由的过滤器
4) 最后与过滤器相配合,建立特定的路由表

[color=red:7ae1fe0779]限制下载[/color:7ae1fe0779]
#将一个cbq队列绑定到网络物理设备eth0上,其编号为1:0;网络物理设备eth0的实际带宽为10Mbit,包的平均大小为1000字节;包间隔发送单元的大小为8字节,最小传输包大小为64字节。
/sbin/tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu 64

#创建根分类1:1;分配带宽为10Mbit,优先级别为1。该队列的最大可用带宽为10Mbit,实际分配的带宽为10Mbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为1,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为1Mbit。
/sbin/tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit maxburst 20 allot 1514 prio 1 avpkt 1000 cell 8 weight 1Mbit

#创建分类1:2,其父分类为1:1,分配带宽为64Kbit,优先级别为8。该队列的最大可用带宽为10Mbit,实际分配的带宽为64Kbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为8,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为100Kbit,且不可借用未使用带宽。
/sbin/tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 100Kbit bounded

#创建分类1:3,其父分类为1:1,分配带宽为64Kbit,优先级别为9。该队列的最大可用带宽为10Mbit,实际分配的带宽为64Kbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为9,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为100Kbit,且不可借用未使用带宽。
/sbin/tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 9 avpkt 1000 cell 8 weight 100Kbit bounded

#在分类底下,创建队列,使用sfq随即公平队列
/sbin/tc qdisc add dev eth0 parent 1:2 sfq quantum 1514b perturb 15
/sbin/tc qdisc add dev eth0 parent 1:3 sfq quantum 1514b perturb 15

#这句是限制内网从本服务器下载,这里不需要!!只作为参考!!
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip src 192.111.1.8 flowid 1:2

#限制各ip地址的下载带宽,使用u32过滤器,对目的地址进行分类,对应已经创建的队列
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.66 flowid 1:3

#需要添加新的被限制ip的下载带宽,需要先要创建新的分类(比如1:4),然后根据新的分类创建新的sfq队列,最后使用u32过滤器对目的地址进行带宽限制。
需要对几个ip限制下载带宽,就需要创建几个分类、队列、过滤器

[color=red:7ae1fe0779]限制上传[/color:7ae1fe0779]
#将一个cbq队列绑定到网络物理设备eth2上,其编号为2:0;网络物理设备eth2的实际带宽为2Mbit,包的平均大小为1000字节;包间隔发送单元的大小为8字节,最小传输包大小为64字节。
/sbin/tc qdisc add dev eth2 root handle 2: cbq bandwidth 2Mbit avpkt 1000 cell 8 mpu 64

#创建根分类2:1;分配带宽为2Mbit,优先级别为1。该队列的最大可用带宽为2Mbit,实际分配的带宽为2Mbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为1,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为200Kbit。
/sbin/tc class add dev eth2 parent 2:0 classid 2:1 cbq bandwidth 2Mbit rate 2Mbit maxburst 20 allot 1514 prio 1 avpkt 1000 cell 8 weight 200Kbit

#创建分类2:2,其父分类为2:1,分配带宽为64Kbit,优先级别为8。该队列的最大可用带宽为2Mbit,实际分配的带宽为64Kbit,可接收冲突的发送最长包数目为20字节;最大传输单元加MAC头的大小为1514字节,优先级别为8,包的平均大小为1000字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为100Kbit,且不可借用未使用带宽。
/sbin/tc class add dev eth2 parent 2:1 classid 2:2 cbq bandwidth 2Mbit rate 64Kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 200Kbit bounded

#在分类底下,创建队列,使用sfq随即公平队列
/sbin/tc qdisc add dev eth2 parent 2:2 sfq quantum 1514b perturb 15

#应用路由分类器到cbq队列的根,过滤协议为ip,优先级为100
/sbin/tc filter add dev eth2 parent 2:0 protocol ip prio 1 handle 2 fw classid 2:2

#给数据包打标签,可以通过RETURN方法避免遍历所有的规则,加快处理速度
/sbin/iptables –t mangle –A PREROUTING –i eth0 –s 192.111.1.xxx –j MARK --set-mark 2
/sbin/iptables –t mangle –A PREROUTING –i eth0 –s 192.111.1.xxx –j RETURN

#nat(参考)
/sbin/iptables -t nat -A POSTROUTING -s 192.111.1.0/24 -o eth2 -j SNAT --to 外网IP

#需要添加新的被限制ip的上传带宽,需要先要创建新的分类(比如2:3),然后根据新的分类创建新的sfq队列,最后使用路由过滤器,过滤协议为ip,给原地址是需要限制的ip地址来的数据包打标记。
需要对几个ip限制下载带宽,就需要创建几个分类、队列、路由过滤器、iptable的mangle表的PREROUTING链

另外还有其他的过滤器比如:
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 2 flowid 1:2
ip route add 192.111.1.24 dev eth0 via 192.111.1.4 realm 2

[color=red:7ae1fe0779]维护[/color:7ae1fe0779]
主要包括对队列、分类、过滤器和路由的增添、修改和删除。 
增添动作一般依照"队列->分类->过滤器->路由"的顺序进行;修改动作则没有什么要求;删除则依照"路由->过滤器->分类->队列"的顺序进行。
#简单显示指定设备的队列状况
/sbin/tc qdisc ls dev eth0

#详细显示指定设备的队列状况
/sbin/tc –s qdisc ls dev eth0

#简单显示指定设备的分类状况
/sbin/tc class ls dev eth0

#详细显示指定设备的分类状况
/sbin/tc –s class ls dev eth0

#显示过滤器的状况
/sbin/tc –s filter ls dev eth0

#队列的维护 
一般对于一台流量控制器来说,出厂时针对每个以太网卡均已配置好一个队列了,通常情况下对队列无需进行增添、修改和删除动作了。

#分类的维护 
增添 
增添动作通过tc class add命令实现。
修改 
修改动作通过tc class change命令实现,如下所示:
/sbin/tc class change dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 64Kbit maxburst 20 allot 1514 prio 8 avpkt 1000 cell 8 weight 100Kbit bounded
对于bounded命令应慎用,一旦添加后就进行修改,只可通过删除后再添加来实现。

#过滤器的维护
增添
增添动作通过tc filter add命令实现。
修改
修改动作通过tc filter change命令实现,如下所示:
/sbin/tc filter change dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2
删除
删除动作通过tc filter del命令实现,如下所示:
/sbin/tc filter del dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.111.1.116 flowid 1:2

 platinum 回复于:2005-03-04 19:02:40
如果每句都解释一下其工作原理,以及设计思路,那就更完美了

 Linux@初学者 回复于:2005-03-04 19:11:14
需要装其它软件不?

 JohnBull 回复于:2005-03-04 19:50:41
在Linux平台上,应尽量使用HTB取代CBQ。

 zmg522 回复于:2005-03-04 20:18:34
我网吧的 有100多太计算机  流量很大.....能带的起来吗 

网段是192.168.0.1-254     

是不是 每个分类  队列 和过滤器 都要建立253个......

是不是  这样 就有一个 很大的 链路表.........查询 会不会慢..

有没有  精简点语法.......一句 就能  限制192.168.0.0/24 下 所有ip

的上传 和下载

 JohnBull 回复于:2005-03-04 21:18:44
[quote:ebb9405ab6="zmg522"]我网吧的 有100多太计算机  流量很大.....能带的起来吗 

网段是192.168.0.1-254     

是不是 每个分类  队列 和过滤器 都要建立253个......

是不是  这样 就有一个 很大的 链路表.........查询 会不会慢..
..........[/quote:ebb9405ab6]

能带起来,把过滤规则放进hash表提速即可。

 zmg522 回复于:2005-03-04 21:32:30
那应该 怎么放进去.....


           我是在哪个rc.local 里面 直接写的 命令  可以吗  ?

 JohnBull 回复于:2005-03-04 22:10:59
[quote:cb24194795="zmg522"]那应该 怎么放进去.....


           我是在哪个rc.local 里面 直接写的 命令  可以吗  ?[/quote:cb24194795]

当然可以。

 emylekao 回复于:2005-03-05 12:48:42
楼主说参考了很多CU的文档,可以贴出来地址吗?我怎么都找不到啊。

 hrcxf 回复于:2005-03-06 01:16:56
[quote:f0663df3d6="zmg522"]我网吧的 有100多太计算机  流量很大.....能带的起来吗 

网段是192.168.0.1-254     

是不是 每个分类  队列 和过滤器 都要建立253个......

是不是  这样 就有一个 很大的 链路表.........查询 会不会慢..
..........[/quote:f0663df3d6]
tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip 
dst 168.192.1.0/24 flowid 1:3
使用u32过滤器可以使用上面的方法限制一个网段,如果想详细限制某些ip,那么只能多些几个分类和队列了!

 hrcxf 回复于:2005-03-06 01:20:48
[quote:fd0d7237f6="platinum"]如果每句都解释一下其工作原理,以及设计思路,那就更完美了[/quote:fd0d7237f6]
其实我的想法很简单,就是不管上传还是下载都建一个正常流量的类和一个限制流量的类,然后分别建立队列,把那些有问题的ip可以临时的放到限制流量的队列里,等到正常以后再把他放回到正常流量的队列里。

 守夜人 回复于:2005-03-08 13:57:11
大家好,我也想用TC来限流量(现在BT太利害),环境是有3000左右的点,并发高峰为600人同时上网,我现在的出口带宽为100M,我想将所有用户的带宽用一个分类全部设为固定的上行150K/ser,下行300K/ser,不知TC能不能带得起来,用CBQ是否合适??
 &     本人前段时间也做过TC的实验,但不是太理想(用的的是u32),好像不能做成一个分类带一个网段这么用,也就是楼上兄弟所说的一个分类针对一个网段(所有用户),如果不是以单个IP来做,限流就不能起做用......还有一个问题,限速后当用户下载达到限制后的带宽时,ping值直线上升最高能达到几千!!!
 & & 请大家继续讨论谈谈这方面的心得!!!!!!!!!!!

 守夜人 回复于:2005-03-08 16:15:53
顶啊大家!!!!!!!!!!!!!!!!!!

 守夜人 回复于:2005-03-08 19:34:15
.................

 bon 回复于:2005-03-10 01:19:56
我也关心这些问题,帮你顶!

 skylove 回复于:2005-03-10 01:54:09
[quote:d29251fbd3="守夜人"]大家好,我也想用TC来限流量(现在BT太利害),环境是有3000左右的点,并发高峰为600人同时上网,我现在的出口带宽为100M,我想将所有用户的带宽用一个分类全部设为固定的上行150K/ser,下行300K/ser,不知TC能不能带得起来,?.........[/quote:d29251fbd3]

换个思路,给包打mark如何?? 记得johnbull的录音上提到过...回去温习一下?

 zmg522 回复于:2005-03-10 02:21:00
应限速后当用户下载达到限制后的带宽时,ping值直线上升最高能达到几千!!! 
这个是肯定的...因为 当你给一个用户 分100k的时候..那么当这个用户.用bt或者是下载..软件..把这100k的带宽 站满了...那就他现在打网页肯定就会慢.ping 也会到上千....因为tc服务器 分给他的带宽最高到100k..在多的数据 就会丢掉.....造成超时.....并不是物理网络上的问题.. 

解决 这个问题....那就是 对没个用户 在做隧道...比如真对一个用户...
可以给这个用户的数据分成几个优先级.....提高tcp初始连接->igmp->...ftp

不过要是实现起来.......比较难....

就现在 来说 流量控制是到了 非做不可的地步了。....
因为随着...光纤的普及.....客户->服务器 的线路信号 非常好..别说BT了..就是你随便 点几下 下载速度 就到了700-800 10M的光纤实际的是 1m多 最高.....这样 内网有几个人 就可以把整个带宽站满了....

这样的情况...不管是网吧..还是企业 还是学校..都会出现...

想法 是有了...道理也懂.....但是我是个美术毕业的.计算机维修 到网络 都是自学.....研究linux 和TC 也是最近一个星期开始的,一直头大...但是还是在努力....来这里 还希望得到 众多高手的指点.....感激凌涕ing~~~~~~~`


能为我解惑者..如在世父母~~~

 hrcxf 回复于:2005-03-11 14:23:17
对于大的网络要对上下行作限制,个人还是觉得用HTB对不同类型的数据包进行分流比较合适
对网卡邦定HTB队列,然后为不同类型的数据包建立不同带宽的分类,用iptables的mangle表为不同类型的数据包打上mark,然后用tc的过滤器进行分流。可以参考cu的《用TC(Traffic Control)解决ADSL宽带速度技术(tc+iptables+HTB) 》文档

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