“指数级封禁惩罚”通过三级 recent 列表(recent1/recent2/recent3)与嵌套时间窗口实现:初犯封60秒,再犯(封禁期内触发)升为600秒,三犯升为3600秒,呈近似10倍增长。

用 iptables -m recent --update 实现“指数级封禁惩罚”,核心在于:**不直接靠 iptables 自身实现指数运算,而是通过多级 recent 列表 + 时间窗口叠加 + 规则链跳转,模拟出随违规次数增长而封禁时长倍增的效果**。Linux 内核的 recent 模块本身不支持数学计算,但可利用其“匹配命中即更新”“列表独立计时”“多规则协同”等特性构建分层防御逻辑。
设计思路:三级违规等级对应三段递增封禁期
将扫描行为按触发频次划为轻、中、重三级,每级使用独立 recent 列表记录源 IP,并设置不同超时(timeout),再通过规则顺序和 goto/jump 控制流转:
-
Level-1(初犯):5 秒内出现 ≥3 次扫描包 → 记入
recent1,封禁 60 秒 -
Level-2(再犯):在被
recent1封禁期间又触发 Level-1 条件 → 记入recent2,封禁 600 秒(10 分钟) -
Level-3(惯犯):在被
recent2封禁期间再次触发 → 记入recent3,封禁 3600 秒(1 小时)
这样,第 1 次违规封 1 分钟,第 2 次(在封禁期内发生)封 10 分钟,第 3 次封 1 小时 —— 接近 10× 增长,符合“指数级惩罚”的工程实践目标。
具体 iptables 规则链配置(以 INPUT 链为例)
以下规则需按顺序插入,推荐放在自定义链(如 SCAN-PROTECT)中调用,避免污染主链:
# 创建专用链 iptables -N SCAN-PROTECT <h1>Step 1:检查是否已在最严列表(recent3),直接 DROP</h1><p>iptables -A SCAN-PROTECT -m recent --name recent3 --rcheck --seconds 3600 --hitcount 1 -j DROP</p><h1>Step 2:若在 recent2 封禁期内又满足 Level-1 条件,则升级到 recent3</h1><p>iptables -A SCAN-PROTECT -m recent --name recent2 --rcheck --seconds 600 --hitcount 1 \ -m recent --name recent1 --rcheck --seconds 5 --hitcount 3 \ -m recent --name recent3 --set -j DROP</p><h1>Step 3:若在 recent1 封禁期内又满足 Level-1 条件,则升级到 recent2</h1><p>iptables -A SCAN-PROTECT -m recent --name recent1 --rcheck --seconds 60 --hitcount 1 \ -m recent --name recent1 --rcheck --seconds 5 --hitcount 3 \ -m recent --name recent2 --set -j DROP</p><h1>Step 4:首次触发 Level-1:5 秒内 3 次 SYN 扫描(可替换为更精准匹配)</h1><p>iptables -A SCAN-PROTECT -p tcp --syn -m recent --name recent1 --set --rsource \ -m recent --name recent1 --rcheck --seconds 5 --hitcount 3 -j DROP</p><h1>Step 5:最后,把 SCAN-PROTECT 插入 INPUT 链头部(在 ESTABLISHED 后)</h1><p>iptables -I INPUT 1 -j SCAN-PROTECT
说明:
• --rsource 确保按源 IP 记录;
• --rcheck 是“检查是否已存在且满足时间/次数”,--set 是“写入新条目”;
• 所有 --hitcount N 必须配合 --seconds T,表示 T 秒内命中 N 次;
• 规则顺序关键:必须从最严(recent3)往最松(recent1)排列,否则低级规则会提前截断。
增强鲁棒性与运维建议
真实环境中需补充以下措施,防止绕过或误伤:
-
白名单豁免:在 SCAN-PROTECT 链开头加
-s 192.168.1.0/24 -j RETURN,跳过内网或运维 IP -
日志审计:在每个 DROP 前加
-j LOG --log-prefix "BLOCK-LEVEL3: ",便于排查和分析攻击模式 -
自动清理机制:定期执行
echo /proc/net/nf_conntrack | grep recent查看列表大小;用watch 'cat /proc/net/nf_conntrack | grep recent'监控实时状态 -
替代方案提示:若连接数极高(如万级 QPS),recent 模块可能成为瓶颈,此时建议迁移到
ipset + hash:ip timeout或结合 fail2ban 脚本化管理
验证与调试方法
快速验证是否生效:
- 用另一台机器执行
for i in {1..4}; do nc -zv TARGET_IP 22; sleep 1; done模拟短时扫描 - 查看 recent 列表:
cat /proc/net/nf_conntrack | grep recent,应看到对应 IP 出现在recent1或更高列表 - 检查封禁效果:
iptables -L SCAN-PROTECT -n -v中 DROP 规则的 packet 计数是否增长 - 手动清除测试 IP:
echo -1 > /proc/net/nf_conntrack | grep 'src=1.2.3.4' | cut -d' ' -f6 | xargs -I{} echo {} > /proc/net/nf_conntrack(慎用)
这种设计不依赖外部脚本,纯内核态完成,延迟低、可靠性高,是生产环境中小规模扫描防御的成熟实践。

















