一. 前言
--limit和--limit-burst规则匹配是iptables对数据包众多的匹配的方式中的一种,使用之前需要用"-m limit",表示使用limit模块。limit模块主要是用于限制一个时间段内进入系统的数据包,主要的用途是减少泛洪攻击的影响。
--limit和--limit-burst是配合使用的,如果iptables规则只使用了--limit,则表示使用--limit-burst的默认值为5。如果只指定了--limit-burst,则--limit默认值3/hour。如下所示:
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type echo-reply -m limit --limit 3/m -j DROP
[root@localhost ~]# iptables -A INPUT -m limit --limit-burst 8 -j DROP
[root@localhost ~]#
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 12 packets, 792 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 0 limit: avg 3/min burst 5
8 668 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 3/hour burst 8
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 7 packets, 996 bytes)
pkts bytes target prot opt in out source destination
二. --limit和--limit-burst的使用
还是使用示例效果的方式来讲解--limit和--limit-burst的作用。
示例如下:
iptables -A INPUT -p icmp --icmp-type echo-reply -m limit --limit 3/minute --limit-burst 5 -j DROP
指令的-p icmp --icmp-type echo-reply表示该指令是处理本主机向外ping的主机返回的数据包,--limit指定的单位时间是每分钟3个包,--limit-burst指定为5,指令的动作是对匹配的包丢弃。
效果如下所示:
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type echo-reply -m limit --limit 3/minute --limit-burst 5 -j DROP
[root@localhost ~]#
[root@localhost ~]# ping 192.168.1.105
PING 192.168.1.105 (192.168.1.105) 56(84) bytes of data.
64 bytes from 192.168.1.105: icmp_seq=6 ttl=64 time=0.266 ms
64 bytes from 192.168.1.105: icmp_seq=7 ttl=64 time=0.161 ms
64 bytes from 192.168.1.105: icmp_seq=8 ttl=64 time=0.164 ms
64 bytes from 192.168.1.105: icmp_seq=9 ttl=64 time=0.176 ms
64 bytes from 192.168.1.105: icmp_seq=10 ttl=64 time=0.176 ms
64 bytes from 192.168.1.105: icmp_seq=11 ttl=64 time=0.162 ms
64 bytes from 192.168.1.105: icmp_seq=12 ttl=64 time=0.175 ms
64 bytes from 192.168.1.105: icmp_seq=13 ttl=64 time=0.175 ms
64 bytes from 192.168.1.105: icmp_seq=14 ttl=64 time=0.160 ms
64 bytes from 192.168.1.105: icmp_seq=15 ttl=64 time=0.160 ms
64 bytes from 192.168.1.105: icmp_seq=16 ttl=64 time=0.171 ms
64 bytes from 192.168.1.105: icmp_seq=17 ttl=64 time=0.177 ms
64 bytes from 192.168.1.105: icmp_seq=18 ttl=64 time=0.165 ms
64 bytes from 192.168.1.105: icmp_seq=19 ttl=64 time=0.162 ms
64 bytes from 192.168.1.105: icmp_seq=20 ttl=64 time=0.156 ms
64 bytes from 192.168.1.105: icmp_seq=22 ttl=64 time=0.132 ms
64 bytes from 192.168.1.105: icmp_seq=23 ttl=64 time=0.193 ms
64 bytes from 192.168.1.105: icmp_seq=24 ttl=64 time=0.185 ms
64 bytes from 192.168.1.105: icmp_seq=25 ttl=64 time=0.162 ms
64 bytes from 192.168.1.105: icmp_seq=26 ttl=64 time=0.181 ms
64 bytes from 192.168.1.105: icmp_seq=27 ttl=64 time=0.177 ms
64 bytes from 192.168.1.105: icmp_seq=28 ttl=64 time=0.152 ms
64 bytes from 192.168.1.105: icmp_seq=29 ttl=64 time=0.136 ms
64 bytes from 192.168.1.105: icmp_seq=30 ttl=64 time=0.135 ms
64 bytes from 192.168.1.105: icmp_seq=31 ttl=64 time=0.170 ms
64 bytes from 192.168.1.105: icmp_seq=32 ttl=64 time=0.156 ms
64 bytes from 192.168.1.105: icmp_seq=33 ttl=64 time=0.162 ms
64 bytes from 192.168.1.105: icmp_seq=34 ttl=64 time=0.173 ms
64 bytes from 192.168.1.105: icmp_seq=35 ttl=64 time=0.206 ms
64 bytes from 192.168.1.105: icmp_seq=36 ttl=64 time=0.155 ms
64 bytes from 192.168.1.105: icmp_seq=37 ttl=64 time=0.150 ms
64 bytes from 192.168.1.105: icmp_seq=38 ttl=64 time=0.175 ms
64 bytes from 192.168.1.105: icmp_seq=39 ttl=64 time=0.194 ms
64 bytes from 192.168.1.105: icmp_seq=40 ttl=64 time=0.173 ms
64 bytes from 192.168.1.105: icmp_seq=42 ttl=64 time=0.163 ms
64 bytes from 192.168.1.105: icmp_seq=43 ttl=64 time=0.181 ms
64 bytes from 192.168.1.105: icmp_seq=44 ttl=64 time=0.194 ms
64 bytes from 192.168.1.105: icmp_seq=45 ttl=64 time=0.182 ms
从结果来看,前面的5个icmp包都没有收到回复,并且第21和41个包没有收到回复。
结果解析:
在这里需要引入一个令牌桶的概念,一个令牌桶中可以装若干个令牌。--limit-burst表示令牌桶的容量以及装有默认的令牌的数量,当令牌桶中有令牌时,将会匹配到数据包,并且令牌桶中的令牌的数量减1,所以,可以看到因为令牌桶中的数量默认为5,前面的5个包icmp回包都被匹配到了,都被DROP了。
--limit 3/minute表示每分钟向令牌桶中加入3个令牌,所以每20秒,向令牌桶中加入一张令牌,所以我们可以看到,第21和41个包都被匹配到了。注意,令牌每隔20秒会向令牌桶中加入一张令牌,如果当前没有匹配的数据包,令牌不会减少,而是会增加到--limit-burst指定到令牌数量,因为--limit-burst指定的是令牌桶的大小,所以,数量增加--limit-burst指定到令牌数量后,不会继续增加。可知本例中在20*5 = 100秒后,令牌桶的数量会重新装满。
三. 总结
limit模块引入了令牌桶的机制,使用--limit-burst指定令牌桶的大小,当令牌桶中有令牌时,则可以匹配到数据包,如果没有了令牌,则需要等到--limit指定的时间单位间隔向令牌桶加入令牌,才能继续匹配数据包。