tc是英文traffic control的简称,即流量控制,主要用于控制网卡流量,包括流量限速、流量整形等。
tc命令可以轻松的实现基于单个ip限速的功能,但如果要实现基于ip组(如192.168.0.10-192.168.0.20)的限速,需要结合iptables命令。因为tc没有匹配ip range模块,而iptables支持匹配ip range。二者可以通过mark来标记数据报文。
通过iptables在POSTROUTING链打规则匹配ip组,并根据组id给数据包打mark,tc规则匹配mark进行分类。由于tc规则匹配是在发送数据包位置,所以tc可以识别iptables标记。
iptables命令需要依赖iprange模块,注意检查内核模块是否已经选上。
命令
#下行数据包匹配
iptables -t mangle -A POSTROUTING -m iprange --dst-range 192.168.0.2-192.168.0.200 -j MARK --or-mark 0x1
#上行数据包匹配
iptables -t mangle -A POSTROUTING -m iprange --src-range 192.168.0.2-192.168.0.200 -j MARK --or-mark 0x1
–dst-range 为目的地址段,即下行数据报文匹配,出口为lan接口
–src-range 为源地址段,即上行数据报文匹配,出口为wan接口
–or-mark 用于以或的关系设置mark,因为mark可能提前被提前设置过,如之前的mark为0x0100,通过–or-mark设置0x1后mark为0x0101,不会影响之前设置的mark,注意匹配是用掩码按位匹配。
举个例子:
0x0100 --or-mark(0x1) = 0x0101
0x0100 --or-mark(0x2) = 0x0102
而如果是–set-mark,会清楚之前的mark
0x0100 --set-mark(0x1) = 0x0001
0x0100 --set-mark(0x2) = 0x0002
上行接口为eth1(wan口物理接口,如果是pppoe拨号也适用,因为ppp虚接口最终要走eth接口发包出去)
下行接口为br-lan,lan侧可能有无线接口eth0、无线接口wlan0等,所以这里规则设置在br-lan接口
#设置根队列,默认走999队列
tc qdisc add dev br-lan root handle 1:0 htb default 999
#1号队列带宽设置为2Mbps
tc class add dev br-lan parent 1:0 classid 1:1 htb rate 2Mbit ceil 2Mbit
#999号队列带宽设置为100Mbps
tc class add dev br-lan parent 1:0 classid 1:999 htb rate 100Mbit ceil 100Mbit
#tc数据包匹配,handle用于匹配iptables设置的mark,注意要设置fw,fw标记匹配的是mark字段
#0x/0xff 表示只匹配低8位的mark值,如mark为0x0101,那么0x0101/0xff == 0x01,正好匹配规则。
tc filter add dev br-lan parent 1:0 prio 10 handle 0x1/0xff fw classid 1:1
注意把接口修改为自己系统的lan、wan接口
iptables -t mangle -F POSTROUTING
iptables -t mangle -A POSTROUTING -m iprange --dst-range 192.168.0.2-192.168.0.200 -j MARK --or-mark 0x1
iptables -t mangle -A POSTROUTING -m iprange --src-range 192.168.0.2-192.168.0.200 -j MARK --or-mark 0x1
tc qdisc del dev br-lan root
tc qdisc add dev br-lan root handle 1:0 htb default 999
tc class add dev br-lan parent 1:0 classid 1:1 htb rate 2Mbit ceil 2Mbit
tc class add dev br-lan parent 1:0 classid 1:999 htb rate 100Mbit ceil 100Mbit
tc filter add dev br-lan parent 1:0 prio 10 handle 0x1/0xff fw classid 1:1
tc qdisc del dev eth1 root
tc qdisc add dev eth1 root handle 1:0 htb default 999
tc class add dev eth1 parent 1:0 classid 1:1 htb rate 4Mbit ceil 4Mbit
tc class add dev eth1 parent 1:0 classid 1:999 htb rate 100Mbit ceil 100Mbit
tc filter add dev eth1 parent 1:0 prio 10 handle 0x1/0xff fw classid 1:1
注意查看tc规则是否匹配可以观察tokens变化情况。