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

通过客户端访问目标ECS实例时,如果能pingECS实例但业务端口无法访问,则可能是链路中相关节点对相应端口做了拦截所致。

使用自助问题排查工具

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

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

image

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

手动排查

第一步:快速自查

  1. 访问ECS控制台-实例

  2. 单击目标实例ID进入实例详情页:

    1. 确保其状态为运行中,而不是已停止或其它异常状态。

    2. 确认您用于连接的IP地址是实例当前绑定的弹性公网IP (EIP)。如果实例重启后使用了动态分配的公网IP,地址可能会变化。

第二步:区分Connection timed outConnection refused

请在您的本地电脑上,使用telnetnc命令测试端口,并仔细观察返回的错误信息。

# 在您的本地电脑终端执行 (以80端口为例)
telnet <您的实例公网IP> 80
# 或者
nc -vz <您的实例公网IP> 80

这两种错误指向了不同的问题方向:

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

  1. 检查阿里云安全组。

    1. 访问ECS控制台-安全组

    2. 找到ECS实例关联的目标安全组,在操作列中,单击管理规则

    3. 选择入方向标签页,查看规则是否开放目的端口。image

      • 未开放目标端口,请添加入方向为目标端口的安全组规则。具体操作,请参见添加安全组规则

      • 已开放目标端口,请继续以下步骤排查。

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

    Linux实例

    本操作以CentOS 7.9为例,其他版本的Linux系统操作可能有所差异。

    1. 远程连接Linux实例。

      具体操作,请参见通过密码或密钥认证登录Linux实例

    2. 执行如下命令,查看防火墙状态。

      systemctl status firewalld
      • 如果回显中出现Active: inactive (dead)信息,说明防火墙处于关闭状态,无需再进行任何操作。

      • 如果回显中出现Active: active (running)信息,说明防火墙已开启,请继续。

    3. 执行如下命令,查看防火墙中已开放的端口。

      firewall-cmd --list-all
      • 如果回显中出现ports: 80/tcp信息,说明防火墙规则中已放行80端口,无需再进行任何操作。

        2023-06-04_19-33-53..png

      • 如果回显中没有ports: 80/tcp信息,请执行如下命令,放行80端口。

        firewall-cmd --zone=public --add-port=80/tcp --permanent

        若返回结果为success,表示已经放行TCP 80端口。

    Windows实例

    本操作以Windows Server 2012为例,其他版本的Windows Server系统操作类似。

    1. 远程连接Windows实例。

      具体操作,请参见通过密码或密钥认证登录Windows实例

    2. 单击左下角的服务器管理..png图标,打开服务器管理。

    3. 选择右上角的工具(T)>高级安全 Windows防火墙

      2023-05-28_20-21-16..png

    4. 查看防火墙状态。

      1. 如果防火墙处于关闭状态,无需进行任何操作。

        2023-06-04_18-49-00..png

      2. 如果防火墙状态为已启用,请继续以下操作。

        1. 高级安全 Windows防火墙页面,单击入站规则

        2. 查看Windows 远程管理-兼容模式(HTTP-In)的状态。

          • 如果协议已启动,无需进行任何操作。

          • 如果该规则未启用,请右键单击该规则,然后单击启用规则(E)

            2023-06-04_18-58-43..png

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

“连接被拒绝”意味着防火墙已经放行,但服务器上没有应用来“接收”这个连接。请检查端口监听状态:

Linux实例

本操作以CentOS 7.9为例,其他版本的Linux系统操作可能有所差异。

  1. 远程连接Linux实例。

    具体操作,请参见使用Workbench登录Linux实例

  2. 执行如下命令,查看端口是否正常被监听。

    netstat -an | grep [$Port]    # [$Port]请替换为实际的端口号
    • 如果返回如下信息,则说明80端口被正常监听。

      2023-06-04_17-11-27..png

    • 如果返回的不是以上信息,表示80端口未处于监听状态(服务未启动),请启动服务后重新查看。

Windows实例

