无分类qdisc使用例子
需求针对eth1网卡出口带宽限制为100Mbit
这个就可以用无分类qdisc来做
tc�Cs qdisc ls dev eth1
tc qdisc add dev eth1 root tbf rate200kbit latency 50ms burst 1540
带宽限制为200kbit,延迟为50ms,缓冲区为1540个字节
多用于很简单的规则限制
主要说一下有分类的qidsc例子
一.假如我想针本机eth1出口流量,对目标ip为10.1.1.1做流量的限制
1.tc�Cs qdisc ls dev eth1
2.tcqdisc del dev eth1 root
3.tcqdisc add dev eth1 root handle 1: htb
4.tcclass add dev eth1 parent 1:0 classid 1:1 htb rate 1000Mbit ceil 1000Mbit
5.tcclass add dev eth1 parent 1:1 classid 1:10 htb rate 500Mbit ceil 5Mbit
5.tcfilter add dev eth1 parent 1: protocol ip prio 1 u32 match ip dst 10.1.1.1/32 flowid 1:10
说到ceil,就要说到令牌的概念了,tc里面个人理解令牌就是如果定义的带宽不够用了,比如上面的规则,如果到达目标ip为10.1.1.1的本机eth1出口流量已经超过500Mbit,因为是htb规则它会去向父类为1:1去借带宽,这个借的带宽就叫做令牌,ceil是限制如果超过带宽限制,只允许向父类去借5Mbit的带宽
测试
在10.1.1.1上面执行
Iperf�Cs
在本机执行
Iperf�Cc 10.1.1.1结果
[ 3] local 10.13.144.228 port 22988 connectedwith 10.13.144.229 port 5001
[ ID]Interval Transfer Bandwidth
[ 3] 0.0-10.3 sec 6.65 MBytes 5.40 Mbits/sec
最大带宽为5Mbit
二.比如说我想针对本机的80端口和22端口进行出口流量限制,其中80端口限制为500Mbit,22端口限制为400Mbit
tc qdisc add dev eth1 root handle 1: htb
tc class add deveth1 parent 1: classid 1:1 htb rate 1000Mbit
tc class add dev eth1 parent 1:1 classid 1:2 htb rate 500Mbitceil 600Mbit prio 1
tc class add deveth1 parent 1:1 classid 1:3 htb rate 400Mbit ceil 500Mbit prio 0
tc filter add deveth1 parent 1:0 prio 1 protocol ip handle 5 fw flowid 1:2
tc filter add deveth1 parent 1:0 prio 0 protocol ip handle 6 fw flowid 1:3
iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK--set-mark 5
iptables -A OUTPUT-t mangle -p tcp --sport 22 -j MARK --set-mark 6
这上面涉及到了标记的概念,tc可以喝ipatbles和cgroup联合使用
也就是说iptables给由本机产生的端口80和22打了个标记分别为5和6
在tc的filter中应用到iptables的标记数,这就是iptables+tc的联合使用
三.比如说我想针对本机的多个进程对出口流量进行限制
tc qdisc add dev eth1 root handle 1: htb
tc class add deveth1 parent 1: classid 1:1 htb rate 1000Mbit
tc class add dev eth1 parent 1:1 classid 1:2 htb rate 500Mbitceil 600Mbit prio 1
tc class add deveth1 parent 1:1 classid 1:3 htb rate 400Mbit ceil 500Mbit prio 0
tc filter add dev eth1 parent 1:0 prio 1 protocol ip handle1:2 cgroup
从上面我们可以看到filter里面调用class的时候写的是handle,而不是之前的flowid,在filter里,有几种分为u32,和iptables合用的规则,和cgroup合用的规则,这3种的语法是不一样的,如果用cgroup标签,把handle改成flowid就会报错
mount -t cgroup net_cls -o net_cls /cgroup/net_cls/
vim /cgroup/net_cls/tasks
,把进程号加到这个文件里
四.如果要限制那条具体的命令
tc qdisc add dev eth1 root handle 1: htb
tc class add deveth1 parent 1: classid 1:1 htb rate 1000Mbit
tc class add dev eth1 parent 1:1 classid 1:2 htb rate 500Mbitceil 600Mbit prio 1
tc class add deveth1 parent 1:1 classid 1:3 htb rate 400Mbit ceil 500Mbit prio 0
tc filter add dev eth1 parent 1:0 prio 1 protocol ip handle1:2 cgroup
mount -t cgroup net_cls -o net_cls /cgroup/net_cls/
cgexec -gnet_cls:group 命令