无分类qdisc使用例子
需求针对eth1网卡出口带宽限制为100Mbit
这个就可以用无分类qdisc来做
tc–s 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–s 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–s
在本机执行
Iperf–c 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 命令
原文地址:http://4249964.blog.51cto.com/4239964/1568582