本操作以Windows Server 2012为例,其他版本的Windows Server系统操作类似。

  1. 使用Workbench终端连接登录Windows实例(RDP)

  2. Windows PowerShell中执行如下命令,查看端口是否正常被监听。

    netstat -ano | findstr "[$Port]"   # [$Port]请替换为实际的端口号
    • 如果返回如下信息,则说明80端口被正常监听。

      image

    • 如果返回的不是以上信息,表示80端口未处于监听状态(服务未启动),请启动服务后重新查看。

通过探测工具进行深度检查

利用端口可用性探测工具进行测试,验证是否有节点拦截了端口导致无法访问。

使用端口可用性探测工具

本地客户端为Linux系统

Linux系统中,通常可以通过traceroute来进行端口可用性探测。traceroute用于跟踪Internet协议(IP)数据包传送到目标地址时经过的路由,通过发送TCP数据包向目标端口进行探测,以检测从数据包源到目标服务器的整个链路上相应端口的连通性情况。

安装traceroute

sudo yum install -y traceroute

traceroute命令

常用traceroute命令格式如下所示。

traceroute [-n] -T -p <目标端口号> <Host>
  • -n:直接使用IP地址而非主机名称(禁用DNS反查)。

  • -T:通过TCP探测。

  • -p:设置探测的端口号。

  • <目标端口号>:需要探测的端口号,比如80。

  • <Host>:需要探测的目标服务器地址,比如192.168.XXX.XXX

测试示例

traceroute的示例命令和返回结果如下:

[test@centos~]# traceroute -n -T -p 22 223.5.XXX.XXX
traceroute to 223.5.XXX.XXX (223.5.XXX.XXX), 30 hops max, 60 byte packets
 1 5X.X.X.X 0.431 ms 0.538 ms 0.702 ms
 2 10.88.XXX.XXX 0.997 ms 1.030 ms 10.88.XXX.XXX 1.309 ms
 3 58.96.XXX.XXX 0.393 ms 0.390 ms 58.96.XXX.XXX 0.423 ms
 4 202.123.XXX.XXX 1.110 ms 202.123.XXX.XXX 0.440 ms 0.440 ms
 5 63.218.XXX.XXX 1.744 ms 63.218.XXX.XXX 1.076 ms 1.232 ms
 6 63.223.XXX.XXX 1.832 ms 63.223.XXX.XXX 1.663 ms 63.223.XXX.XXX 1.616 ms
 7 63.223.XXX.XXX 2.776 ms 63.223.XXX.XXX 1.585 ms 1.606 ms
 8 * * 202.97.XXX.XXX 2.537 ms
 9 202.97.XXX.XXX 6.856 ms * *
10 * * *
11 * * *
12 * * 119.147.XXX.XXX 8.738 ms
13 119.147.XXX.XXX 8.248 ms 8.231 ms *
14 * 42.120.XXX.XXX 32.305 ms 42.120.XXX.XXX 29.877 ms
15 42.120.XXX.XXX 11.950 ms 42.120.XXX.XXX 23.853 ms 42.120.XXX.XXX 29.831 ms
16 42.120.XXX.XXX 11.007 ms 42.120.XXX.XXX 13.615 ms 42.120.XXX.XXX 11.956 ms
17 42.120.XXX.XXX 21.578 ms 42.120.XXX.XXX 13.236 ms *
18 * * 223.5.XXX.XXX 12.070 ms !X

本地客户端为Windows系统

Windows系统中,您可通过tracetcp进行端口可用性探测。tracetcp同样通过发送TCP数据包进行链路探测,以分析链路是否存在中间节点对目标端口做了阻断。

安装tracetcp

  1. WinPcap官网下载并安装WinPcap library。

  2. tracetcp官网下载tracetcp。

  3. 将下载的tracetcp解压到C:\Windows目录下。

    重要

    如果解压到非系统目录,则需要手动修改系统环境变量,以确保指令可以直接调用。

使用方法

