一次 SSH 连接被拒的排查血泪史:别再忽略 /etc/hosts.deny

作者:Administrator 发布时间: 2025-12-23 阅读量:13 评论数:0

现象
ssh root@服务器IP 能建立连接,但立刻断开:

Connection established.
Connection closed by foreign host.

同机房其他机器能连,唯独我的公网 IP 不行。
折腾半天防火墙、SSH 配置、SELinux……最后发现罪魁祸首竟是一个被遗忘的安全机制


故障现象

  • 客户端(IP: 183.132.71.**)尝试 SSH 登录服务器;

  • TCP 连接能建立(说明网络通、端口开放);

  • 立即被服务端关闭连接,无密码提示,无认证日志;

  • 同机房其他服务器可正常 SSH 登录该机器;

  • 本地 telnet 127.0.0.1 22 成功,sshd 服务运行正常;

  • iptables 已放行 IP,PasswordAuthentication yes 已配置。

排查过程(踩坑实录)

误区 1:以为是防火墙问题

  • 检查了 iptables,添加了 ACCEPT 规则;

  • 甚至临时清空规则测试 —— 无效

误区 2:以为是 SSH 配置错误

  • 反复确认 PasswordAuthentication yesPermitRootLogin yes

  • 重启 sshd 多次 —— 依然断连

误区 3:怀疑 SELinux / PAM / .bashrc

  • 检查 SELinux:已禁用;

  • 检查 .bashrc:无 exit

  • 查看 /var/log/secure根本没有你的登录记录!

💡 关键线索:日志里连“认证失败”都没有 → 说明连接在到达 SSH 认证前就被拦截了!

真相大白:TCP Wrappers 在“暗中执法”

执行:

cat /etc/hosts.deny

输出:

sshd:all:deny

系统启用了 TCP Wrappers(tcpd) 安全机制:

  • /etc/hosts.deny 中写明:拒绝所有 IP 的 SSH 连接

  • 但 TCP Wrappers 的规则是:先看 hosts.allow,再看 hosts.deny

  • 我的 IP 不在 hosts.allow 中 → 被 hosts.deny 拦截 → 连接静默断开。


解决方案

编辑白名单文件:

echo "sshd: 183.132.71.116" >> /etc/hosts.allow

重启 SSH 服务(部分系统需要):

systemctl restart sshd
  1. 重新连接 → 成功!

注意:如果文件被 chattr +i 锁定,需先执行 chattr -i /etc/hosts.allow 才能编辑。

评论