iptables recent模块可内核级动态封禁暴力破解IP,通过哈希表记录源IP,配合--rcheck/--set等参数实现60秒5次即封300秒的SSH防护,需按序插入DROP、阈值触发、ACCEPT规则。

iptables 的 recent 模块可以动态记录并匹配近期访问过的 IP 地址,非常适合用于检测和自动封禁暴力破解行为(如 SSH、FTP、HTTP 登录尝试)。它不依赖外部脚本或日志分析,直接在内核层面完成简单高效的频次控制。
启用 recent 模块并理解基本原理
recent 模块通过内核内存中的哈希表维护一个 IP 列表(默认最多 100 个条目),支持添加、检查、更新、移除等操作。它本身不触发封禁,需配合 REJECT 或 DROP 动作使用。确保模块已加载:
lsmod | grep xt_recent # 若无输出,手动加载: modprobe xt_recent
以 SSH 暴力破解为例配置自动封禁规则
目标:对 60 秒内发起 ≥5 次新连接请求的 IP,直接丢弃后续所有 SSH 连接(持续封禁 300 秒)。
- 第一步:用
--rcheck检查该 IP 是否已在“攻击者列表”中,若是则立即 DROP - 第二步:用
--update更新该 IP 的最后匹配时间(仅当已在列表中) - 第三步:用
--set将首次匹配的 IP 加入列表(配合--rsource记录源 IP) - 第四步:用
--rcheck --seconds 60 --hitcount 5判断是否达到阈值,满足则跳过后续规则进入 DROP 链
完整规则示例(按顺序插入 INPUT 链):
# 1. 已在黑名单?直接丢弃
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_attack --rcheck --seconds 300 --hitcount 1 -j DROP
<h1>2. 达到阈值?加入黑名单(并丢弃本次)</h1><p>iptables -A 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</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/2477" title="社研通"><img
src="https://img.php.cn/upload/ai_manual/001/246/273/176766956137899.png" alt="社研通" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/2477" title="社研通">社研通</a>
<p>文科研究生的学术加速器</p>
</div>
<a href="/ai/2477" title="社研通" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><h1>3. 允许正常连接(放在上述规则之后)</h1><p>iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT注意:--set 和 --rcheck 必须搭配使用;--name 名称必须一致;--rsource 是默认模式(按源 IP 匹配),可省略。
查看与管理 recent 列表
列表内容保存在 /proc/net/xt_recent/ 下,实时可见:
cat /proc/net/xt_recent/ssh_attack # 输出类似:src=192.168.1.100 ttl: 295 # 表示该 IP 还剩约 295 秒未过期
- 清空指定列表:
echo +192.168.1.100 > /proc/net/xt_recent/ssh_attack(加号表示添加,减号表示删除) - 清空全部:
echo / > /proc/net/xt_recent/ssh_attack - 列表默认超时 600 秒,可通过
ip_list_tot和ip_list_hash_size参数调整容量(需 modprobe 时传参)
注意事项与优化建议
- 规则顺序至关重要:封禁规则必须放在允许规则之前,否则永远不生效
- 避免误伤:不要对 ICMP 或已建立连接(ESTABLISHED)应用 recent 规则
- 慎用
--rttl:开启后会校验 TTL,可能因网络路径差异导致漏匹配 - 生产环境建议先用
LOG替代DROP测试规则逻辑,例如:-j LOG --log-prefix "SSH-ATTACK: " - recent 列表无持久化机制,重启后清空;如需长期封禁,应结合 fail2ban 或自定义脚本落盘
不复杂但容易忽略细节,合理搭配状态匹配与时间窗口,就能构建轻量可靠的防御层。









