iptables -m recent 实现“敲门暗语”式 ssh 开放,本质是通过预设端口(如50001)接收 syn 包将源 ip 加入白名单,5分钟内允许其访问22端口;规则顺序为:先记录敲门、再放行已敲门的 ssh 新连接、最后拒绝未敲门的 ssh 连接。

用 iptables -m recent 实现“敲门暗语”式 SSH 开放,本质是让某个特定端口(如 50001)成为“开门信号”:只有先向它发一个 SYN 包,源 IP 才被临时加入白名单;之后该 IP 才能正常连接 22 端口。整个过程不依赖 SSH 配置、不改服务监听、纯内核级控制,响应快且隐蔽。
核心原理:两次握手触发权限升级
“敲门”不是登录,而是触发一条规则——当某 IP 向预设的“暗语端口”发起新连接(--syn),iptables 就把它记入 recent 列表;后续匹配 SSH 规则时,检查该 IP 是否在列表中,是则放行。关键点有三个:
- 暗语端口只收 SYN,不提供真实服务,也不回应应用层数据
- recent 列表只存源 IP,不验证内容,所以“敲门”只需 telnet 或 nc 发个连接即可
- SSH 规则必须严格放在“敲门记录规则”之后,且优先于默认 DROP
具体配置步骤(以端口 50001 为暗语端口)
按顺序执行以下命令(建议用 -I 插入 INPUT 链顶部,避免被其他 ACCEPT 规则绕过):
- 记录“敲门”行为:
iptables -I INPUT -p tcp --dport 50001 --syn -m recent --set --name ssh_open --rsource -j REJECT --reject-with tcp-reset
这条规则捕获 SYN,把源 IP 加入名为 ssh_open 的列表,并立即拒绝连接(返回 RST,客户端无感知) - 允许已“敲门”的 IP 访问 SSH:
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --name ssh_open --rcheck --seconds 300 -j ACCEPT
表示:过去 5 分钟内敲过门的 IP,可新建 SSH 连接 - 确保基础连接通路(放在上述两条之后):
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j DROP
堵住所有未敲门的 SSH 新连接;再配合 ESTABLISHED 规则保障已有会话不断连
如何验证和日常使用
敲门是否生效,不看日志,直接查内核状态:
- 执行 cat /proc/net/xt_recent/ssh_open,若输出类似 src=192.168.1.100 ttl: 298,说明该 IP 已登记且剩余有效期约 5 分钟
- 从目标机器外执行 nc -zv your-server-ip 50001 或 telnet your-server-ip 50001,只要显示 “Connected” 或 “OK”,即完成敲门
- 随后立刻执行 ssh user@your-server-ip,应能正常建立连接
安全增强建议
“敲门”机制本身不加密、不认证,适合内网或配合其他防护使用。可加几项提升实际安全性:
- 限制暗语端口仅对可信网段开放:
iptables -I INPUT -p tcp -s 10.0.0.0/8 --dport 50001 --syn -m recent ... - 缩短白名单有效期(如 --seconds 120),避免长期暴露
- 搭配默认 DROP 策略使用,确保没敲门就完全不可见 SSH 端口
- 定期清理列表(脚本化):
echo 1 > /proc/net/xt_recent/ssh_open 可清空全部记录











