请教openwrt流量控制功能如何实现

请教openwrt流量控制功能如何实现,第1张

因为tc的功能非常强大,而且特别灵活,所以一般没有配置的界面。要用tc命令来实现,具体的配置要参考:

https://wiki.openwrt.org/doc/howto/packet.scheduler/packet.scheduler

如果命令怕麻烦的话,可以把openwrt换成其他的linux路由系统,比如“WFilter上网行为管理系统”,里面的流控功能配置起来就很简单。

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变化情况。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11757993.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存