在使用 FinalShell 连接远程 Linux 服务器时,相信不少运维新手或日常用户都曾遭遇过“Connection refused”(连接被拒绝)这个令人头疼的错误提示。这个错误不同于“Connection timed out”(连接超时),它意味着 FinalShell 客户端成功联系到了目标服务器的 IP 地址,但在请求建立 SSH 连接时,服务器明确地拒绝了这份请求。换句话说,服务器不是“没反应”,而是“有反应,但就是不让你连”。

那么,当 FinalShell 出现“Connection refused”时,我们应该如何一步步排查并解决呢?本文将为你提供一份详尽且可操作的教程,帮助你迅速定位问题并恢复连接。如果您尚未安装 FinalShell,或者需要最新的官方版本,请访问 FinalShell 官方下载渠道 获取。

快速诊断:Connection refused 意味着什么?

在深入排查之前,我们先来明确“Connection refused”的本质。它通常发生在 TCP/IP 连接的三次握手过程中。当 FinalShell(作为客户端)向服务器的 SSH 端口(默认为 22)发送 SYN 包时,服务器端收到了这个请求,但决定不接受此连接,并回应了一个 RST/ACK 包(Reset/Acknowledgement),表明连接被拒绝。

这与“Connection timed out”形成鲜明对比:“Connection timed out”表示 FinalShell 客户端发送 SYN 包后,在设定的时间内没有收到服务器的任何回应,可能是网络不通、服务器宕机或防火墙完全阻断了流量。而“Connection refused”则明确指向服务器端存在某种机制,阻止了 SSH 连接的建立。

导致“Connection refused”的主要原因通常包括:

  1. 服务器上的 SSH 服务未运行。
  2. 服务器的防火墙(如 firewalldufwiptables)阻止了 SSH 端口。
  3. 云服务商的安全组或网络 ACL 规则阻止了 SSH 端口。
  4. SSH 服务配置(sshd_config)存在问题,例如监听地址不正确、不允许特定用户登录等。
  5. FinalShell 中配置的端口与服务器 SSH 实际监听的端口不一致。
  6. TCP Wrappers 规则(/etc/hosts.allow, /etc/hosts.deny)阻止了你的 IP 地址。

接下来,我们将根据这些常见原因,一步步进行排查。

排查步骤一:检查服务器 SSH 服务状态

这是最常见且最容易修复的问题。如果服务器上的 SSH 服务(通常是 sshd)没有运行,那么它自然会拒绝所有传入的 SSH 连接请求。

操作方法:

  1. 通过云服务商控制台或 VNC 登录: 如果你使用的是云服务器(如阿里云、腾讯云、华为云等),通常可以通过其提供的网页控制台或 VNC(Virtual Network Computing)功能登录到服务器的桌面或命令行界面。这是在 SSH 无法连接时访问服务器的备用方案。

  2. 检查 SSH 服务状态: 登录到服务器后,执行以下命令来检查 sshd 服务的运行状态:

    systemctl status sshd
    

    如果服务正常运行,你将看到类似 Active: active (running) 的输出。如果显示 inactive (dead) 或其他非运行状态,则表明服务已停止。

  3. 启动或重启 SSH 服务: 如果服务未运行或状态异常,尝试启动它:

    systemctl start sshd
    

    或者,如果服务正在运行但状态不稳定,可以尝试重启:

    systemctl restart sshd
    
  4. 设置开机自启动: 为防止服务器重启后 SSH 服务再次停止,建议将其设置为开机自启动:

    systemctl enable sshd
    

    完成这些操作后,回到 FinalShell 尝试重新连接。如果问题解决,那恭喜你!如果还不行,请继续下一步。

排查步骤二:服务器防火墙配置

即使 SSH 服务正常运行,服务器的防火墙也可能阻止外部连接访问 SSH 端口。这在 Linux 系统上非常常见,主要涉及 firewalldufwiptables。此外,对于云服务器,还需要考虑云平台自身的安全组或网络 ACL 规则。

