iptables recent模块可内核级动态封禁暴力破解IP,通过哈希表记录源IP,按序配置--rcheck/--set规则实现60秒5次即封300秒的SSH防护,无需日志或脚本,响应快、开销低。

用 iptables 的 recent 模块自动化拦截高频暴力破解请求,关键是靠内核级哈希表实时记录源 IP 行为,不依赖日志、不调用脚本,响应快、开销低。核心是把“频次检测”和“临时封禁”压进几条规则里,按顺序生效。
明确防护目标与参数组合
典型场景如 SSH 暴力破解:60 秒内同一 IP 发起 ≥5 次新连接(--state NEW),就立即封禁 300 秒。这需要三个关键参数协同:
- --rcheck --seconds 60 --hitcount 5:从第一次匹配开始计时,60 秒内累计达 5 次即触发
- --name ssh_attack:自定义列表名,对应内核中 /proc/net/xt_recent/ssh_attack 文件
- --set 和 --rsource:每次新连接都记录源 IP,--rsource 是默认行为,显式写出更清晰
严格按顺序插入 INPUT 链的四条规则
顺序错一条,就可能漏判或误封。建议用 -I 插入链首(不是 -A 追加):
- 第一行:已进入黑名单?直接丢弃
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_attack --rcheck --seconds 300 -j DROP - 第二行:是否达到阈值?满足则封禁本次并写入黑名单
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_attack --set -m recent --name ssh_attack --rcheck --seconds 60 --hitcount 5 -j DROP - 第三行:未达阈值?先记录该次新连接(供后续判断用)
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_attack --set - 第四行:合法连接放行(必须放在前三条之后)
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
验证规则是否真在运行
recent 模块不打日志,状态全在内核接口里:
- 执行 ls /proc/net/xt_recent/,应能看到 ssh_attack 文件(说明模块已加载且规则启用)
- 执行 cat /proc/net/xt_recent/ssh_attack,输出类似 src=192.168.1.100 ttl: 298,表示该 IP 正在被跟踪,ttl 值会随时间递减
- 若无输出,检查是否漏加载模块:modprobe xt_recent,再确认 lsmod | grep xt_recent 有返回
适配其他服务或攻击模式的调整要点
同一套逻辑可迁移到 FTP、Web 接口、端口扫描等场景,只需改端口和匹配条件:
- 防 Web 接口探测:把 --dport 80/443 + --tcp --syn 替换 --dport 22,同样加 --state NEW
- 防慢速扫描:把 --rcheck 换成 --update,让倒计时从最后一次命中起算,更适合长周期试探
- 增强可观测性:在 DROP 规则前加一条 LOG,例如 -j LOG --log-prefix "SSH-BRUTE: ",方便排查
- 避免 CDN 干扰:如果业务走 CDN,源 IP 实际是 CDN 节点 IP,需配合 X-Forwarded-For 解析或改用应用层限流

















