zoukankan      html  css  js  c++  java
  • 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条链之间的关系:

    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,所以会把剩下的包丢弃,从而实现了限速。

  • 相关阅读:
    手写spring事务框架, 揭秘AOP实现原理。
    centos7修改端口登陆
    数据库的锁机制
    linux安装mysql5.6
    SpringMVC数据格式化
    Java处理小数点后几位
    docker学习(七)常见仓库介绍
    docker学习(六) Docker命令查询
    docker学习(六)
    docker学习(五)
  • 原文地址:https://www.cnblogs.com/ip99/p/15313691.html
Copyright © 2011-2022 走看看