iptables recent模块可精准识别并封禁慢速暴力破解:180秒内同一IP发起4次SSH新连接即触发300秒封禁,通过--rcheck/--set组合实现低频持续试探检测,优于connlimit等并发控制方案。

用 iptables recent 模块对抗慢速暴力破解,核心是识别“低频但持续”的异常连接模式——不是看一秒内连多少次,而是看几分钟内是否反复试探登录入口(如 SSH 的新连接),并自动封禁。
识别慢速暴力破解的关键特征
慢速暴力破解(如用 nmap -T2 或自定义延迟的 hydra 脚本)通常表现为:
- 同一 IP 每 10–30 秒发起一次新的 SSH 连接(不完成认证,仅建立 TCP)
- 连接间隔不固定,避开秒级限流规则
- 单次连接后很快断开,不发送密码尝试数据,但频繁触发服务端 accept() 或 fork()
- 日志中表现为大量 “Connection closed by authenticating user” 或空 session 记录
配置基于 recent 的慢速防护规则(以 SSH 为例)
以下规则按顺序插入 INPUT 链,缺一不可:
-
第一步:已封禁?直接丢弃
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_slow --rcheck --seconds 300 -j DROP -
第二步:达阈值?立即封禁并丢弃本次
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_slow --set -m recent --name ssh_slow --rcheck --seconds 180 --hitcount 4 -j DROP -
第三步:未达阈值?记录该 IP 并放行
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_slow --set -j ACCEPT
说明:180 秒内出现 4 次新连接即触发封禁,封禁时长为 300 秒(由第一步 --seconds 300 控制)。--set 必须放在 --rcheck 前才能正确累积计数。
增强可靠性与可维护性
避免误封、便于排查:
- 加日志前缀便于审计:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_slow --rcheck --seconds 180 --hitcount 4 -j LOG --log-prefix "SSH-SLOW-BLOCK: " - 对可信网段(如办公内网)跳过检测:
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -m state --state NEW -j ACCEPT - 定期清理旧条目(可选):
echo 1 > /proc/net/xt_recent/ssh_slow # 手动清空列表(重启失效)
为什么不用 connlimit 替代?
connlimit 控制的是并发半开连接数,而慢扫是“串行试探”,每次只建一个连接再关闭,不会堆积 SYN_RECV。recent 则关注时间窗口内的连接频次,正好匹配慢速行为的本质——它是按“次数+时间”建模,不是按“并发数”建模。

















