分类: LINUX
2010-03-11 21:05:48
首先说明下,在写脚本时,记得要用vi写,其它的文本编辑器不要用,因为会出来许多不知名的字符。
个人认为在vi中输入(:set nu)显示行号,更加适合编辑。
如果eth1网卡上用来上外网,eth2是用来作内网共享上网。tc只能控制发送的数据量所以要写下载的话,只能写在eth2网卡上。
一,先记得清空eth2旧有队列,再作根队列进行绑定这个网卡
tc qdisc del dev eth2 root
tc qdisc add dev eth2 root handle 2: htb default 20
注:这里有一个默认就是选择2:20
二,作根类
tc class add dev eth2 parent 2:0 classid 2:1 htb rate 100kbit
这里也作了根类的限速,所以共享所能拥有的网速100k。这里的k可不是我们平时用的k,100kbit大概只能提供12k的下载速度,也就是如同我们拉了一根10M的光纤,实际下载的速度只有1.2M。这个关系也就是除个8这样。
注:htb是Hierarchy Token Bucket的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。HTB可以通过TBF(Token Bucket Filter)令牌桶过滤器实现带宽限制,也能够划分类别的优先级。
三,作子类
tc class add dev eth2 parent 2:1 classid 2:50 htb rate 50kbit ceil 50kbit
tc class add dev eth2 parent 2:1 classid 2:100 htb rate 100kbit ceil 100kbit
tc class add dev eth2 parent 2:1 classid 2:20 htb rate 20kbit ceil 20kbit
这三个子类,都进行了限速而且不能借速,如果rate 128kbit ceil 384kbit 速率是128kbit,最高是384kbit,也就是它能借用(384-128)kbit ,但是这里有一点ceil的值最高可不能大于根类的大小。
四,作队列
tc qdisc add dev eth2 parent 2:50 handle 50: sfq perturb 10
tc qdisc add dev eth2 parent 2:100 handle 100: sfq perturb 10
tc qdisc add dev eth2 parent 2:20 handle 20: sfq perturb 10
这里的sfq perturb 10还可能是以下的几种形式:
第一种:[p|b]fifo先进先出只有一个参数:limit. pfifo是以数据包的个数为单位;bfifo是以字节数为单位。如:pfifo limit 2
第二种:red是Random Early Detection(随机早期探测)的简写。如果使用这种QDISC,当带宽的占用接近于规定的带宽时,系统会随机地丢弃一些数据包。它非常适合高带宽应用。
第三种:sfq是Stochastic Fairness Queueing(随机公平队列)的简写。是公平队列算法家族中的一个简单实现.它的精确性不如其它的方法,但是它在实现高度公平的同时,需要的计算量却很少。只有当你的出口网卡确实已经挤满了的时候,SFQ才会起作用,SFQ会频繁地改变散列算法,这也是公平的一个方面。sfq的perturb参数指多少秒后重新配置一次散列算法.如果取消设置,散列算法将永远不会重新配置(不建议这样做).10秒应该是一个合适的值:如tc qdisc add dev eth0 parent 2:10 handle 10: sfq perturb 10
第四种:tbf是Token Bucket Filter(令牌桶过滤器)的简写,适合于把流速降低到某个值。这个参数参考tc命令及参数
五,过滤器
tc filter add dev eth2 protocol ip parent 2:0 prio 1 u32 match ip dst 192.168.1.50/32 flowid 2:50
tc filter add dev eth2 protocol ip parent 2:0 prio 1 u32 match ip dst 192.168.1.100/32 flowid 2:100
tc filter add dev eth2 protocol ip parent 2:0 prio 3 u32 match ip dst 192.168.1.0/24 flowid 2:20
这里用u32的过滤器
还有一种是fw形式的过滤器,fw的写法
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
另个还得在iptables 作fw标志。
一般出外网时才会用fw规则,因为内部IP地址在经过外网卡时会进行NAT,所以不能用源地址进行U32匹配,只能是FW规则进行流量标识。
iptables -A PREROUTING -t mangle -i eth2 -s 192.168.1.200/32 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i eth2 -s 192.168.1.172/32 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i eth2 -s 192.168.1.82/32 -j MARK --set-mark 1
tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 1 fw classid 1:20
iptables mark后的值也就是tc fw前的值
但是prio优先级一定不能相同,否则fw规则将失效
因为我没有做上传限速,所以没有用到fw.
这里有没有看到ip的形式是192.168.1.82/32 和192.168.1.0/24。前者表示192.168.1.82这样一个ip,后者却是表示192.168.1这样的一个整个c段的网络地址。
这里的ip不能写成192.168.1.25-82(想表示的意思是从192.168.1.25到192.168.1.82这里的所有ip)。我用了很多的方法,都做不到。如果要这样做的话,我只能用shell里做一个循环。
IPS=2#起始
IPE=253#结束
COUNTER=$IPS
while [ $COUNTER -le $IPE ]
do
语句 $COUNTER
COUNTER=` expr $COUNTER + 1 `
done
还有规则是提到的ip的电脑一起共用所设带宽
参考资料:
linux下TC(traffic contrl)命令的介绍和用法
linux下tc简介(转)
TC(HTB)+iptables作流量控制
使用TC实现基于linux的流量管理
用linux做nat服务,用tc限制流量
一个用tc iptables实现的下载和上传带宽限制的脚本