刚买好阿里云 ECS,本地 ping 公网 IP 一直超时,很多人第一反应是服务器坏了。多数时候不是这样。ping 用的是 ICMP 协议,它和 SSH、网站访问走的端口不是同一回事。ping 不通,不代表服务不可用,只能说明 ICMP 被挡住了。

先确认三件事
排查前先看三点:实例是不是“运行中”,有没有绑定公网 IP(弹性公网 IP 或实例自带的公网地址),你 ping 的是服务器 IP 还是域名。其中只要有一项不对,结果都会是超时。
之前帮一位做电商的朋友看过类似的情况。他在杭州地域买了一台 ECS,本地 ping 公网 IP 全部超时,但 SSH 能正常登录。他以为服务器被封了,准备换机器。我让他先看安全组,入方向只放行了 22 和 80,没有 ICMP 规则。补上一条 ICMP 规则后,ping 马上通了。端口通,不代表 ICMP 也通,这一点很容易混淆。
第一处:安全组入方向
安全组是最常见的拦截点。默认规则一般只开常用业务端口,不包含 ICMP。操作步骤如下:
- 进入 ECS 控制台的实例详情,找到“安全组”标签。
- 点击“管理规则”,切换到“入方向”。
- 新增规则,协议类型选“ICMP(IPv4)”,端口范围填“-1/-1”,授权对象按需填写。排查时可以先用 0.0.0.0/0,排完改成你自己办公网的出口 IP,不然等于长期对公网开放 ping。
安全组是有状态的,规则改完一般几秒内生效,不用重启实例。
第二处:系统防火墙和内核参数
安全组放行了还是不通,就要登录服务器看系统层。CentOS 和 Alibaba Cloud Linux 常用 firewalld,Ubuntu 常用 ufw,老系统可能直接是 iptables。可以依次执行 systemctl status firewalld、ufw status、iptables -L -n,看有没有丢弃 ICMP 的规则。
还有一个容易漏掉的参数:net.ipv4.icmp_echo_ignore_all。设为 1 时,服务器会忽略所有 ping 请求。用 sysctl net.ipv4.icmp_echo_ignore_all 查看,返回 0 才是正常响应。有人为了“隐藏服务器”会主动改它,一些加固脚本也可能顺手改掉。如果你不记得做过这类操作,值得查一下。
第三处:别拿 ping 判断服务是否可用
有些场景下 ping 本来就不适合当判断标准。比如域名背后挂的是 SLB 负载均衡,SLB 通常不对 ICMP 做转发响应,ping 域名超时属于正常现象。这时应该直接测端口,例如 telnet 公网IP 80,或者 curl -I 看 HTTP 响应。Windows 用户可以用 PowerShell 的 Test-NetConnection,加 -Port 参数测 TCP 连通性。
第四处:确认公网 IP 和路由
服务器只有内网 IP 的话,外网自然 ping 不通。ECS 没绑定弹性公网 IP,也没经过 NAT 网关出网,公网同样无法到达。可以在控制台的网络信息里确认公网 IP 字段是不是空的。如果是 VPC 环境,还要检查路由表和网络 ACL,确认子网没有限制访问。
第五处:用 traceroute 找断点
前面都确认无误,就从本地用 traceroute(Windows 下是 tracert)或 mtr 追踪路径。数据包在哪一跳开始超时,问题多半就在那一段。断在阿里云内部节点,一般需要提工单。断在你本地运营商网络,换个网络或出口再测一次就能判断。跨地域访问时延迟和丢包本来就波动,多测几次取平均值更可靠。
建议的排查顺序
按下面顺序走最省时间:
- 确认实例运行中,公网 IP 存在。
- 检查安全组入方向是否放行 ICMP。
- 登录服务器检查防火墙和 icmp_echo_ignore_all。
- 用端口测试代替 ping,再用 traceroute 定位断点。
大部分“阿里云 ping 不通”的问题,前两步就能解决。
如果按这个顺序查完仍不通,把实例 ID、地域、公网 IP 和 traceroute 结果整理好再提工单,处理会快很多。