Chinaunix首页 | 论坛 | 博客
  • 博客访问: 425586
  • 博文数量: 112
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1085
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-15 09:42
个人简介

上善若水,不浮不沉!

文章存档

2021年(2)

2020年(3)

2018年(2)

2017年(1)

2016年(8)

2015年(11)

2014年(57)

2013年(28)

我的朋友

分类: LINUX

2016-08-17 16:42:17

首先说明下,在写脚本时,记得要用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实现的下载和上传带宽限制的脚本

阅读(2017) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~