基于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 qu
antum 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 re
alm 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