SSH 提示 `Connection refused` 是什么原因?服务和端口怎么查
SSH 出现 Connection refused 时,重点不是密码,而是目标端口为什么没有 SSH 服务响应。本文从端口监听、服务状态、配置语法和防火墙拒绝几个角度展开。
`Connection refused` 是 SSH 排查里很有指向性的报错。它通常表示目标 IP 能到达,但你连接的端口没有服务接收,或者服务端主动拒绝连接。因此这篇文章不按“从头排查 SSH”来写,而是专门回答一个问题:为什么端口会拒绝连接。
这个报错和超时有什么区别
`Connection timed out` 像是敲门没人回应;`Connection refused` 更像是门口有人明确说“这里没有这个服务”。所以看到 refused 时,优先查端口和服务,而不是先查密码。
| 检查结果 | 说明 | 下一步 |
|---|---|---|
| 端口无监听 | SSH 未启动或监听在其他端口 | 查 `systemctl` 和 `ss` |
| 监听在其他端口 | 客户端连错端口 | 用 `ssh -p` 指定端口 |
| 服务启动失败 | 配置或密钥文件异常 | 查 journal 日志 |
| 只监听 127.0.0.1 | 外部无法访问 | 查 `ListenAddress` |
第一步:确认是不是连错端口
如果服务器 SSH 改成了 2222,连接命令必须写:
ssh -p 2222 root@服务器IP
只输入 `ssh root@服务器IP` 会默认连接 22。很多用户改了 SSH 端口后,忘记改终端工具里的端口,看到的就是拒绝连接。
第二步:看 sshd 是否运行
通过控制台进入服务器后执行:
systemctl status sshd
`active (running)` 表示服务运行中;`failed` 表示启动失败;`inactive` 表示未运行。如果失败,继续看:
journalctl -u sshd -n 100 --no-pager
常见线索包括配置项拼错、端口已被占用、主机密钥文件权限异常。日志里如果出现 `Bad configuration option`,说明配置文件有不被识别的选项;如果出现 bind 相关错误,说明端口绑定失败。
第三步:确认端口实际监听
ss -lntp | grep sshd
如果完全没有输出,说明 SSH 服务没有监听。若看到 `0.0.0.0:2222`,说明外部可以尝试连接 2222。若看到 `127.0.0.1:22`,说明只允许本机连接,外部请求会失败。
也可以指定端口检查:
ss -lntp | grep ':22'
没有输出就代表 22 端口没有监听进程。
第四步:配置修改前先做语法测试
SSH 配置文件通常是:
/etc/ssh/sshd_config
修改后不要马上重启,先执行:
sshd -t
没有输出通常表示语法通过。有输出就先修复。强行重启可能导致本来还能用的 SSH 也起不来。
防火墙会不会导致 refused
多数防火墙拦截更常见的是超时,但某些规则会主动拒绝连接。可以检查:
iptables -S
firewall-cmd --list-all
ufw status
云服务器还要看安全组。端口监听正常,但外部仍然拒绝或不可达时,系统防火墙、面板防火墙和云安全组都要一起看。
最容易出错的操作顺序
不要先关闭旧端口,再测试新端口。更安全的顺序是:先放行新端口,修改 SSH 配置,重启 sshd,另开一个终端测试新端口,确认能登录后再收紧旧端口。
如果服务器上还运行网站、数据库或游戏服,不建议为了 SSH refused 直接重启整机。先通过控制台确认 sshd 和端口状态,通常能更快恢复访问,也不会影响正在运行的业务。