“Connection refused”表明SSH服务未在指定端口监听或被防火墙拦截;需检查sshd是否监听0.0.0.0:端口、配置文件ListenAddress/Port、SELinux、宝塔及系统防火墙、云服务器安全组,缺一不可。

ssh连接被拒绝,先看sshd有没有真正在监听
“Connection refused”不是密钥或密码问题,是TCP连接根本没建立起来——说明远程服务器的sshd进程压根没在你指定的端口上监听,或者只监听了127.0.0.1。
执行命令验证:
ss -tlnp | grep :22
如果输出里是127.0.0.1:22,那它拒绝一切外部连接;正确应为0.0.0.0:22或[::]:22。若你改过端口(比如5968),就查:5968。
-
/etc/ssh/sshd_config中检查是否有ListenAddress 127.0.0.1,有就注释掉 - 确认
Port行未被注释,且值和宝塔「终端 → 设置」里填的一致 - 改完必须
systemctl restart sshd,reload不生效 - CentOS 8+/Ubuntu 20.04+用户:SELinux可能拦非标端口,临时测用
setenforce 0
宝塔防火墙和系统防火墙都得放行新端口
宝塔面板自带的防火墙只是个图形界面,底层仍依赖firewalld或ufw。只在宝塔界面点“添加端口”,不代表系统级防火墙真的开了口子。
操作顺序不能错:
- 在宝塔「安全 → 防火墙」里添加新端口(如
5968),协议选TCP - 手动补一道系统命令:
firewall-cmd --add-port=5968/tcp --permanent && firewall-cmd --reload(CentOS/RHEL) - 或
ufw allow 5968(Ubuntu/Debian) - 旧端口
22务必在宝塔防火墙和系统防火墙里都删掉,别留后门
漏掉任意一层,都会卡在“连接被拒绝”。
云服务器必须同步更新安全组规则
阿里云、腾讯云、华为云的安全组是第一道网关,它比系统防火墙还靠前。哪怕sshd跑得再稳、本地防火墙全关,安全组没放行,照样Connection refused。
去云控制台做三件事:
- 找到对应ECS实例的安全组配置
- 在「入方向」规则里加一条:
协议TCP、端口范围5968/5968(不是5968单写)、授权对象0.0.0.0/0(测试用)或你的办公IP - 把原来放行
22的那条规则删掉
安全组修改几乎是实时生效的,但部分厂商有缓存延迟,改完等10秒再试。
密钥权限不对也会报“connection refused”?不,那是另一类错误
很多人混淆了错误类型:Permissions for '/root/.ssh/id_rsa' are too open这类提示是SSH客户端直接拒绝加载私钥,根本不会发SYN包,所以不会出现“Connection refused”。它通常表现为Permission denied (publickey)或直接退出。
真正该检查的是服务端的authorized_keys权限:
-
chmod 700 ~/.ssh(目录必须700) -
chmod 600 ~/.ssh/authorized_keys(文件必须600) - 如果用非
root用户(如www),确保其家目录有x权限:ls -ld /home/www结果里得有drwxr-x---这类,不能是drwx------
权限错误不会导致“连接被拒绝”,但它会让自动登录彻底失效,而你可能误以为是网络问题。










