Linux 服务器 SSH 连接超时/拒绝连接的 10 种排查方法

摘要:SSH 连接失败是服务器运维中最常见的问题之一,错误原因多样,从防火墙拦截、端口修改、密钥权限错误,到 SSH 服务未启动,每种情况处理方式完全不同。本文整理 10 种最常见的 SSH 连接失败原因,每种附完整排查命令,帮你 5 分钟内定位并解决问题。


常见 SSH 错误信息速查表

遇到 SSH 报错时,先对照下表快速定位原因:

错误信息最可能的原因跳转到
Connection timed out防火墙/安全组拦截、端口错误、网络不通方法一 / 方法三 / 方法四
Connection refusedSSH 服务未启动、端口被修改方法一 / 方法二
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
💡 提示:如果你用的是后浪云控制面板,可以在「服务器详情」页面找到当前 SSH 端口配置。

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
💡 注意:Ubuntu 系统的服务名可能是 ssh 而非 sshd,执行 systemctl status ssh 检查。

3 检查防火墙是否拦截了 SSH 端口

Connection timed out 最常见的原因是防火墙拦截。Linux 常见防火墙有 iptablesfirewalld 两种。

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 端口)。

⚠️ 常见误区:很多人在服务器内部反复检查 iptables,却忘了云平台安全组才是第一道关卡。如果 telnet 测试超时但服务器本身正常运行,90% 是安全组问题。

5 检查 SSH 配置文件是否有误

SSH 主配置文件 /etc/ssh/sshd_config 中的错误配置会导致登录被拒绝,常见问题包括禁用了密码登录、限制了登录用户等。

# 查看关键配置项
grep -E "Port|PermitRootLogin|PasswordAuthentication|AllowUsers|PubkeyAuthentication" /etc/ssh/sshd_config

常见问题配置及修复:

配置项可能导致的问题推荐值
PermitRootLogin noroot 用户无法 SSH 登录改为 yesprohibit-password
PasswordAuthentication no密码登录被禁用改为 yes(如需密码登录)
AllowUsers user1只允许 user1 登录,其他用户被拒添加你的用户名或删除此行
Port 2222SSH 端口已被修改,连 22 无效-p 2222 参数连接
# 修改配置后,重启 SSH 服务使配置生效
systemctl restart sshd

# 修改前先测试配置文件语法是否正确,避免重启后无法登录
sshd -t
# 无输出表示配置正常
⚠️ 重要:修改 sshd_config 之前,务必保留一个已有的 SSH 连接窗口不要关闭,防止配置出错导致自己被锁在外面。

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/(目录)700SSH 拒绝使用密钥
~/.ssh/id_rsa(私钥)600SSH 报 WARNING 并拒绝
~/.ssh/id_rsa.pub(公钥)644通常无影响
~/.ssh/authorized_keys600服务器拒绝密钥认证

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
💡 提示:hosts.allow 优先级高于 hosts.deny。将 IP 加入 allow 后,即使 deny 中有封禁规则,该 IP 仍可访问。

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"
预防建议:将你的固定办公 IP 加入 Fail2Ban 白名单,避免误封。编辑 /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
⚠️ 注意:如果根分区(/)使用率达到 100%,很多服务会出现异常,不只是 SSH。此时需要紧急清理日志或扩容磁盘。

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 keydenied公钥未被服务器接受方法六
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)

对于独立服务器,可以申请进入救援模式,挂载系统盘后修改配置文件,无需正常启动系统即可解决问题。联系后浪云技术支持可协助开启救援模式。

后浪云用户提示:登录 my.idc.net 控制面板,找到服务器的「VNC 控制台」入口,可在 SSH 不可用时紧急登录修复配置。

如何预防 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 保活选项,避免连接因超时被断开,同时减少重连次数。

THE END