Linux内核基于端口限速的研究及实现

1.通过iptables来实现限速

Iptables通过limit来实现限速,虽然iptables提供了丰富的匹配条件,但是基于端口来限速受到处理时机的限制,iptables处理的是三层及三层以上的报文,当iptables模块处理报文的时候,linux内核已经不再维护接收端口的信息了,这样的话就不能通过 iptables 的-i选项来匹配入端口。

2. 通过ebtables来实现。

Ebtalbes处理2层的报文,linux内核在整个ebtables 模块对报文处理的过程中接收端口的信息是一直保留的,因此可以通过ebtables来实现端口的限速在理论上是可以行得通的。

实现方式:

ebtables -t filter -N TEST             (limit选项是自定义链的属性)

ebtables -t filter -A FORWARD -j TEST   (用FORWARD链来实现限速,不会影响到达本机的数据,如web,DHCP等)

ebtables -t filter -A FORWARD -j DROP

ebtables -t filter -A TEST -j RETURN  -i  eth1.4 --limit 5/m --limit-burst 5

--limit 5/m:每隔12S释放一个令牌

--limit-burst 5: 有5个令牌

预期结果:也就是刚开始5个包是通的,然后每隔12S可以通一个包。

测试结果:通过测试发现,上面的配置的参数和试验的结果刚好相反。开始5个包不能通过,以后每隔12s有一个包不能通过,没弄清楚linux内核是怎么处理这个地方的。

3.通过TC来对端口的实现限速。

TC是linux内核专们用来限速使用的,功能非常丰富,但是只能端口tx进行限速,如果要对入口进行限速的话,需要结合iptables和ebtables或路由一起使用。

下面是对ath0实现限速。

第一步:在ath0上增加一个父类,没有匹配filter的默认用cliass id为1:99。

tc qdisc add dev ath0 root handle 1: htb default 99

第二步:创建一个子类

tc class add dev ath0 parent 1: classid 1:1 htb rate 100000kbit

第三步:创建子类的子类

tc class add dev ath0 parent 1:1 classid 1:99 htb rate 500kbit ceil 5000kbit prio 7 quantum 1500

tc class add dev ath0 parent 1:1 classid 1:98 htb rate 1000kbit ceil 1000kbit prio 7 quantum 1500

/*如果只是单纯的ath0限速,这里已经就可以了,下面的分流就没有意义了,但是所有的ath0的出口的数据都会执行默认的流1:99,这样也会对802.11管理报文也产生影响,导致不ssid关联和认证不能成功*/

第四步:创建filter,fwmark为10的数据走classi id 1:99,fwmark为11的数据走1:98

tc filter add dev ath0 parent 1: prio 0 protocol ip handle 10 fw flowid 1:99

tc filter add dev ath0 parent 1: prio 0 protocol ip handle 11 fw flowid 1:98

第五步:ebtables对数据进行分流,通过ebtables将需要数据打上fwmark,,这里注意千万不要用-i ath0,因为tc工具只能对发送的报文进行限速。

ebtables -t filter -A FORWARD -p IPv4 -j mark --mark-set 10

其他的一些命令:

tc  qdisc show dev ath0

tc  class show dev ath0

tc  filter show dev ath0

tc qdisc del dev ath0 root handle 1: htb default 99

tc qdisc change dev ath0 root handle 1: htb default 99

tc class change dev ath0 parent 1:1 classid 1:98 htb rate 100kbit ceil 100kbit prio 7 quantum 1500

tc filter change dev ath0 parent 1: prio 0 protocol ip handle 11 fw flowid 1:98

常用限速单位

kbps                            千字节/秒

mbps                           兆字节/秒

kbit                             KBits/秒

mbit                            MBits/秒

bps或者一个无单位数字      字节数/秒


你可能感兴趣的:(Linux内核基于端口限速的研究及实现)