Linux 服务器 SSH 连接超时/拒绝连接的 10 种排查方法
- 常见错误信息速查表
- 方法一:确认服务器 IP 和端口是否正确
- 方法二:检查 SSH 服务是否正在运行
- 方法三:检查防火墙是否拦截了 SSH 端口
- 方法四:检查云服务商安全组规则
- 方法五:检查 SSH 配置文件是否有误
- 方法六:检查密钥权限是否正确
- 方法七:检查 hosts.deny / hosts.allow 是否封锁了 IP
- 方法八:检查 Fail2Ban 是否封禁了你的 IP
- 方法九:检查磁盘空间是否已满
- 方法十:使用详细模式定位未知错误
- 紧急情况:被完全锁定怎么办?
- 如何预防 SSH 连接问题?
- 常见问题解答(FAQ)
常见 SSH 错误信息速查表
遇到 SSH 报错时,先对照下表快速定位原因:
| 错误信息 | 最可能的原因 | 跳转到 |
|---|---|---|
Connection timed out | 防火墙/安全组拦截、端口错误、网络不通 | 方法一 / 方法三 / 方法四 |
Connection refused | SSH 服务未启动、端口被修改 | 方法一 / 方法二 |
Permission denied (publickey) | 密钥不匹配、密钥权限错误 | 方法六 |
Permission denied (password) | 密码错误、禁用了密码登录 | 方法五 |
Host key verification failed | 服务器指纹变更(重装系统后) | 方法十 |
Too many authentication failures | 尝试次数过多被封禁 | 方法八 |
No route to host | 网络路由问题、服务器宕机 | 方法一 |
| 连接成功但立即断开 | 磁盘满、Shell 配置文件错误 | 方法九 |
1 确认服务器 IP 和端口是否正确
最基础但最常被忽略的问题。默认 SSH 端口是 22,但很多服务商或运维人员出于安全考虑会修改端口。
排查步骤:
# 用 telnet 测试端口是否可达(本地执行) telnet 你的服务器IP 22 # 如果 22 不通,尝试常见替换端口 telnet 你的服务器IP 2222 telnet 你的服务器IP 22222 # 用 nmap 扫描开放端口(需本地安装 nmap) nmap -p 1-65535 你的服务器IP
指定端口连接:
ssh -p 2222 root@你的服务器IP
2 检查 SSH 服务是否正在运行
SSH 服务(sshd)未启动或崩溃是 Connection refused 的直接原因。需要通过控制台或 VNC 登录服务器检查。
# 检查 sshd 服务状态(systemd 系统,如 Ubuntu 16+、CentOS 7+、Debian 8+) systemctl status sshd # 如果未运行,启动服务 systemctl start sshd # 设置开机自启 systemctl enable sshd # 查看 sshd 启动日志,找到报错原因 journalctl -u sshd -n 50 --no-pager
ssh 而非 sshd,执行 systemctl status ssh 检查。3 检查防火墙是否拦截了 SSH 端口
Connection timed out 最常见的原因是防火墙拦截。Linux 常见防火墙有 iptables 和 firewalld 两种。
iptables 检查与放行:
# 查看当前 iptables 规则 iptables -L -n --line-numbers # 放行 22 端口(SSH 默认端口) iptables -I INPUT -p tcp --dport 22 -j ACCEPT # 保存规则(CentOS/RHEL) service iptables save # 保存规则(Ubuntu/Debian) iptables-save > /etc/iptables/rules.v4
firewalld 检查与放行(CentOS 7+):
# 检查 firewalld 状态 systemctl status firewalld # 查看已开放的端口 firewall-cmd --list-ports # 永久放行 SSH 端口 firewall-cmd --permanent --add-port=22/tcp firewall-cmd --reload
UFW 检查与放行(Ubuntu):
# 查看 UFW 状态 ufw status # 放行 SSH ufw allow ssh # 或指定端口 ufw allow 22/tcp
4 检查云服务商安全组规则
这是最容易被遗漏的一步!云服务器在操作系统防火墙之外,还有云平台层面的安全组(Security Group)规则。安全组拦截发生在流量到达服务器之前,即使服务器内部防火墙放行了 SSH,安全组封锁仍会导致 Connection timed out。
检查方法:登录后浪云控制面板 → 找到对应服务器 → 查看「安全组」或「防火墙规则」,确认入方向(Inbound)允许 TCP 22 端口(或你自定义的 SSH 端口)。
5 检查 SSH 配置文件是否有误
SSH 主配置文件 /etc/ssh/sshd_config 中的错误配置会导致登录被拒绝,常见问题包括禁用了密码登录、限制了登录用户等。
# 查看关键配置项 grep -E "Port|PermitRootLogin|PasswordAuthentication|AllowUsers|PubkeyAuthentication" /etc/ssh/sshd_config
常见问题配置及修复:
| 配置项 | 可能导致的问题 | 推荐值 |
|---|---|---|
PermitRootLogin no | root 用户无法 SSH 登录 | 改为 yes 或 prohibit-password |
PasswordAuthentication no | 密码登录被禁用 | 改为 yes(如需密码登录) |
AllowUsers user1 | 只允许 user1 登录,其他用户被拒 | 添加你的用户名或删除此行 |
Port 2222 | SSH 端口已被修改,连 22 无效 | 用 -p 2222 参数连接 |
# 修改配置后,重启 SSH 服务使配置生效 systemctl restart sshd # 修改前先测试配置文件语法是否正确,避免重启后无法登录 sshd -t # 无输出表示配置正常
6 检查密钥权限是否正确
SSH 密钥认证对文件权限要求极为严格,权限设置不当会导致 Permission denied (publickey)。
# 本地客户端:检查私钥文件权限 ls -la ~/.ssh/ # 正确权限:私钥文件应为 600,.ssh 目录应为 700 # 修复本地私钥权限 chmod 600 ~/.ssh/id_rsa chmod 700 ~/.ssh # 服务器端:检查 authorized_keys 权限 ls -la ~/.ssh/authorized_keys # 正确权限:authorized_keys 应为 600 # 修复服务器端权限 chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh chown -R $USER:$USER ~/.ssh
密钥权限要求速查:
| 文件 / 目录 | 正确权限 | 错误权限会导致 |
|---|---|---|
~/.ssh/(目录) | 700 | SSH 拒绝使用密钥 |
~/.ssh/id_rsa(私钥) | 600 | SSH 报 WARNING 并拒绝 |
~/.ssh/id_rsa.pub(公钥) | 644 | 通常无影响 |
~/.ssh/authorized_keys | 600 | 服务器拒绝密钥认证 |
7 检查 hosts.deny 是否封锁了你的 IP
Linux 的 TCP Wrappers 机制通过 /etc/hosts.deny 和 /etc/hosts.allow 控制访问,某些自动化安全脚本会把频繁连接的 IP 加入黑名单。
# 查看 hosts.deny 黑名单 cat /etc/hosts.deny # 如果看到类似以下内容,说明你的 IP 被封禁 # sshd: 203.0.113.xx # ALL: ALL (封禁所有 IP) # 查看 hosts.allow 白名单 cat /etc/hosts.allow # 将你的 IP 加入白名单(替换为你的真实 IP) echo "sshd: 203.0.113.xx" >> /etc/hosts.allow # 或者直接清空 hosts.deny(谨慎操作) echo "" > /etc/hosts.deny
8 检查 Fail2Ban 是否封禁了你的 IP
Fail2Ban 是常用的 SSH 暴力破解防护工具,它会自动封禁短时间内多次认证失败的 IP。如果你误输了多次密码,可能把自己的 IP 封了。
# 检查 Fail2Ban 是否在运行 systemctl status fail2ban # 查看当前被封禁的 IP 列表 fail2ban-client status sshd # 解封你的 IP(替换为你的真实 IP) fail2ban-client set sshd unbanip 203.0.113.xx # 查看 Fail2Ban 日志,确认封禁记录 tail -n 50 /var/log/fail2ban.log | grep "Ban"
/etc/fail2ban/jail.local,添加 ignoreip = 127.0.0.1/8 你的IP。9 检查磁盘空间是否已满
磁盘空间耗尽会导致一个奇怪的现象:SSH 连接成功建立,但立即被断开,且没有任何错误提示。原因是 sshd 需要写入日志文件,磁盘满了导致写入失败,进而终止连接。
# 检查磁盘使用情况 df -h # 找出占用空间最大的目录 du -sh /* 2>/dev/null | sort -rh | head -20 # 清理常见大文件:系统日志 journalctl --vacuum-size=200M # 清理 apt 缓存(Debian/Ubuntu) apt clean # 清理 yum 缓存(CentOS/RHEL) yum clean all # 找出超过 100MB 的大文件 find / -type f -size +100M 2>/dev/null
10 使用详细模式定位未知错误
当以上方法都无法定位问题时,使用 SSH 的 verbose 详细模式,它会输出每一步握手细节,帮你精准找到失败环节。
# -v 基础详细模式 ssh -v root@你的服务器IP # -vv 更详细 ssh -vv root@你的服务器IP # -vvv 最详细(排查复杂问题时使用) ssh -vvv root@你的服务器IP
重点关注输出中的关键字:
| 输出关键字 | 含义 | 下一步 |
|---|---|---|
Connecting to ... port 22 后无响应 | 端口不通,防火墙或安全组拦截 | 方法三 / 方法四 |
Connection refused | 端口通但服务未监听 | 方法二 |
Offering public key 后 denied | 公钥未被服务器接受 | 方法六 |
No more authentication methods | 所有认证方式均失败 | 方法五 / 方法六 |
Host key verification failed | 服务器指纹变更 | 删除 known_hosts 对应行 |
# 解决 Host key verification failed:删除旧指纹 ssh-keygen -R 你的服务器IP # 然后重新连接,输入 yes 接受新指纹
紧急情况:被完全锁定怎么办?
如果以上方法都无法解决,且你已经无法通过 SSH 连入服务器,还有以下两条救命路径:
方案一:使用控制台 VNC 登录
后浪云等主流云服务商在控制面板中提供 VNC 控制台(网页版终端),即使 SSH 完全不可用,也能直接操作服务器。进入控制面板 → 找到服务器 → 点击「VNC 控制台」或「远程连接」,使用 root 密码登录后执行排查命令。
方案二:救援模式(Recovery Mode)
对于独立服务器,可以申请进入救援模式,挂载系统盘后修改配置文件,无需正常启动系统即可解决问题。联系后浪云技术支持可协助开启救援模式。
如何预防 SSH 连接问题?
- 修改默认端口:将 SSH 端口从 22 改为 10000 以上的随机端口,可减少 99% 的自动化暴力破解攻击。
- 禁用密码登录,改用密钥认证:密钥认证安全性远高于密码,且不会被暴力破解。
- 安装 Fail2Ban:自动封禁暴力破解 IP,降低服务器被攻击风险。
- 定期检查磁盘空间:设置磁盘使用率告警(建议 80% 时报警),避免磁盘满导致服务异常。
- 保留备用登录方式:始终确保云平台 VNC 控制台可用,防止 SSH 失效时无路可走。
- 修改配置前保留当前连接:修改 sshd_config 时不要关闭当前 SSH 窗口,确认新配置生效后再关闭旧连接。
常见问题解答(FAQ)
Q1:SSH 连接时一直提示输入密码,密码正确也无法登录,怎么办?
首先确认用户名是否正确(root 还是普通用户),然后检查 sshd_config 中 PasswordAuthentication 是否为 yes,以及 PermitRootLogin 是否允许 root 登录。还可以检查 /var/log/auth.log(Ubuntu)或 /var/log/secure(CentOS)查看具体的认证失败原因。
Q2:我把 SSH 端口改了,忘记是哪个端口了,怎么办?
通过云控制台 VNC 登录服务器,执行 grep "^Port" /etc/ssh/sshd_config 查看当前配置的端口。如果没有 Port 配置行,则默认是 22。
Q3:SSH 连接突然变得很慢(每次要等 30 秒才出现登录提示),怎么解决?
通常是 DNS 反向解析导致的。在 sshd_config 中添加 UseDNS no 并重启 SSH 服务即可解决。另外,GSSAPIAuthentication yes 也可能导致延迟,改为 no 可加速连接。
Q4:如何查看是哪些 IP 在暴力破解我的 SSH?
执行以下命令可查看认证失败记录:
# Ubuntu/Debian grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -20 # CentOS/RHEL grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rn | head -20
Q5:香港服务器的 SSH 连接为什么比国内服务器慢?
香港服务器通过国际线路连接,即使是 CN2 GIA 线路也有 15–50ms 的物理延迟,这是地理距离决定的,无法消除。如需提升体验,可以开启 SSH 的 ServerAliveInterval 60 保活选项,避免连接因超时被断开,同时减少重连次数。
