ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

IPTABLES limit限速测试总结

2021-09-20 10:02:16  阅读:284  来源: 互联网

标签:IPTABLES iptables -- saved 限速 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条链之间的关系:

iptables的限速测试总结_limit

    数据包来了先经过判断,然后选择是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虚拟机)

iptables的限速测试总结_iptables_02

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 去保存定义好的规则,这样重启还是会存在的

iptables的限速测试总结_limit_03

 

 

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限速的一些数据:

iptables的限速测试总结_limit_04

 

6)分析

   通过对上面的数据分析,可以知道,利用iptables进行限速主要是利用率iptables的limit模块对数据包进行匹配处理,从而实现限速的;--limit=match,这个是限定了匹配包的速率,换句话说就是每秒可以转发多少个数据包,这是对iptables做限速的最主要的参数,通过制定它就基本可以确定要控制的限制速率是多少;--limit-burst是允许触发 limit 限制的最大次数,默认预设是5;也就是说最开始的5个包会被直接转发,这时burst就会减为0,再来的包就会丢给下一条规则去处理(这里设定是DROP),直到limit参数产生新的令牌,才会继续去匹配转发。

    简单来说限速最主要的就是limit和burst,burst是最初有多少令牌可以去转发包,后面limit会进行按速率匹配,相当于按时间补充令牌数,第一条规则达到速率上限就会把剩下的包丢给下一条规则去处理,我们下一条和它对应的就是DROP,所以会把剩下的包丢弃,从而实现了限速。

标签:IPTABLES,iptables,--,saved,限速,limit,规则,数据包
来源: https://www.cnblogs.com/ip99/p/15313691.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有