tc (traffic control)是linux下的流控工具,功能很强,但是文档不好理解

参考:

https://segmentfault.com/a/1190000000666869

http://www.cnblogs.com/endsock/archive/2011/12/09/2281519.html


简单地说tc对出口的包根据一定规则分类,然后利用排序规则进行排序(进来的包没办法控制,所以结合iptables的时候规则一般是-d dst)


tc:

qdisc(queueing discipline)排队规则

无类:p|bfifo(基于包|字节先进先出排序)、red、sfq、tbf等

有类:CBQ、htb等

class:类,类组成树,每个类可以有自己的排队规则

filter:过滤器,用来分辨该传递给哪个类


原理什么的参考上面两个链接和它们的附属链接的内容,下面讲讲实际操作:


tc qdisc del dev eth0 root//清空原有的规则,具体可以利用tc qdisc list查看


tc qdisc add dev eth0 root handle 1: htb default 7//定义根队列规则,并指定一个handle句柄1:htb表示排队规则,default表示如果包没有明确指定属于哪个类,就默认分配给子类7  


tc class  add dev eth0 parent 1: classid 1:1 htb rate 10Mbps ceil 10Mbps//创建一个主干类,parent 1:就是刚才的handle 1: 也可以写成1:0,它与1:是等价的 classid格式第一个是父类的id,第二个就是子类自己的id ,子类还可以有自己的子类,比如子类1:2想要创建自己的子类那么它可以使用tc class  add dev eth0 parent 1:1 classid 1:23 htb rate 10Mbps ceil 10Mbps, parent 1:1表明它是1:1的子类,classid中的1表示它属于我们上面创建的root handle 1: ,23是它自身的类别标识符。  rate表示保证带宽,所谓的保证带宽意思是低于设定值的带宽不予外借。  ceil表示真实带宽,意为最多能使用这么多带宽。


tc class add dev eth0 parent 1:1 classid 1:5 htb rate 512kbps ceil 512kbps prio 0//添加叶子类,prio表示优先级,数字越小优先级越高所有叶分类的全部子类优先级低于主干类,以防止重要数据堵塞,主要还是避免逻辑混乱


tc class add dev eth0 parent 1:1 classid 1:7 htb rate 2Mbps ceil 2Mbps prio 0


tc qdisc add dev eth0 parent 1:5 handle 15 sfq perturb 10//设置子类的排队规则,1:5就是子类的classid, handle跟主干类handle一样开辟一段空间给排队规则用,sfq是stochastic fairness queueing的简写,意为随机公平队列算法,它会按照会话为流量进行排序,然后循环发送每个会话的数据包,perturb 10 表示多少秒后重新配置一次散列算法,这是因为sfq并不是真正意义上的随机公平算法,所以必须经常改变算法来保证公平性


tc qdisc add dev eth0 parent 1:7 handle 17 sfq perturb 10


tc filter add dev eth0 parent 1: protocol  ip prio 8 handle 10 fw classid 1:5//设置过滤器,对应之前的父类和子类,protocol ip 表示根据ip进行分类,fw是firewall的简写表示ip是从firewall那边来的,也有u32 match ip等写法,具体看文档。这条命令的大意是:从防火墙匹配到的某些ip归属到1:5这个类。 


tc filter add dev eth0 parent 1: protocol  ip prio 9 handle 11 fw classid 1:7



iptables  -t  mangle -A POSTROUTING -d 192.168.2.106  -j MARK --set-mark 10//tc和iptables的结合是根据mangle表的mark标志来的,mark标识为filter的handle号,表示数据交给这个fliter处理


iptables  -t  mangle -A POSTROUTING -m set --match-set  passip dst -j MARK --set-mark 10//这个是ipset+tc+iptables,ipset是iptables里面很有用的一个模块,能大大提高效率,ipset必须事先建立才能用。命令:ipset create passip hash:net maxelem 10000