Iptables防火墙limit模块扩展匹配规则
在配置防火墙时,除了控制“谁能访问”,还有一个同样重要的议题:“能以多快的频率访问”。这就要提到Iptables的limit模块了,它就是专门为报文速率戴上“紧箍咒”的工具。
简单来说,limit模块的核心功能是控制单位时间内通过的数据包数量,可以精确到每秒、每分钟、每小时甚至每天。比如,你可以设定规则,要求一分钟内只放行10个ICMP请求,多出来的请求一律按规则处理。
用好这个模块,主要依赖两个关键参数:
--limit rate[/second|/minute|/hour|/day]:这个参数定义了限制的平均速率。你可以指定单位为秒、分、时、天。如果不指定,默认是按“每3小时”来计算的,这在实际中需要特别注意。--limit-burst:这个参数理解起来有点意思。它定义了“突发流量”的额度。比如说,你设定每分钟允许10个包,但一开始可能一下子涌来好几个。burst值就设定了这第一波攻击或请求中,能直接放行的最大包数,默认是5个。超出的部分,才会严格按平均速率来控制。
1. 限制每分钟接收10个ICMP数据报文
咱们来看一个最常见的场景:限制ICMP Ping请求的频率,防止被简单的ping flood攻击拖垮。
首先,添加一条规则,在一分钟内最多接受10个ICMP协议的请求报文。
[root@jxl-1 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
紧接着,必须加上第二条规则:所有超出上述限制的ICMP报文,全部丢弃。
[root@jxl-1 ~]# iptables -t filter -A INPUT -p icmp -j DROP
最后,用详细列表查看一下规则是否生效。
[root@jxl-1 ~]# iptables -L -n -v --line-number
Chain INPUT (policy ACCEPT 1331 packets, 1111K bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 limit: a vg 10/min burst 5
2 0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0

实际测试一下,你会发现前5个Ping包是畅通无阻的。这正是默认的--limit-burst 5在起作用,给了流量一个初始的“弹性空间”。
从第6个包开始,限制才真正生效。因为每分钟只允许10个,换算下来就是每6秒放行一个包。所以你会看到,第6个包之后,响应开始有规律地间隔出现。
所以,这条规则更直观的理解是:起初放行5个包(快速通过),之后每分钟稳定放行10个包。

2. 允许10个数据报文快速通过,然后限制每分钟接收1个ICMP数据报文
这个场景是对上一个例子的灵活调整。比如,你希望服务启动初期能快速响应一些探测请求,但之后要进入严格的低速监控模式。
实现思路完全一样,核心就是手动调整--limit-burst这个初始突发值。
1. 添加规则,允许突发10个包,但后续速率限制为每分钟仅1个。
[root@jxl-1 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
2. 同样,追加丢弃所有其他ICMP报文的规则。
[root@jxl-1 ~]# iptables -t filter -A INPUT -p icmp -j DROP
效果如图所示:最开始连续发送的10个包全部成功接收,展现了“突发额度”的效用。在此之后,每分钟就只能收到一个回应包了,限制非常严格。

3. 限速案例:限制网络传输的带宽不超过500k/s
更有趣的应用来了:用limit模块实现网络带宽限速。这听起来有点跨界,但原理是相通的——控制单位时间内通过的数据包数量。
关键在于一个简单的计算:带宽速率最终由每秒传输的数据包数量决定。一个标准的以太网数据包(MTU 1500)大小大约在1500字节左右。
限速公式可以这样推导:(目标带宽速率 * 1000) / 单个数据包大小 ≈ 每秒允许的数据包数量。
以限制500k/s为例: (500 * 1000) / 1500 ≈ 333个包/秒。为了保险起见,我们可以先设为300个。
[root@jxl-1 ~]# iptables -t filter -I OUTPUT -p tcp -m limit --limit 300/s -j ACCEPT [root@jxl-1 ~]# iptables -t filter -A OUTPUT -p tcp -j DROP
当然,实际网络中的数据包大小并不恒定,因此实际速率会有一定波动。如果目标是将速率严格压制在500k以内,可以根据实测结果微调--limit的数值。比如下图中,将包数量设为120个/秒后,实际下载速率就稳定在了327k/s左右,达到了限速目的。

通过对limit模块这几个经典场景的拆解,可以看到,它不仅是防攻击的利器,更能实现精细化的流量管控。理解其“平均速率”与“突发额度”的双参数协作机制,是灵活运用它的关键所在。