心想事成 发表于 2005-3-5 09:17:33

转帖:CUhttp://bbs.chinaunix.net/forum/viewtopic.php?t=505330考了cu的很多文档,沿着前辈的脚印,整理了一篇自己的配置记录。在实际使用过程中效果良好,局域网规模不是很大40多台机器。 内网:eth0 外网:eth2 NAT共享上网 CBQ是通过硬件的闲置时间来计算队列,硬件不同,效果也不同,对于比较大的网络使用HTB比较好。以下限制上传和下载的方法可以写成脚本,通过mrtg发现流量的异常情况,然后通过ntop查处是谁在干坏事,最后用写好的tc脚本限制他的流量,避免影响其他人的网络使用。 其基本使用步骤为: 1) 针对网络物理设备(如以太网卡eth0)绑定一个CBQ队列 2) 在该队列上建立分类 3) 为每一分类建立一个基于路由的过滤器 4) 最后与过滤器相配合,建立特定的路由表 限制下载 #将一个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限制下载带宽,就需要创建几个分类、队列、过滤器 限制上传 #将一个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 维护 主要包括对队列、分类、过滤器和路由的增添、修改和删除。 增添动作一般依照"队列->分类->过滤器->路由"的顺序进行;修改动作则没有什么要求;删除则依照"路由->过滤器->分类->队列"的顺序进行。 #简单显示指定设备的队列状况 /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

DreamCat 发表于 2005-3-19 19:14:21

似乎 HTB 更好些,可惜HTB文档一直没时间翻译完。。

ybbnew 发表于 2005-5-13 14:00:33

小心问一声,用TC做控制时,对于下行数据也想用iptables -t mangle 打标志的方法好像不行啊我的本意是想对客户端的每一个上行下行数据包进行打标志,然后用TC 做控制,但对于客户端的一个下行数据用iptables -t mangles打标志好像不行,我在IPTABLES 中好像无法判断用户的数据是下行的数据,老大帮忙啊。只所以全部想用IPTABLES打标志的方法来实现,是因为IPTABLES的规则可以保存,重起机器?原来的设定还在,但TC设了规则后(比如我在FILTER中定义了一个IP的规则)重起机器后就丢失了

cliex 发表于 2006-10-13 21:13:43

楼主辛苦了。
小弟刚开始接触iptables。以前都是用ros的。
在用TC做流量控制的时候有幸看到楼主的帖子。实在是给我帮了不少的忙。
不过在实际操作中。发现楼主的脚本中有几个问题。不知道能否有时间探讨一下。
第一:我用的是redhat linux 9.0 已经实现nat。用TC做脚本的时候。用楼主的这句话/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
执行后提示cell的设置是错的。我把cell 8 去掉后才可以执行。为什么?
第二:/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
这句话中prio 9,但是我的linux提示prio只能是1-8。不知道是不是版本问题。
第三:我把rate设置成10M的时候就没办法限制速度了。
请楼主赐教。不胜感激。
页: [1]
查看完整版本: 基于CBQ(Class Based Queueing)队列的流量控制