OpenWrt开发教程(十) iptables+tc命令实现ip组限速功能

tc命令简介

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规则

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

tc规则

上行接口为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

规则列表

iptables规则

在这里插入图片描述

tc filter 规则

OpenWrt开发教程(十) iptables+tc命令实现ip组限速功能_第1张图片

tc class 规则

OpenWrt开发教程(十) iptables+tc命令实现ip组限速功能_第2张图片

注意查看tc规则是否匹配可以观察tokens变化情况。

更多OpenWrt技术开发文章,可以扫码关注OpenWrt公众号
OpenWrt开发教程(十) iptables+tc命令实现ip组限速功能_第3张图片

你可能感兴趣的:(shell,路由器,openwrt)