云主机SSH连接失败是一个常见问题,别着急,我们可以按照“从外到内、由简到繁” 的逻辑,系统地排查,下图清晰地展示了排查的核心路径与关键检查点:
flowchart TD
A[SSH连接失败] --> B{第一阶段:基础检查}
B --> C[网络可达性<br>ping/端口扫描]
B --> D[IP、用户名、端口<br>确认无误]
B --> E[防火墙/安全组<br>放行22端口]
C & D & E --> F{问题是否解决?}
F -- 否 --> G{第二阶段:服务端状态}
G --> H[云控制台检查<br>实例运行/控制台登录]
G --> I[SSH服务状态<br>systemctl status sshd]
G --> J[磁盘空间是否已满<br>df -h]
H & I & J --> K{问题是否解决?}
K -- 否 --> L{第三阶段:配置与密钥}
L --> M[SSH配置检查<br>/etc/ssh/sshd_config]
L --> N[密钥与权限<br>.ssh目录权限]
L --> O[详细日志排查<br>/var/log/auth.log]请根据上图的指引,逐项检查以下具体步骤:
1、检查IP地址、用户名、端口号
IP地址确认是公网IP(弹性公网IP),而不是私有IP。
用户名确认登录用户名正确(Linux系统通常是root,ubuntu,ec2-user 等,取决于镜像)。
端口默认是22,如果你修改过SSH端口,请使用-p 参数指定。
2、检查网络连通性
ping测试在本地终端执行ping <你的公网IP>,如果超时,可能是:
* 云服务器已关机/被释放。
* 云服务器的安全组/防火墙规则禁用了ICMP(ping),这不一定影响SSH,但能说明网络层可能有问题。
* 你的本地网络有问题。
端口连通性测试使用telnet 或nc 命令检查SSH端口是否开放。
telnet <你的公网IP> 22
# 或
nc -zv <你的公网IP> 22* 如果连接被拒绝,说明端口未开放或服务未监听。
* 如果超时,说明网络不通或防火墙完全拦截。
3、检查云服务商安全组/防火墙规则
这是最常见的原因!
* 登录到云服务商的控制台(阿里云、腾讯云、AWS等)。
* 找到你的云主机实例,查看其绑定的安全组(Security Group)。
* 确保有一条入方向(Inbound) 规则,允许TCP 协议,端口为22(或你自定义的SSH端口),源地址(Source)通常设置为0.0.0.0/0(允许所有IP)或你指定的IP段以增加安全性。
4、检查云主机运行状态
* 在控制台确认实例处于“运行中” 状态。
* 检查系统监控,看CPU、内存、带宽 是否飙高导致服务无响应。
5、使用云控制台的VNC或“连接管理”功能
* 所有主流云厂商都提供通过浏览器直接登录到服务器控制台的功能(如阿里云的VNC、AWS的Instance Connect、腾讯云的VNC)。
这是关键的救命通道! 用它登录后,你可以在系统内部进行排查。
6、在系统内部检查SSH服务
通过VNC登录后,执行以下命令
# 1. 检查SSH服务是否运行
systemctl status sshd # 适用于Systemd系统(CentOS 7+, Ubuntu 16.04+)
# 或
service sshd status # 旧版系统
# 2. 如果未运行,尝试启动
sudo systemctl start sshd
sudo systemctl enable sshd # 设置开机自启
# 3. 检查SSH监听的端口
sudo netstat -tlnp | grep sshd
# 应该能看到类似:tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN7、检查系统内部防火墙
CentOS/RHEL/Fedora (firewalld):
sudo firewall-cmd --list-all # 查看规则
sudo firewall-cmd --permanent --add-port=22/tcp # 添加规则(如果缺失)
sudo firewall-cmd --reloadUbuntu/Debian (ufw):
sudo ufw status
sudo ufw allow 22/tcp
sudo ufw reloadIPTables (通用):
sudo iptables -L -n # 查看规则
# 临时允许22端口(谨慎操作,可能导致自己断开)
sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT8、检查系统资源
磁盘空间是否已满df -h,如果根分区(/)使用率100%,SSH可能无法登录,需要清理日志或大文件。
内存/CPU是否耗尽top 或htop,可能因资源耗尽导致进程崩溃。
9、检查SSH服务配置文件
编辑/etc/ssh/sshd_config 文件,检查以下关键参数
Port 22 # 确认端口
PermitRootLogin yes # 是否允许root登录(建议设为prohibit-password或no)
PasswordAuthentication yes # 是否允许密码登录(如果使用密钥登录,可设为no)
PubkeyAuthentication yes # 是否启用公钥认证修改后必须重启SSH服务sudo systemctl restart sshd
10、检查SSH密钥或密码
密钥登录确认本地私钥文件路径正确,且权限为600,检查服务器上对应用户的~/.ssh/authorized_keys 文件权限是否为644或600,并且公钥内容正确。
密码登录确认密码正确,且服务器配置允许密码登录。
11、查看SSH日志
* 在服务器上查看SSH相关日志,能获得最直接的错误信息。
# 查看实时日志(尝试连接时观察)
sudo tail -f /var/log/secure # CentOS/RHEL
sudo tail -f /var/log/auth.log # Ubuntu/Debian12、尝试使用其他用户或方式登录
* 如果只是某个用户无法登录(如root),尝试用另一个有sudo权限的用户登录。
* 如果完全无法通过SSH连接,只能依赖第5步的VNC控制台。
13、重置密码或密钥(云平台功能)
* 大多数云平台支持在控制台“重置实例密码” 和“绑定/替换SSH密钥对”,这是一个有效的恢复手段,但通常需要重启实例。
14、回滚或恢复系统
如果怀疑是系统配置损坏(如错误地修改了/etc/ssh/sshd_config),且无法通过VNC修复
* 如果有系统盘快照,可以回滚到快照。
* 将系统盘挂载到另一台健康的实例上,修复配置文件后再挂载回来。
1. 查状态 systemctl status sshd netstat -tlnp | grep :22 2. 查防火墙 systemctl status firewalld ufw status iptables -L -n 3. 查资源 df -h top 4. 查配置 cat /etc/ssh/sshd_config | grep -E "(Port|PermitRootLogin|PasswordAuthentication|PubkeyAuthentication)" 5. 查日志 tail -50 /var/log/secure 或 /var/log/auth.log
核心建议:遇到问题,首先使用云控制台的VNC功能 登录服务器,这是所有后续排查的基础,然后按照网络(安全组)-> 服务状态 -> 内部防火墙 -> 配置文件 -> 日志 的顺序,一步步缩小问题范围。
文章摘自:https://idc.huochengrm.cn/zj/24611.html
评论