OpenWrt教程-iptables+tc命令实现ip组限速功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenWrt教程-iptables+tc命令实现ip组限速功能相关的知识,希望对你有一定的参考价值。

参考技术A 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接口

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规则是否匹配可以观察tokens变化情况。

以上是关于OpenWrt教程-iptables+tc命令实现ip组限速功能的主要内容,如果未能解决你的问题,请参考以下文章

OpenWrt加入iptables 支持过滤字符串

openwrt上的弱网测试

LINUX中IPTABLES和TC对端口的带宽限制 端口限速

openwrt设置奈飞分流

openwrt可以ping防火墙

openwrt有线能上网无线不能