操作方法:

  1. 检查本地防火墙: 通过控制台或 VNC 登录服务器后,根据你的 Linux 发行版检查相应的防火墙状态:

    • 对于 CentOS/RHEL (使用 firewalld):

      sudo firewall-cmd --list-all
      

      检查输出中 portsservices 部分是否包含 ssh 服务或 22/tcp 端口。如果 SSH 端口未开放,可以执行以下命令开放它(默认为 22 端口):

      sudo firewall-cmd --add-service=ssh --permanent
      sudo firewall-cmd --reload
      

      或者,如果 SSH 运行在非标准端口,例如 2222,则使用:

      sudo firewall-cmd --add-port=2222/tcp --permanent
      sudo firewall-cmd --reload
      
    • 对于 Ubuntu/Debian (使用 ufw):

      sudo ufw status
      

      检查输出中是否允许 SSH 端口。如果未允许,执行:

      sudo ufw allow ssh
      

      或针对特定端口:

      sudo ufw allow 2222/tcp
      

      如果 UFW 处于禁用状态,你可以选择启用它(这会应用默认规则):

      sudo ufw enable
      
    • 对于其他系统或直接使用 iptables

      sudo iptables -L -n
      

      查找是否有规则允许目的端口为 22 (或你自定义的 SSH 端口) 的 TCP 连接。如果没有,可能需要添加规则,例如:

      sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
      sudo service iptables save # 某些系统可能需要
      

      请注意,直接操作 iptables 风险较高,建议在熟悉其规则和持久化配置后进行。

  2. 检查云服务商安全组/网络 ACL: 这是云服务器用户经常忽略但非常重要的一步。登录到你的云服务商控制台(例如阿里云、腾讯云、AWS、Google Cloud 等),找到你的服务器实例,然后检查其关联的安全组 (Security Group)网络 ACL (Network Access Control List) 规则。

    SSH connection troubleshooting steps

    确保:

    • 有一条入站规则允许源 IP 地址(你的本地公网 IP 或 0.0.0.0/0 表示所有 IP)访问目标端口(你的 SSH 端口,默认为 22)的 TCP 流量。
    • 该规则的优先级正确,没有其他更严格的规则阻止了 SSH 流量。

    这是导致“Connection refused”的常见原因之一,尤其是在首次配置服务器时。

完成防火墙和安全组的检查与配置后,再次尝试通过 FinalShell 连接。

排查步骤三:核对 FinalShell 连接配置与 SSHD 端口

“Connection refused”也可能是因为 FinalShell 中填写的连接信息与服务器实际监听的 SSH 配置不符。

操作方法:

  1. 核对 FinalShell 中的 IP 地址、端口号和用户名: 在 FinalShell 中,检查你为服务器配置的连接信息:

    • 主机地址 (Host): 确保填写的是正确的服务器 IP 地址或域名。
    • 端口号 (Port): 确保与服务器 SSH 服务实际监听的端口号一致。默认是 22,但很多管理员会为了安全而修改它。
    • 用户名 (Username): 确保是服务器上存在的且允许 SSH 登录的用户。
  2. 检查服务器 SSHD 配置文件 (sshd_config): 通过控制台或 VNC 登录服务器后,查看 SSH 服务的配置文件,以确认其监听的端口。 配置文件通常位于 /etc/ssh/sshd_config

    sudo cat /etc/ssh/sshd_config | grep Port
    

    这条命令会显示 Port 配置项。如果显示 Port 22,则表示监听 22 端口。如果显示 Port 2222,则表示监听 2222 端口。

    重要提示: 如果 sshd_config 中的端口被修改,你必须在 FinalShell 的连接配置中也同步修改为相同的端口号。

    另外,还需要留意 ListenAddress 配置。如果它被设置为一个非服务器公网 IP 的地址(例如 127.0.0.1),那么 SSH 服务将只在本地监听,外部连接将无法到达。通常情况下,此项应保持注释状态或设置为服务器的公共 IP 地址(如果服务器有多个网卡)。

    修改 sshd_config 文件后,必须重启 SSH 服务才能使更改生效:

    sudo systemctl restart sshd
    

    如果你是第一次连接服务器,我们强烈建议你阅读 FinalShell 首次连接服务器 这篇文章,以确保你的连接配置是正确的。

排查步骤四:网络连通性与路由问题

虽然“Connection refused”通常意味着网络是通的,但有时一些细微的网络问题也可能导致类似的表现。

