You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

端口敲门(Port Knocking)配置后无法连接SSH的问题排查求助

端口敲门(Port Knocking)配置后无法连接SSH的问题排查求助

先帮你梳理下当前配置里的几个关键问题,以及对应的排查和修正步骤:

一、防火墙规则的核心问题

看你贴的iptables规则,首先顺序和逻辑都有明显错误:

  1. 规则顺序完全颠倒

    • 你把ACCEPT all -- anywhere anywhere放在了SSH规则之后,这条规则会直接允许所有入站流量,等于前面的端口敲门规则完全失效;但你的INPUT默认策略是DROP,这又产生矛盾——按道理这条规则应该让所有流量都能进来,但你却连不上SSH,大概率是这条规则的位置或者实际生效有问题。
    • 另外,ctstate RELATED,ESTABLISHED这条规则应该放在INPUT链的最顶端,用来允许已经建立的连接的后续数据包,否则就算你侥幸连上SSH,后续的交互数据包也会被防火墙丢弃。
  2. 端口敲门的逻辑搞反了

    • 你当前的第二个规则是:访问2002端口时,如果源IP在RECENT列表里(也就是已经敲过1001),就DROP这个连接——这完全和预期逻辑相反!我们需要的是:敲完1001后,敲2002时验证身份并更新列表,而不是拒绝。
    • 虽然SSH规则是检查RECENT列表后允许,但前面的规则顺序和逻辑错误,导致即使你完成了敲门序列,也触发不了允许SSH的条件。

二、具体修正和排查步骤

1. 调整并修正防火墙规则

先把规则顺序和逻辑改对,示例如下(你可以根据实际情况调整):

# 先清空现有规则(谨慎操作,远程连接的话建议先在本地测试)
iptables -F
iptables -X

# 重新配置INPUT链
iptables -P INPUT DROP
# 1. 允许已建立的连接和相关流量
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 2. 允许本地回环(可选但建议)
iptables -A INPUT -i lo -j ACCEPT
# 3. 第一步敲门:访问1001端口,将源IP加入RECENT列表,同时丢弃这个连接(不需要实际建立)
iptables -A INPUT -p tcp --dport 1001 -m recent --set --name KNOCK --rsource -j DROP
# 4. 第二步敲门:访问2002端口,检查源IP是否在KNOCK列表里,在的话更新列表并丢弃连接
iptables -A INPUT -p tcp --dport 2002 -m recent --check --name KNOCK --rsource --seconds 60 -j DROP
iptables -A INPUT -p tcp --dport 2002 -m recent --set --name KNOCK --rsource -j DROP
# 5. 允许SSH:只有源IP在KNOCK列表里,才允许访问22端口
iptables -A INPUT -p tcp --dport ssh -m recent --check --name KNOCK --rsource --seconds 60 -j ACCEPT

# 保存规则(不同系统命令不同,比如Debian用iptables-save > /etc/iptables/rules.v4,CentOS用service iptables save)

2. 测试敲门流程

  • 先清空服务器上的RECENT列表,避免旧数据干扰:
    echo "" > /proc/net/xt_recent/KNOCK
    
  • 然后在本地执行敲门命令:
    # 第一步敲1001
    nc -zv your_server_ip 1001
    # 等待2秒
    sleep 2
    # 第二步敲2002
    nc -zv your_server_ip 2002
    # 等待2秒后尝试SSH
    sleep 2
    ssh user@your_server_ip
    

3. 额外排查点

  • 确认iptables规则是否生效:执行iptables -L -n查看当前规则,确保修改后的规则已经正确加载。
  • 检查是否有其他防火墙工具在运行:比如ufw、firewalld,这些可能会覆盖iptables规则,需要先停用或者同步配置。
  • 验证SSH服务状态:执行systemctl status sshd(或者systemctl status ssh),确保服务正常监听22端口。
  • 查看系统日志:检查/var/log/auth.log(Debian/Ubuntu)或者/var/log/secure(RHEL/CentOS),里面会有SSH连接的详细日志,能帮你定位是被防火墙拒绝还是SSH本身的问题。

备注:内容来源于stack exchange,提问作者noobintech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 13:14:31