现象:
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 yes、PermitRootLogin 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重新连接 → 成功!
注意:如果文件被
chattr +i锁定,需先执行chattr -i /etc/hosts.allow才能编辑。