IPTABLES limit限速测试总结
iptables的限速测试总结
一、iptables的简介
iptables 是用来设置、维护和检查Linux内核的IP数据包过滤规则的。
iptables 在对信息包进行过滤处理时,是遵循一定的规则的,这些规则被存放在信息过滤表里面,防火墙会根据这些表里的规则对信息包进行相应的处理;而在这些信息过滤表中实际上是把规则下放到相应的链上;iptables就是一个可以对这些信息过滤表进行添加、修改、删除规则的工具。
其分为两个模块组成,一个是netfilter和iptables;netfilter是防火墙的模块,主要在内核空间是一些信息过滤表;iptables则是管理netfilter的工具。
二、iptables的表和链
iptables主要由3个表组成,分别是filter、nat、mangle.在每个表里面会包含不同的链,我们主要是在表里面写链上的定义规则(策略)
默认一般不指定就是使用filter表,主要包括3个链:INPUT链、FORWARD链和OUTPUT链;
INPUT链主要是用来处理发送给自己的包,即数据包的目的地址是自己的。通过定义一些INPUT链的规则去对这些数据包采取一些相应的动作。
FORWARD链主要是用来处理通过自己的数据包,即这个数据包通过自己,但源地址和目的地址都不是自己,针对这些数据包去采取相应的动作。
OUTPUT链主要是处理自己生成的数据包,即源地址是自己的,去通过链上的规则去采取相应的动作。
下面简单说明一下3条链之间的关系:
数据包来了先经过判断,然后选择是INPUT链处理还是FORWARD链处理,出去的时候会判断是不是OUTPUT链需要处理。
三、iptables链上的动作
在链上有很多的动作可以执行,比如ACCEPT、DROP、REJECT
ACCEPT:对满足规则条件的数据包允许通过
DROP:丢弃数据包,并且是不返回信息的
REJECT:丢弃数据包,返回拒绝的信息
四、iptables的命令参数说明
下面关于iptables命令的详细参数简单说明一下:
-t(table)指定表
-A(append) 追加,一般将新加的规则(策略)是追加到表中链上的末尾规则
-I(insert) 插入链 后面加数字可以指定讲规则加到相应的行,默认是所有规则最前面
-L(list)查看规则 可以加-n、-v参数效果查看更明显
-F(flush) 清除所有规则
-D(delete)删除某个规则 可以指定相应链上的规则顺序号去删除,--line-numbers可以查看
匹配数据包的一些条件参数:
-i进入的网卡
-o 出去的网卡
-s ip源地址IP
-d ip 目的地址IP
--dport端口号 目的端口号
--sdport 端口号 源端口号
五、iptables的规则匹配顺序
数据包通过防火墙的时候是要顺序匹配策略的,从上往下依次匹配,一个包不符合某条规则,就会由后面的规则来处理,如果都不符合,就由缺省的策略处理。
六、实际线下测试
1)环境
下面是我自己线下测试的环境以及所写的规则:
环境:3台redhat6.5(VM虚拟机)
2)定义的规则
在开启iptables的机器上写入以下规则,这样我们根据实际写的规则去解释一下:
#iptables -I FORWARD 1 -p tcp -i eth0 -o eth1 -s 192.168.2.3 -d192.168.3.3 --dport 80 -m limit --limit=500/s --limit-burst=1000 -j ACCEPT
这条规则是:允许转发从eth0进来的源IP为192.168.2.3,去访问从eth1出去的目的IP为192.168.3.3的80端口(即http服务)的数据包,其中会对包的速率做匹配,是每秒转发500个包,初始的burst值是1000
#iptables -I FORWARD 2 -p tcp -i eth1 -o eth0 -s 192.168.3.3 -d192.168.2.3 --dport 80 -m limit --limit=500/s --limit-burst=1000 -j ACCEPT
这条规则是:允许转发从eth1进来的源IP为192.168.3.3,去访问从eth0出去的目的IP为192.168.2.3的80端口(即http服务)的数据包,其中会对包的速率做匹配,是每秒转发500个包,初始的burst值是1000
#iptables -A FORWARD -p tcp -i eth0 -o eth1 -s 192.168.2.3 -d192.168.3.3 --dport 80 -j DROP
这是对从eth0进来的源IP为192.168.2.3,并且从eth1出去的目的IP为192.168.3.3的80端口(即http服务)的数据包进行丢弃
#iptables -A FORWARD -p tcp -i eth1 -o eth0 -s 192.168.3.3 -d192.168.2.3 --dport 80 -j DROP
这是对从eth1进来的源IP为192.168.3.3,并且从eth0出去的目的IP为192.168.2.3的80端口(即http服务)的数据包进行丢弃
3)limit的相关解释
其中限速的实现是依靠limit规则做限制,两条规则(ACCEPT和DROP)相配合实现的;通过对每秒匹配包的个数进行限制,多余的由后面相应的DROP规则去处理,这样就实现了iptables限速
--limit 500/s 表示每秒500次; 1/m 则为每分钟一次
--limit-burst 表示允许触发 limit 限制的最大次数 (预设5)
这里的--limit-burst=1000相当于说最开始我有1000的可以匹配的包去转发,然后我匹配的包的个数是根据--limit=500/s进行限制的,也就是每秒限制转发500个数据包,多余的会被下面符合要求的DROP规则去处理,去进行丢弃,这样就实现了对数据包的限速问题。
这里“limit”这个词准确说,应该是“按一定速率去匹配”,至于“限制”还是“放行”是后面 -j 动作来实现的,limit 仅仅是个 match 模块,他的功能是匹配,匹配方式是按一定速率.用iptables的limit模块,目标是ACCEPT.当你设置300/s时,它大约每3ms发出一个令牌,获得令牌的包可以发出去,没有获得令牌的包只能等待下一个令牌到来,这样不会造成一些包丢失,更不会造成所谓“断线”的
4)实际生成规则展示
实际生成的规则如下,一般写好的规则是放在内存中的,重启就会被清除,可以通过service iptables save 去保存定义好的规则,这样重启还是会存在的
5)测试数据
下面是一些线下测试限速的结果,仅供参考,具体以线上实际稳定的速率为准:
测试命令是通过:wget http://192.168.2.3/filename
罗列一下--limit=1000/s --limit-burst=1000的相关数据:
2016-08-2214:49:31 (55.4 MB/s) - “1M” saved [1048576/1048576]
2016-08-2214:49:31 (140 MB/s) - “10M” saved [10485760/10485760]
2016-08-2214:49:33 (23.7 MB/s) - “50M” saved [52428800/52428800]
2016-08-2214:49:36 (40.0 MB/s) - “100M” saved [104857600/104857600]
2016-08-2214:50:05 (34.8 MB/s) - “1G” saved [1073741824/1073741824]
2016-08-2214:52:15 (39.7 MB/s) - “5G” saved [5368709120/5368709120]
2016-08-2214:52:15 (37.4 MB/s) - “1M” saved [1048576/1048576]
2016-08-2214:52:15 (33.4 MB/s) - “10M” saved [10485760/10485760]
2016-08-2214:52:16 (62.5 MB/s) - “50M” saved [52428800/52428800]
2016-08-2214:52:18 (54.6 MB/s) - “100M” saved [104857600/104857600]
2016-08-2214:52:40 (46.9 MB/s) - “1G” saved [1073741824/1073741824]
2016-08-2214:55:02 (36.1 MB/s) - “5G” saved [5368709120/5368709120]
2016-08-2214:55:02 (35.3 MB/s) - “1M” saved [1048576/1048576]
2016-08-2214:55:02 (35.0 MB/s) - “10M” saved [10485760/10485760]
2016-08-2214:55:04 (37.4 MB/s) - “50M” saved [52428800/52428800]
2016-08-2214:55:05 (58.6 MB/s) - “100M” saved [104857600/104857600]
2016-08-2214:55:29 (42.8 MB/s) - “1G” saved [1073741824/1073741824]
2016-08-2214:57:24 (44.6 MB/s) - “5G” saved [5368709120/5368709120]
最后这是我测试改变相关参数后,iptables限速的一些数据:
6)分析
通过对上面的数据分析,可以知道,利用iptables进行限速主要是利用率iptables的limit模块对数据包进行匹配处理,从而实现限速的;--limit=match,这个是限定了匹配包的速率,换句话说就是每秒可以转发多少个数据包,这是对iptables做限速的最主要的参数,通过制定它就基本可以确定要控制的限制速率是多少;--limit-burst是允许触发 limit 限制的最大次数,默认预设是5;也就是说最开始的5个包会被直接转发,这时burst就会减为0,再来的包就会丢给下一条规则去处理(这里设定是DROP),直到limit参数产生新的令牌,才会继续去匹配转发。
简单来说限速最主要的就是limit和burst,burst是最初有多少令牌可以去转发包,后面limit会进行按速率匹配,相当于按时间补充令牌数,第一条规则达到速率上限就会把剩下的包丢给下一条规则去处理,我们下一条和它对应的就是DROP,所以会把剩下的包丢弃,从而实现了限速。