1. 问题现象与初步排查
远程服务器连接失败是运维工作中最常见的问题之一,但每次遇到时依然让人抓狂。最近我在维护一个分布式系统时,就遇到了三台服务器突然集体"失联"的情况。通过一系列排查,最终发现是防火墙策略被误修改导致的。下面我将完整复盘这次故障排查的全过程,并总结出一套系统性的排查方法。
当发现远程连接失败时,首先要做的是确认具体的错误现象。常见的连接错误包括:
- SSH连接超时(Connection timed out)
- 连接被拒绝(Connection refused)
- 认证失败(Authentication failed)
- 连接中断(Broken pipe)
每种错误背后对应着不同的问题原因。比如超时通常与网络连通性有关,而被拒绝则可能意味着服务未运行或端口被阻止。
2. 网络连通性检查
2.1 基础网络测试
首先使用ping命令测试基础网络连通性:
ping server_ip如果ping不通,说明可能存在:
- 服务器宕机
- 网络路由问题
- 服务器防火墙丢弃ICMP包
注意:有些服务器默认配置会禁用ping响应,所以ping不通不一定代表服务器离线
2.2 端口可用性检测
使用telnet或nc测试具体端口:
telnet server_ip 22 # 或 nc -zv server_ip 22如果端口不可达,但ping是通的,则可能是:
- 目标服务未运行
- 本地或服务器防火墙阻止
- 中间网络设备拦截
3. 服务状态排查
3.1 检查服务运行状态
如果能够物理接触服务器,直接检查服务状态:
systemctl status sshd # 或 service sshd status常见问题包括:
- 服务崩溃(显示inactive)
- 配置错误导致启动失败(显示failed)
- 端口冲突(查看日志确认)
3.2 检查监听端口
使用netstat或ss查看服务是否正常监听:
netstat -tulnp | grep ssh # 或 ss -tulnp | grep ssh正常应该看到类似:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd如果监听地址是127.0.0.1,说明服务只绑定了本地回环,需要修改配置文件。
4. 防火墙与安全组配置
4.1 本地防火墙检查
查看iptables/nftables规则:
iptables -L -n # 或 nft list ruleset特别注意INPUT链中是否有针对SSH端口(默认22)的限制。
4.2 云平台安全组
如果是云服务器,检查安全组规则:
- 入方向是否开放22端口
- 源IP限制是否过于严格
- 规则优先级是否导致冲突
4.3 SELinux影响
检查SELinux状态和策略:
sestatus getsebool -a | grep ssh有时SELinux会阻止非标准端口的SSH连接。
5. 认证问题排查
5.1 检查服务端日志
查看SSH服务的详细日志:
journalctl -u sshd -n 50 --no-pager # 或 tail -f /var/log/auth.log常见认证错误包括:
- 密码错误次数过多被暂时封锁
- 密钥文件权限不正确
- 用户被锁定或不存在
5.2 客户端调试模式
使用-vvv参数启动详细调试:
ssh -vvv user@server_ip这会显示详细的连接过程,可以精确看到在哪一步失败。
6. 高级网络问题
6.1 连接跟踪问题
对于频繁断开的连接,可能是连接跟踪表满了:
cat /proc/sys/net/netfilter/nf_conntrack_max sysctl -a | grep conntrack6.2 TCP参数调优
某些网络环境下需要调整TCP参数:
echo 15 > /proc/sys/net/ipv4/tcp_keepalive_time echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes echo 5 > /proc/sys/net/ipv4/tcp_keepalive_intvl7. 系统资源检查
7.1 内存与OOM
检查系统是否因内存不足而终止进程:
dmesg | grep oom7.2 文件描述符限制
查看SSH服务的文件描述符限制:
cat /proc/$(pgrep sshd)/limits8. 配置备份与恢复
8.1 备份关键配置
定期备份重要配置文件:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak8.2 安全回滚方案
准备应急恢复方案:
- 保留物理控制台访问
- 配置备用管理通道(如串口控制台)
- 设置配置变更的自动告警
9. 自动化监控方案
9.1 心跳检测脚本
编写自动化检测脚本:
#!/bin/bash if ! nc -zw1 server_ip 22; then echo "SSH down!" | mail -s "Alert" admin@example.com fi9.2 集中日志分析
配置ELK或Graylog收集所有服务器的auth日志,便于统一分析认证问题。
10. 经验总结与最佳实践
经过这次排查,我总结了几个关键经验:
- 变更管理要严格,特别是防火墙规则的修改
- 保留至少两种不同的服务器管理通道
- 重要配置修改前先备份并制定回滚方案
- 建立完善的监控告警系统
对于关键业务服务器,建议:
- 配置带外管理(如iDRAC/iLO)
- 设置备用管理网络
- 定期测试灾难恢复流程
最后分享一个实用技巧:在/etc/hosts.allow中添加可信IP,可以避免被意外封锁:
sshd: 192.168.1.0/24 sshd: 10.0.0.5