iptables -m recent 实现秒级自动熔断的核心是通过 --rcheck --seconds 5 --hitcount 3 与 -m state --state NEW 配合,在5秒内检测到同一IP发起3次新连接即立即DROP,所有判断在内核完成,无需日志或脚本,延迟低、开销小,适用于SSH暴力破解等短时高频攻击。

用 iptables -m recent 实现秒级自动熔断,核心是让规则在极短时间内识别高频异常源并立即阻断。它不依赖日志或外部脚本,所有判断都在内核完成,延迟低、开销小,适合应对 SSH 暴力破解、NTP 放大攻击、HTTP 扫描等短时密集行为。
明确“秒级熔断”的关键参数组合
所谓“秒级”,是指从第一次触发到封禁生效的时间控制在几秒内,不是指封禁时长。这主要靠 --rcheck + --seconds + --hitcount 的搭配实现:
- --rcheck --seconds 5 --hitcount 3:表示“过去 5 秒内该 IP 已被本规则匹配至少 3 次”,首次命中即开始倒计时,第 3 次命中时立刻触发 DROP
- 必须配合 -m state --state NEW,否则 ACK、keepalive 等包也会被计入,导致误判
- 封禁动作(-j DROP)必须放在 --rcheck 条件之后,且不能和 --set 写在同一行
- 规则顺序不能错:先检查是否已封(DROP),再记录/判定(--set + --rcheck),最后放行(ACCEPT)
以 SSH 服务为例的完整熔断链(5秒3次即熔断)
以下四条规则需严格按顺序插入 INPUT 链顶部(用 -I):
- 第一步:若 IP 已在黑名单中,直接丢弃
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh-block --rcheck --seconds 300 -j DROP - 第二步:检查是否达到熔断阈值(5秒内3次新连接)
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh-block --set -m recent --name ssh-block --rcheck --seconds 5 --hitcount 3 -j DROP - 第三步:记录每次新连接(为第二步提供数据)
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh-block --set - 第四步:放行合法连接(确保在以上三条之后)
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
注意:第三步的 --set 是基础记录动作;第二步把 --set 和 --rcheck 合并在一行,既更新时间又做判定,是实现“秒级响应”的关键写法。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
验证熔断是否真实生效
recent 模块运行状态不通过日志体现,而是直接反映在内核接口中:
- 执行 ls /proc/net/xt_recent/,应能看到 ssh-block 文件(说明模块已加载且规则启用)
- 执行 cat /proc/net/xt_recent/ssh-block,输出类似 src=192.168.1.200 ttl: 4,其中 ttl 值就是距离上次命中剩余的秒数
- 反复快速发起 3 次 SSH 连接(如用 ssh -o ConnectTimeout=2 user@host 短连测试),第 3 次应直接超时,且 ttl 值归零后该条目消失
避免常见失效陷阱
很多配置看似正确却不起作用,问题往往出在细节:
- 没加 -m state --state NEW:导致重传包、ACK 包也被计数,熔断过早或误伤正常会话
- 规则插在 ACCEPT 之后:流量已被放行,--rcheck 根本不会执行
- 混用 --rcheck 和 --update:二者计时起点不同,--rcheck 从首次命中算起,更适合秒级熔断;--update 从末次算起,适合长周期限频
- 忘记加载模块:执行 modprobe xt_recent 确保内核支持,CentOS 7+ 一般默认已加载
- 列表容量不足:recent 默认最多存 100 个 IP,高并发场景可临时调大:echo 500 > /sys/module/xt_recent/parameters/ip_list_tot










