“Connection refused”表明服务器主动拒绝连接,核心原因是sshd未运行或仅监听回环地址(如127.0.0.1:22),而非网络不通;需依次检查服务状态、端口监听范围、防火墙及云安全组规则,并验证SSH配置与权限。

“Connection refused”不是客户端拒绝,而是服务器明确拒接——说明你的连接请求确实发到了服务器,但服务端没应答。核心原因就两个:sshd根本没跑,或者它只听本地不听外网。
先确认 sshd 有没有在跑、监听哪儿
登录服务器控制台(VNC、物理终端或救援模式),别靠远程:
- systemctl status sshd —— 看是不是 active (running);如果是 inactive 或 failed,运行 sudo systemctl start sshd
- sudo ss -tlnp | grep :22 —— 关键看输出里有没有 0.0.0.0:22 或 [::]:22;如果只有 127.0.0.1:22,说明服务起来了,但只绑了回环,外部连不上
- 若改过端口(比如设了 Port 2222),客户端必须加 -p 2222,否则默认连 22 就必然失败
再查中间有没有被拦住
能 ping 通但连不上 22,大概率是防火墙或云安全组挡了:
- 本地测试端口:用 nc -zv 服务器IP 22;显示 “Connection refused” 是服务层问题;显示 “timed out” 就是网络层丢包
- 查系统防火墙:sudo ufw status(Ubuntu)或 sudo firewall-cmd --list-all(CentOS/RHEL),确认 22 端口已放行
- 云服务器(阿里云、腾讯云等)必须单独检查安全组——它和系统防火墙无关;入方向规则里,TCP 22(或自定义端口)必须显式添加,源 IP 可先设为 0.0.0.0/0 快速验证
最后盯日志、看配置细节
如果能连上端口、弹出密码提示但输完就断,问题在认证阶段:
- 服务端实时看日志:sudo tail -f /var/log/auth.log(Debian/Ubuntu)或 sudo tail -f /var/log/secure(CentOS/RHEL);新起一次连接,最后一两行会直接告诉你原因,比如 “user not allowed” 或 “no matching key exchange method”
- 客户端加 -v 查协商过程:ssh -v user@host;重点扫 debug1: kex_input_ext_info 和 Authentications that can continue 这两行,密钥类型不兼容会在这里暴露
- 用户本身要合法:getent passwd username 确认存在,passwd -S username 看是否被锁,grep username /etc/passwd 确保 shell 是 /bin/bash 而不是 /sbin/nologin
.ssh 权限错误常被忽略
OpenSSH 对权限极其敏感,哪怕只是 ~/.ssh 目录是 755,也会静默拒绝密钥登录,且不报错:
- chmod 700 ~/.ssh
- chmod 600 ~/.ssh/authorized_keys
- chown -R $USER:$USER ~/.ssh


















