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

用 iptables 的 recent 模块实现动态封禁,核心在于不依赖日志、不调用外部程序,直接在内核层面完成“频次检测 + 临时拉黑”。它适合应对短时高密度的暴力破解(比如1分钟内几十次新连接),响应快、开销低,但需严格按顺序布防,否则规则会失效。
明确防护逻辑和关键参数
目标是:对 60 秒内发起 ≥5 次新 SSH 连接(--state NEW)的 IP,自动加入黑名单并封禁 300 秒。整个过程分四步闭环:
-
检查是否已在黑名单:若命中
--rcheck --seconds 300,立即DROP -
更新时间戳:若已在列表中,用
--update刷新最后访问时间(用于续期) -
首次记录:若未在列表,用
--set加入,并打上源 IP 标记(--rsource) -
触发封禁:同一 IP 在 60 秒内累计达 5 次新连接,则执行
DROP并自动写入黑名单
按顺序插入 INPUT 链的完整规则
顺序不可颠倒,否则会漏判或误封。以下命令逐条执行(建议先测试,再保存):
# 1. 已在300秒黑名单?直接丢弃
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 --update --seconds 300 -j ACCEPT</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill8828" title="Obsidian (Linux)"><img
src="https://img.php.cn/upload/skill/000/000/081/179228531040284.jpg" alt="Obsidian (Linux)" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill8828" title="Obsidian (Linux)">Obsidian (Linux)</a>
<p>操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。</p>
</div>
<a href="/xiazai/skill8828" title="Obsidian (Linux)" 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 -m recent --name ssh_attack --set --rsource</p><h1>4. 60秒内满5次?丢弃并确保进入黑名单(--rcheck 后接 --set 是关键)</h1><p>iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_attack --rcheck --seconds 60 --hitcount 5 -j DROP
说明:第 4 条规则中的 --rcheck 实际是“查是否已满足条件”,配合前面的 --set,能确保该 IP 被稳定写入哈希表;第 2 条的 --update 可防止有效访问被误封——只要 300 秒内还有合法新连接,黑名单就自动延续。
验证与日常维护要点
模块必须已加载,且规则要持久化:
- 检查模块:
lsmod | grep xt_recent,若无输出则运行modprobe xt_recent - 查看当前黑名单:
cat /proc/net/xt_recent/ssh_attack(显示 IP 和最后匹配时间) - 清空列表(调试用):
echo : > /proc/net/xt_recent/ssh_attack - 保存规则(CentOS/RHEL):
service iptables save或iptables-save > /etc/sysconfig/iptables - 注意:不要和 fail2ban 共用同一
--name,避免冲突;如需共存,给recent单独起名(如ssh_recent)
它适合什么场景,又有哪些限制
recent 是轻量级实时防御,不是万能方案:
- ✅ 适合:突发性、短周期、高频率的扫描式爆破(如每秒多个新连接)
- ✅ 优势:零日志依赖、毫秒级响应、不占 CPU、规则简洁
- ❌ 不适合:慢速长期试探(如每小时1次)、跨多台服务器协同攻击、需要长期封禁或IP画像分析
- ⚠️ 注意:默认哈希表最多存 100 个 IP,若攻击源极多,老 IP 会被自动踢出;可通过
ip_list_tot=500参数调整(需重新加载模块)

















