新服务器迁移后出现 SSH Connection refused 报错,通常是因为新实例的 SSH 服务未启动、云平台安全组未放行 22 端口或监听地址配置错误。优先通过云控制台 VNC 或本地终端登录检查服务状态,避免盲目重启导致配置丢失。
先说结论:Connection refused 表示 TCP 连接请求被目标主机拒绝,核心原因是端口无服务监听或网络策略拦截。
- 先确认:通过云控制台 VNC 登录服务器,检查 sshd 服务是否处于 active 运行状态。
- 先处理:检查云平台安全组入站规则和本地防火墙(firewalld/iptables)是否放行 SSH 端口。
- 再验证:使用 ss -tuln | grep 22 确认端口监听地址为 0.0.0.0 而非仅 127.0.0.1。
命令速用版
以下命令用于在服务器本地(通过控制台登录)快速排查服务状态和端口监听情况。
# 检查 SSH 服务状态
systemctl status sshd
# 查看 22 端口是否监听及监听地址
ss -tuln | grep :22
# 检查防火墙是否放行 22 端口 (CentOS 7+/firewalld)
firewall-cmd `--list-ports` | grep 22
# 临时关闭防火墙测试 (仅排查用,修复后需恢复)
systemctl stop firewalld为什么会这样
Connection refused 错误本质是客户端成功路由到目标 IP,但目标主机的特定端口(默认 22)没有程序监听或连接被内核拒绝。
迁移服务器后出现该问题,常见于新系统镜像默认未启动 SSH 服务、云厂商安全组规则未随 IP 变更同步更新,或 SSH 配置文件中的 ListenAddress 被限制为旧 IP 或本地回环地址。与"Host key verification failed"不同,后者是连接建立后的密钥验证失败,而 Connection refused 发生在 TCP 握手阶段,说明网络包到达了服务器但被丢弃。
分步处理
按照网络层到应用层的顺序排查,每一步操作后需验证结果。
1. 确认服务器网络可达性
在本地终端执行 ping 新服务器 IP,若不通则检查云控制台实例状态及安全组 ICMP 规则。
若 ping 通但 SSH 失败,说明网络层正常,问题集中在传输层或应用层。
2. 检查 SSH 服务运行状态
通过云控制台 VNC 登录服务器,执行 systemctl status sshd。
若显示 inactive (dead),执行 systemctl start sshd 启动服务;若启动失败,查看日志 journalctl -u sshd -n 50 定位配置错误。
3. 验证端口监听配置
执行 ss -tuln | grep :22,确认监听地址为 0.0.0.0:22 或:::22。
若显示 127.0.0.1:22,说明 SSH 仅监听本地,需修改/etc/ssh/sshd_config 中的 ListenAddress 配置为 0.0.0.0 并重启服务。
4. 检查防火墙与安全组
云服务器需在控制台安全组添加入站规则,协议 TCP,端口 22,源地址 0.0.0.0/0 或本地公网 IP。
系统内部防火墙需执行 firewall-cmd `--permanent` `--add-port`=22/tcp 并 reload,或暂时停止防火墙服务测试连通性。
怎么验证是否生效
修复后不要在原终端直接重试,建议新建终端窗口或使用 verbose 模式确认连接细节。
# 使用详细模式连接,观察握手过程
ssh -v user@new_server_ip
# 或使用 nc 测试端口连通性
nc -zv new_server_ip 22若看到 SSH-2.0-OpenSSH 版本号返回,说明端口已通;若仍显示 Connection refused,需复查安全组规则是否生效。
常见坑
迁移场景下容易混淆 IP 变更带来的不同报错,以下是需谨慎处理的边界情况。
- IP 变更与 known_hosts:服务器 IP 变更导致的是"Host key verification failed"而非 Connection refused,此时需清理本地~/.ssh/known_hosts 中旧 IP 记录,不要误判为服务未启动。
- SELinux 拦截:CentOS 系统中 SELinux 可能阻止 SSH 绑定非标准端口,若修改了端口需检查 SELinux 策略。
- 配置语法错误:修改 sshd_config 后未测试语法直接重启,可能导致服务无法启动,建议使用 sshd -t 测试配置。
- 容器与 VM 端口映射:若迁移目标是容器或嵌套 VM,需确认宿主机是否正确转发了 22 端口到内部实例。
常见问题
Connection refused 和 Permission denied 有什么区别?
Connection refused 是网络层拒绝连接,说明端口不通或服务未启动;Permission denied 是应用层认证失败,说明连接已建立但密码或密钥错误。
修改 SSH 端口后连接失败怎么办?
修改端口后必须在客户端命令指定-p 参数,如 ssh -p 2222 user@ip,同时确保防火墙和安全组放行了新端口。
重启 SSH 服务后仍然无法连接怎么办?
检查 journalctl -u sshd 日志,常见原因是配置文件语法错误或密钥权限不正确导致服务启动后立即退出。
参考来源
- CSDN 问答,SSH 连接时提示"Connection refused",可能是什么原因?
- 猫头虎博客,SSH 连接失败 ssh: connect to host port 22: Connection refused”解决大揭秘
- SSH 疑难问题排查:轻松解决连接中的“绊脚石”,2025 年 10 月 15 日资料
- 解决 CentOS 7 使用 SSH 登录时出现 Connection refused 的问题,2024 年 1 月 5 日资料
- 从 Permission denied 到 Connection refused:SSH 连接失败的 7 种典型场景及解决方案