You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Iptables BAN链规则匹配异常:移除未匹配地址后规则失效原因咨询

问题根源:iptables recent模块的计数逻辑被你的移除操作打断了

这事儿我太熟悉了——本质是你对recent模块的工作机制和你的移除操作逻辑冲突了,咱们掰开揉碎说:

1. 先还原你的规则逻辑(大概率是这样)

你用来触发BAN链的规则,肯定是依赖recent模块统计5秒内的ping请求次数,核心规则大概长这样:

# 把所有ping请求的来源IP加入"ping"列表,累计请求次数
-A INPUT -p icmp --icmp-type echo-request -m recent --name ping --set
# 检查列表中5秒内请求次数≥2的IP,跳转到BAN链
-A INPUT -p icmp --icmp-type echo-request -m recent --name ping --rcheck --seconds 5 --hitcount 2 -j BAN

recent模块的核心是给每个IP维护一个请求次数+时间戳的条目:第一次ping进来时,IP被加入列表,次数记为1;5秒内第二次ping进来时,次数累加为2,触发BAN规则。

2. 移除“未匹配规则的地址”为什么会导致规则失效?

你说的“未匹配该规则的地址”,就是那些在ping列表里请求次数只有1次的IP(还没达到5秒2次的触发条件)。当你把这些IP从列表里移除时,等于直接清空了它们的历史请求记录:

  • 当这些IP再次发送ping请求时,第一次请求会被--set重新加入列表,但次数回到1,不满足--hitcount 2;
  • 哪怕5秒内发第二次请求,因为之前的1次记录已经被你移除了,这次请求的次数还是被记为1(相当于全新的第一次请求),永远凑不到2次的阈值。

简单说:你的移除操作把recent模块用来累计次数的“历史账本”给撕了,自然永远攒不够触发BAN规则的次数。

3. 怎么修复?

如果你想保留自动清理过期记录的功能,别手动移除未匹配的IP,改用recent模块自带的--reap选项(或者配置ip_tables_recent模块的purge_timeout参数),让系统自动清理超过时间窗口的旧记录,而不是把还在时间窗口内的低次数IP删掉。

比如可以加一条规则自动清理5秒外的旧记录:

-A INPUT -p icmp --icmp-type echo-request -m recent --name ping --reap --seconds 5

内容的提问来源于stack exchange,提问作者EdiD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:38:06