利用TC进行流量控制(Qos)
(2006-12-13) 姜道友
前言:
我看到网络上关于linux系统中的流量控制文章很多不实用,即使参考也不能很快编写流量控制规则,且有很多错误。之前我也写过一篇文章,被很多网站引用,为感谢对我的支持,我把一个实例编写出来,供大家参考和学习(绝对实用!,绝对精华!大家可以把网上其它人的文章和我的文章比较一下就知道了!)
需求:
目前公司专线带宽为4M,上下行对等,因近期内部人员使用P2P对网络造成较大影响,所以现在进行流量控制(大部人禁止使用P2P下载,但一些管理人员不能限制,无奈之下只有采取流量控制)。目的:即保证ERP系统的运行,又不影响其它用户的使用,换句话说,让他们没有感觉,同时达到了我们的目的。注:因为TC只能限制发送数据包,所以下载在内网卡上进行,而上传在外网卡上进行控制。
一、 下载设置
1、 规则 (eth0为内网卡,可以限制下载流量)
tc qdisc add dev eth0 root handle 2:0 htb default 30
tc class add dev eth0 parent 2:0 classid 2:1 htb rate 4Mbit burst 15k
tc class add dev eth0 parent 2:1 classid 2:10 htb rate 4Mbit burst 15k 最大流量4M
tc class add dev eth0 parent 2:1 classid 2:20 htb rate 2000kbit ceil 2Mbit burst 15k 最大流量2M
tc class add dev eth0 parent 2:1 classid 2:30 htb rate 1000kbit ceil 1000kbit burst 15k 最大流量1M
tc qdisc add dev eth0 parent 2:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 2:20 handle 20: sfq perturb 10
tc qdisc add dev eth0 parent 2:30 handle 30: sfq perturb 10
U32_1="tc filter add dev eth0 protocol ip parent 2:0 prio 1 u32"
$U32_1 match ip src 192.168.9.0/24 flowid 2:10 (192.168.9.0/24总公司ERP服务器所在网络)
使访问ERP服务器可用最大带宽4M,优先级为1
U32_2="tc filter add dev eth0 protocol ip parent 2:0 prio 2 u32"
$U32_2 match ip dst 192.168.1.172/32 flowid 2:20
$U32_2 match ip dst 192.168.1.82/32 flowid 2:20
$U32_2 match ip dst 192.168.1.200/32 flowid 2:20
以上3个IP为总经办人员,限制他们下载流量为2M,优先级为2
tc filter add dev eth0 protocol ip parent 2:0 prio 3 u32 match ip dst 192.168.1.0/24 flowid 2:30 (因为有默认,此行可以省略,为了规则更清晰,还是设置为好)
以上只是设置默认情况下下载带宽只有1000K,即将近1M. 优先级为3
2、 注意事项:
优先级不要相同
二、 上传设置
1、 规则 (eth1为连接专线的网卡,可限制上传带宽)
iptables -F -t mangle
iptables -X -t mangle
iptables -Z -t mangle
iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.200/32 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.172/32 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.82/32 -j MARK --set-mark 1
#iptables -A PREROUTING -t mangle -i eth0 -s 192.168.1.0/24 -j MARK --set-mark 2 (可以不用此条)
tc qdisc add dev eth1 root handle 1:0 htb default 30
tc class add dev eth1 parent 1:0 classid 1:1 htb rate 4Mbit burst 15k
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 4Mbit burst 15k 最大上传流量为4M
tc class add dev eth1 parent 1:1 classid 1:20 htb rate 1000kbit ceil 2Mbit burst 15k 最大流量为2M
tc class add dev eth1 parent 1:1 classid 1:30 htb rate 400kbit ceil 400kbit burst 15k 最大流量为400K
tc qdisc add dev eth1 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth1 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev eth1 parent 1:30 handle 30: sfq perturb 10
U32="tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32"
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.9.0/24 flowid 1:10
以上规则使用达到ERP服务器的流量不受限制,也即最大可为4M
tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 1 fw classid 1:20
以上规则使总经办3个IP地址的上传流量为2M
#tc filter add dev eth1 parent 1:0 protocol ip prio 4 handle 2 fw classid 1:30 (因为默认下使用此规则,所以可以省略)
默认下不符合以上两规则的全部使用此规则,上传带宽最大为400K(不要说我苛刻哟)
2、 注意事项
1) 因为内部IP地址在经过外网卡时会进行NAT,所以不能用源地址进行U32匹配,只能是FW规则进行流量标识
2) 优先级一定不能相同,否则fw规则将失效
3) 以上规则可以放到一个文件内运行
原帖由 iamshiyu 于 2007-6-29 09:59 发表于 5楼
询问一下各位大大,比如
tc filter add dev eth0 protocol ip parent 2:0 prio 3 u32 match ip dst 192.168.1.0/24 flowid 2:30
这样的规则,其结果是1.0整个网段的流量最大值被限制还是说每个该网段内的ip流 ...
原帖由 liuzhuan23 于 2007-6-29 22:52 发表于 8楼
如果你用htb,你的这些分类id会互相借用带宽
classid 2:10,classid 2:20,classid 2:30 这3者会互相借用
classid 1:10,classid 1:20,classid 1:30 这3者会互相借用
所以,你的rate可能不会达到你预期 ...
原帖由 zhou_rock 于 2007-6-30 01:26 发表于 10楼
在指定ceil下才可能生效
原帖由 platinum 于 2007-6-30 00:40 发表于 9楼
这个借用是什么时候都生效吗?还是只在特殊条件下才互相借用?
原帖由 platinum 于 2007-6-30 11:20 发表于 13楼
liuzhuan 兄分析得很好,但是我发现借用的一个特点(包括 prio 也是)
只有在带宽不够用的情况下才能生效,也就是实际速率如果跑的话可以高于 ceil 值
否则借用不了,这是我做过实验以后的结论,不知大家有没 ...
原帖由 liuzhuan23 于 2007-7-1 04:18 发表于 16楼
to platinum兄:
1。我的前一个结论是错误的,子类之间是不会互相借用带宽的,呵呵,非常不好意思
2。借用主要还是父类给子类来分配带宽,ceil-rate=可借用带宽
3。举例如下:
tc class add dev im ...
原帖由 liuzhuan23 于 2007-7-1 04:18 发表于 16楼
to platinum兄:
classid 1:10 rate 50kbps ceil 70kbps,保证带宽50k,可借用带宽20k,在保证rate的情况下,classid 1:10可以向父类再借用20k
原帖由 platinum 于 2007-7-1 23:09 发表于 18楼
真的可以保证吗?我测试怎么不行呢?
原帖由 wysilly 于 2007-7-2 09:23 发表于 21楼
好文.
我想prio决定优先权,优先权高当然优选占用ceil带宽了,这样来保证http访问的质量.
原帖由 wysilly 于 2007-7-2 10:59 发表于 24楼
对的.lartc文档上明确指出这一点.
原帖由 platinum 于 2007-6-30 12:59 发表于 15楼
liuzhuan 兄做测试的时候还有没有注意到,能达到的最大带宽要远高于 ceil 值才有效
例如,一个 ISP 的带宽限制为 2Mbps,若设置的 ceil 值设置成 2Mbps,甚至 1.8Mbps 也未必奏效
因为数据传输是双向的,我们 ...
原帖由 platinum 于 2007-7-2 11:22 发表于 27楼
这是分类的 prio,过滤器也有一个 prio,这个 prio 又是什么意思呢?
原帖由 iamshiyu 于 2007-7-2 11:25 发表于 28楼
请教各位,假设isp设置带宽为4M,我中间一个桥式防火,一个nat,若干服务器,想要给其中的两台服务设最小带宽为2M,nat最大带宽为2M,按照你的说法,即便在nat上设置了一次发出限制,一次下载限制,再到桥式防 ...
原帖由 wysilly 于 2007-7-2 11:52 发表于 31楼
测试环境和规则.
一起看看不就知道了.
原帖由 platinum 于 2007-7-2 12:07 发表于 32楼
测试环境和规则前面都说过了,看了半天也没弄明白要知道什么,没有你说的那么简单
假设一条 2Mbps 的线路,你保障某个应用 1.5Mbps 带宽,而外来主推流量多达 1Mbps(可视为无效流量)
试问:那个你要保障的 ...
原帖由 wysilly 于 2007-7-2 12:44 发表于 33楼
呵呵,你想的太多了.
如果规则定义就是为了区分上行和下行两部分.那么到了最后最严格的方法就是对每ip定义规则了,否则没有两全的解决途径了.
原帖由 platinum 于 2007-7-2 13:08 发表于 34楼
不,你错了,我想的并不多,这是网络里一个很普遍的现象
当你使用 P2P 软件时,会招惹来外网流量的主动推送,从而堵塞你的 ISP 链路
原帖由 iamshiyu 于 2007-7-3 10:46 发表于 40楼
按照lartc里的介绍:
然而,Internet主要依靠TCP/IP,它的一些特性很有用。因为TCP/IP没办法知道两个主机之间的网络容量,所以它会试图越来越快地发送数据(所谓的“慢起技术”) ,当因为网络容量不够而开始丢 ...
platinum 发表于 2007-07-03 10:59
tc 利用的是队列技术,队列满了以后会造成 TCP 丢包,根据 TCP 协议的机制,会自动重传,因为会导致大量无用废数据的产生
若最好的控制 TCP,应该控制滑动窗口,让发送端自动降低发送速度
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |