能ping通ECS实例但端口不通的排查方法

问题现象

当尝试通过特定端口连接ECS实例时失败,客户端提示Connection timed out(连接超时)或Connection refused(连接被拒绝)。

问题原因

  • 网络访问控制拦截:请求数据包在到达目标服务器的应用程序之前,被安全组系统内防火墙策略静默丢弃,客户端收不到任何响应,导致长时间等待后超时(对应Connection timed out)。

  • 目标端口未监听:请求数据包已经成功到达实例操作系统但是应用程序在目标端口未在目标端口上配置监听来接收请求,操作系统因此直接拒绝了该请求。(对应Connection refused)。

方式一、使用自助问题排查工具

阿里云的自助问题排查工具可以帮助快速检测安全组配置、实例内部防火墙以及常见应用端口监听状态,并给出明确的诊断报告。

单击进入自助问题排查页面,并切换至目标地域。

如果自助问题排查工具未能定位问题,请继续以下步骤进行排查。

方式二、手动定位排查

场景一:连接超时(Connection timed out)

  1. 检查安全组规则。确保入方向规则允许了目标端口的访问,且未被高优先级的拒绝规则覆盖。

    1. 前往ECS控制台-实例单击目标实例ID进入实例详情页。

    2. 在实例详情页切换至安全组页签,单击目标安全组ID进入安全组详情页。

    3. 在入方向列表中检查规则。

      • 检查拒绝规则:查看是否存在优先级较高的拒绝策略,阻断了业务访问。

      • 检查放行规则:确认是否已添加允许目标端口和源IP访问的策略。

  2. 检查实例内部防火墙。

    Alibaba Cloud Linux

    1. 登录ECS实例。

      1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

      2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。根据页面提示登录,进入终端页面。

    2. 查看防火墙中已开放的端口。

      firewall-cmd --list-all
    3. 如果目标端口未在列表中,需添加防火墙规则。永久开放指定的TCP端口,允许外部访问(将<PORT>替换为实际端口号)。

      firewall-cmd --zone=public --add-port=<PORT>/tcp --permanent
    4. 重启防火墙使规则生效。

      firewall-cmd --reload

    Ubuntu

    1. 登录ECS实例。

      1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

      2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。根据页面提示登录,进入终端页面。

    2. 查看ufw状态和已配置的规则。

      sudo ufw status
    3. 如果目标端口未在列表中,需添加防火墙规则。将命令中<PORT>修改为目标端口。

      sudo ufw allow <PORT>/tcp
    4. 重启防火墙使规则生效。

      sudo ufw reload

    Windows

    1. 登录ECS实例。

      1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

      2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。选择连接方式为终端连接,输入账号和密码,登录图形化终端页面。

    2. 打开高级安全防火墙。

      1. 在任务栏搜索框,输入服务器管理并打开。

      2. 在服务器管理器右上角,选择工具(T) > 高级安全 Windows防火墙

    3. 检查并启用远程管理规则。

      1. 检查防火墙状态。如果防火墙已关闭,则无需后续操作。

      2. 如果防火墙已启用。在左侧面板中,单击入站规则

      3. 在规则列表中,找到Windows 远程管理-兼容模式(HTTP-In)

      4. 如果该规则未启用,右键单击它并选择启用规则(E)

  3. 检查端口是否可以访问。在本地客户端(不要在目标ECS上自测),使用telnet命令测试。

    telnet <公网IP> <端口号>

    若返回Connected to ...,说明网络和端口均已通畅。

场景二:连接被拒绝(Connection refused)

Linux

  1. 登录ECS实例。

    1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

    2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。根据页面提示登录,进入终端页面。

  2. 检查端口监听状态(将<PORT>替换为实际端口号)。

    netstat -an | grep <PORT>
  3. 分析结果。

    • 正常监听:输出结果State对应值为LISTEN,表示端口正常监听。

      重要

      如果监听地址是127.0.0.1,说明服务仅接受本地访问。请检查服务配置文件(如Nginx服务的nginx.conf、SSH服务的sshd_config等),将监听地址更改为0.0.0.0或实例公网IP。

    • 未在监听:无任何输出,或输出中不包含LISTEN状态,则表示服务未启动,需启动服务。

Windows

  1. 登录ECS实例。

    1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

    2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。选择连接方式为终端连接,输入账号和密码,登录图形化终端页面。

  2. 使用PowerShell检查端口。

    1. 在任务栏搜索框,输入PowerShell并打开。

    2. 检查端口监听状态(将<PORT>替换为实际端口号)。

      netstat -ano | findstr "<PORT>"
    3. 分析结果。

      • 正常监听:输出包含LISTEN状态,表示端口正常监听。如果监听地址为127.0.0.1,表明服务仅接收来自实例内部的连接。需修改服务配置文件,将监听地址127.0.0.1更改为0.0.0.0或实例的公网IP。

      • 未在监听:无任何输出,或输出中不包含LISTEN状态,则表示服务未启动,需启动服务。