Windows PowerShellcmd命令行中输入tracetcp命令,常用tracetcp命令格式如下所示。

tracetcp <IP>:<Port>
    说明
    • <IP>:指目标服务器的IP地址或者域名。

    • <Port>:指需要探测的目标端口。

    关于更多tracetcp参数说明,您可以通过tracetcp -?命令查看帮助。

测试示例

tracetcp的示例命令和返回结果如下:

C:\ >tracetcp www.aliyun.com:80
Tracing route to 140.205.XX.8 on port 80
Over a maximum of 30 hops.
1 3 ms 4 ms 3 ms 10.102.XXX.XXX
2 13 ms 3 ms 4 ms 10.102.XXX.XXX
3 3 ms 3 ms 2 ms 140.205.XXX.XXX
4 4 ms 3 ms 3 ms 180.163.XXX.XXX
5 5 ms 4 ms 7 ms 101.95.XXX.XXX
6 6 ms 5 ms 7 ms 124.74.XXX.XXX
7 8 ms 8 ms 8 ms 124.74.XXX.XXX
8 10 ms 10 ms 8 ms 114.80.XXX.XXX
9 9 ms 9 ms 11 ms 42.120.XXX.XXX
10 * * * Request timed out.
11 Destination Reached in 8 ms. Connection established to 140.205.XXX.XXX
Trace Complete.

探测结果的案例分析

当相关端口在某一跳被阻断,则之后各跳均不会有返回数据,据此就可以判断出异常节点。您可以根据相应节点信息,查询IP归属运营商进行问题反馈。

案例一

探测结果:目标端口在第3跳之后就没有数据返回,说明相应端口在该节点被阻断。

探测结果分析:经查询该节点为内网IP,所以推断是本地网络相关安全策略所致,需要联系本地网络管理部门做进一步排查分析。

C:\> tracetcp www.aliyun.com:135
Tracing route to 115.102.XXX.XXX on port 135
Over a maximum of 30 hops.
1       3 ms    3 ms    3 ms    10.102.XXX.XXX
2       4 ms    3 ms    3 ms    10.102.XXX.XXX
3       3 ms    3 ms    3 ms    140.205.XXX.XXX
4       *       *       *       Request timed out.
5       *       *       *       Request timed out.
6       *       *       *       Request timed out.
7       *       *       *       Request timed out.
8       *       *       *       Request timed out.
9       *       *       *       Request timed out.
10      *       *       *       Request timed out.
11      *       *       *       Request timed out.
12      *       *       *       Request timed out.
Trace Complete.

案例二

探测结果:探测结果如下,目标端口在第11跳之后就没有数据返回,说明相应端口在该节点被阻断。

探测结果分析:经查询该节点归属北京移动,需要您自行向运营商反馈。

[root@mycentos ~]# traceroute -T -p 135 www.baidu.com
traceroute to www.baidu.com (111.13.XXX.XXX), 30 hops max, 60 byte packets
 1  * * *
 2  111.13.XXX.XXX (111.13.XXX.XXX)  4.115 ms  4.397 ms  4.679 ms
 3  112.15.XXX.XXX (112.15.XXX.XXX)  901.921 ms  902.762 ms  902.338 ms
 4  200.35.XXX.XXX (200.35.XXX.XXX)  2.187 ms  1.392 ms  2.266 ms
 5  * * *
 6  58.200.XXX.XXX (58.200X.XXX.XXX)  1.688 ms  1.465 ms  1.475 ms
 7  63.128.XXX.XXX (63.128.XXX.XXX)  27.729 ms  27.708 ms  27.636 ms
 8  * * *
 9  * * *
10  200.38.XXX.XXX (200.38.XXX.XXX)  28.922 ms 200.38.XXX.XXX (200.38.XXX.XXX)   29.030 ms  28.916 ms
11  204.35.XXX.XXX (204.35.XXX.XXX)  29.169 ms  28.893 ms 204.35.XXX.XXX (204.35.XXX.XXX)  30.986 ms
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *