买了 VPS 却连不上?别慌,这事儿太常见了。我自己玩 VPS 这几年,SSH 连接问题遇到过不下几十次,有些坑踩过好多遍才记住。今天把这些经验整理出来,帮你快速定位问题。
在开始复杂的排查之前,先检查这几个最容易犯的错误:
这听起来很傻,但我真见过不少人把 IP 抄错了。特别是刚开的 VPS,邮件里那串 IP 看花眼很正常。
# 标准 SSH 连接命令
ssh root@你的IP地址
# 如果端口不是 22
ssh -p 端口号 root@你的IP地址
很多 VPS 服务商为了安全,默认 SSH 端口就不是 22。搬瓦工默认给的就是随机高端口,Vultr 和 Linode 倒是还用 22。记得去后台看一眼实际的端口号。
服务商发的初始密码通常又臭又长,类似 xK9#mP2$vL5@nQ8 这种。复制的时候最容易出问题的是:
- 前后多了空格
- 特殊字符被吞掉了
- 只复制了一部分
建议直接用密码管理器,或者手动一个字符一个字符对着敲一遍。
去服务商后台确认一下 VPS 状态是 Running。有时候忘记续费被停机了,或者重装系统还没完成,都会导致连不上。
基本检查都没问题,那就得往深了查了。
ping 你的IP地址
能 ping 通但 SSH 连不上:说明网络是通的,问题出在 SSH 服务或者防火墙。
ping 不通:可能是这几种情况:
- IP 被墙了 - 国内常见问题,特别是用来做某些事情的 VPS
- 服务商的网络问题 - 机房故障或者维护
- 本地网络问题 - 公司或学校网络可能有限制
判断是不是被墙,可以用手机流量或者换个网络环境试试。如果手机 4G 能 ping 通,家里宽带不行,那多半是运营商的问题。
# Linux/Mac
nc -zv 你的IP地址 22
# 或者用 telnet
telnet 你的IP地址 22
如果提示 "Connection refused",说明端口没开或者服务没跑起来。如果一直卡着没反应,可能是防火墙挡住了。
也可以用在线工具检测,搜 "port checker online" 随便找一个网站测试。
确认网络没问题后,该看 SSH 服务了。但这时候你连不上 VPS,怎么检查?
几乎所有 VPS 服务商都提供 Web 控制台或者 VNC 功能,在后台找 "Console" 或 "VNC" 按钮。通过这个方式可以直接操作 VPS,不依赖 SSH。
登录进去后:
# 检查 SSH 服务状态
systemctl status sshd
# 如果没运行,启动它
systemctl start sshd
# 设置开机自启
systemctl enable sshd
SSH 登录失败的原因都会记录在日志里:
# Debian/Ubuntu
tail -100 /var/log/auth.log
# CentOS/RHEL
tail -100 /var/log/secure
常见的错误信息:
Failed password- 密码错误Connection closed by authenticating user- 认证方式不对Permission denied (publickey)- 只允许密钥登录但你用的密码Too many authentication failures- 尝试次数太多被临时封禁
防火墙是 SSH 连接问题的重灾区,特别是自己折腾过安全配置的。
# 查看当前规则
iptables -L -n
# 如果规则太乱,先允许 SSH
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# 如果端口改过
iptables -I INPUT -p tcp --dport 你的SSH端口 -j ACCEPT
# 查看状态
firewall-cmd --state
# 查看开放的端口
firewall-cmd --list-ports
# 开放 SSH 端口
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --reload
# 查看状态
ufw status
# 允许 SSH
ufw allow ssh
# 或者指定端口
ufw allow 22/tcp
有个血泪教训:改防火墙规则之前,一定要保持一个已连接的会话。我有一次改 iptables 把自己锁外面了,只能重装系统。
SSH 配置改错了也会导致连不上。
cat /etc/ssh/sshd_config | grep -v "^#" | grep -v "^$"
重点关注这几项:
Port 22 # 端口号
PermitRootLogin yes # 是否允许 root 登录
PasswordAuthentication yes # 是否允许密码登录
PubkeyAuthentication yes # 是否允许密钥登录
如果 PermitRootLogin 是 no,那用 root 就登不上。如果 PasswordAuthentication 是 no,那只能用密钥。
修改配置后记得重启服务:
systemctl restart sshd
改配置文件手抖写错了,SSH 服务可能起不来。检查语法:
sshd -t
没输出就是没问题,有错误会显示具体哪行有问题。
用 SSH 密钥登录更安全,但配置不对也很头疼。
SSH 对文件权限要求很严格:
# 服务器端
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 本地
chmod 600 ~/.ssh/id_rsa
权限太宽松(比如 777),SSH 会拒绝使用这些文件。
公钥要加到 ~/.ssh/authorized_keys 文件里,每个公钥一行。检查一下:
cat ~/.ssh/authorized_keys
确保:
- 公钥是完整的一行,没有换行符截断
- 格式正确,以
ssh-rsa或ssh-ed25519开头
如果有多个密钥,连接时要指定:
ssh -i ~/.ssh/my_custom_key root@你的IP
密码输错几次,fail2ban 会临时封禁你的 IP。用 VNC 登录后:
# 查看被封的 IP
fail2ban-client status sshd
# 解封
fail2ban-client set sshd unbanip 你的本地IP
检查是否被加入黑名单:
cat /etc/hosts.deny
如果看到你的 IP 或者 ALL: ALL 这种,删掉或者注释掉。
CentOS 上 SELinux 有时候会挡 SSH,特别是改了非标准端口之后:
# 查看 SELinux 状态
getenforce
# 临时关闭
setenforce 0
# 或者允许新端口
semanage port -a -t ssh_port_t -p tcp 你的新端口
磁盘空间不足会导致各种奇怪问题:
df -h
如果根分区用了 100%,SSH 可能无法正常工作。清理一些日志文件或者临时文件。
遇到 SSH 连不上,按这个顺序排查效率最高:
- 确认 IP、端口、密码 - 最容易犯的错
- Ping 测试 - 判断网络层是否通
- 端口检测 - 看 SSH 端口是否开放
- VNC 登录 - 绕过 SSH 直接操作
- 检查 SSH 服务 - 确认服务在运行
- 看日志 - 找到具体报错原因
- 检查防火墙 - iptables/firewalld/ufw
- 检查 SSH 配置 - sshd_config 有没有改错
- 检查权限 - 特别是密钥相关文件
与其事后排查,不如提前预防:
- 改配置前保持连接 - 开一个会话别关,改完在新窗口测试
- 备份配置文件 -
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak - 设置备用端口 - sshd_config 可以监听多个端口
- 保存 VNC 访问方式 - 记下后台地址和密码
折腾 VPS 这么久,SSH 连接问题我基本都遇到过。大部分情况按上面的流程查一遍就能解决。实在搞不定,服务商工单也是个办法,毕竟他们能看到更底层的日志。