操作方法:

  1. Ping 服务器 IP: 在你的本地电脑上打开命令行工具(Windows 的 cmd 或 PowerShell,macOS/Linux 的终端),尝试 ping 服务器的 IP 地址:

    ping 你的服务器IP地址
    

    如果能收到回复,说明基本的网络连通性没有问题。如果 ping 不通,可能是网络中断、服务器宕机或 ICMP 协议被防火墙阻止(这与 SSH 端口被拒绝是不同的问题)。

  2. 端口连通性测试: 使用 telnetnc (netcat) 命令在本地测试 SSH 端口是否可达:

    • Windows (如果安装了 telnet 客户端):
      telnet 你的服务器IP地址 22
      
    • macOS/Linux:
      nc -vz 你的服务器IP地址 22
      
      telnet 你的服务器IP地址 22
      
      如果显示 Connection refused,说明问题出在服务器端,它确实在拒绝连接。如果显示 Connected to ... 且屏幕变黑,则表示端口是开放的,问题可能出在 SSH 配置或 FinalShell 本身。如果显示 Connection timed out,则可能是防火墙完全阻止或网络不通。
  3. 本地网络环境检查: 确保你的本地网络环境没有异常。例如,你是否使用了 VPN 或代理,这些服务是否可能干扰了与服务器的连接?尝试禁用它们后重新连接。

排查步骤五:SSH 服务配置深度检查

sshd_config 文件中,除了 PortListenAddress,还有其他一些配置项可能导致连接被拒绝:

每次修改 sshd_confighosts.allow/hosts.deny 后,都必须重启 SSH 服务sudo systemctl restart sshd

常见问题与进阶技巧

FinalShell 提示“连接超时”而非“Connection refused”

如前所述,这两个错误代表不同的问题。“Connection timed out”通常意味着网络不通、服务器宕机,或者防火墙/安全组完全丢弃了请求包。如果你遇到的是连接超时,请参考 FinalShell 连接超时问题修复 这篇文章。

登录失败次数过多导致 IP 被临时封禁

有些服务器会启用 fail2bandenyhosts 等入侵防御工具。如果你在 FinalShell 中连续输入错误密码多次,你的客户端 IP 地址可能会被这些工具临时或永久性地添加到防火墙的黑名单中,导致后续的连接尝试也被拒绝。

解决方法:

忘记密码导致无法登录

虽然严格来说这不会直接导致“Connection refused”,但在排查过程中,如果 SSH 配置正确而你就是无法登录,很可能是密码错误。在这种情况下,你需要通过云服务商控制台或 VNC 登录服务器,然后重置用户密码。

云服务器安全组/网络 ACL 配置再强调

这是最常见但也最容易被忽视的“Connection refused”原因。很多用户在配置好服务器内部防火墙后,忘记了云平台层面还有一道“安全门”。请务必再次仔细检查你的云平台安全组入站规则,确保你的 SSH 端口(通常是 22)以及你的本地公网 IP 地址是被允许的。

Server management and system administration

系统资源耗尽或 SSH 服务故障

在极少数情况下,如果服务器资源(CPU、内存)耗尽或 SSH 服务自身存在 Bug 或配置错误,即使服务显示为运行中,也可能无法正常响应连接请求。这时可以尝试重启服务器,或者检查系统日志 (/var/log/secure/var/log/auth.log) 以获取更多详细信息。

总结

当 FinalShell 提示“Connection refused”时,不要慌张。这通常意味着问题出在服务器端,并且通常可以通过系统性地检查 SSH 服务状态、防火墙配置、云安全组以及 SSH 服务配置文件来解决。

请记住以下排查顺序:

  1. SSH 服务是否运行? (systemctl status sshd)
  2. 服务器防火墙是否放行 SSH 端口? (firewalld, ufw, iptables)
  3. 云平台安全组/网络 ACL 是否放行 SSH 端口? (云控制台)
  4. FinalShell 配置与服务器 sshd_config 中的端口是否一致? (/etc/ssh/sshd_config)
  5. 其他 SSHD 配置(AllowUsers, PermitRootLogin 等)是否存在问题?
  6. 是否被 fail2banhosts.deny 封禁?

遵循这些步骤,并耐心细致地检查每一个环节,相信你一定能成功解决 FinalShell 的“Connection refused”报错,让你的远程管理之旅畅通无阻。

延伸阅读

若需进一步查阅,可先看本站以下教程: