为什么会这样
ping 使用 ICMP,而 SSH 和 HTTPS 使用 TCP 端口。这些流量彼此独立,防火墙可以丢弃一种并放行另一种。许多网络和云安全组默认阻止 ICMP 回显。因此,没有回复不代表服务器宕机,有回复也不能证明服务正常。
测试服务,而不是 ping
检查你实际需要的端口和协议。如果这些测试成功,说明服务器上的相应服务可达,ping 失败只表明路径上某处存在过滤。
nc -vz -w 5 server.example 22
nc -vz -w 5 server.example 443
curl -sSI https://server.example/使用 TCP 跟踪路径
如果 ICMP 或 UDP 被过滤,传统的 traceroute 可能只显示星号。通过 TCP 向开放端口探测,通常能跟踪得更远。这需要 root 权限,而且可能需要先安装 traceroute,因为精简系统不包含它。
sudo traceroute -T -p 443 server.example查找服务器上的过滤设置
如果你管理这台服务器,请检查其防火墙,以及忽略回显请求的内核设置。请记住,拦截也可能发生在服务器外部的安全组或路由器上,提供商也可能在其网络中过滤 ICMP,而你看不到相关规则。
sysctl net.ipv4.icmp_echo_ignore_all
sudo nft list ruleset | grep -i icmp
sudo ufw status verbose阻止 ICMP 何时会造成故障
阻止回显通常无害,但阻止所有 ICMP 并非如此。路径 MTU 发现依赖数据包过大的通知消息。缺少这些消息时,小规模数据交换可以正常进行,大规模交换却会停滞,例如 SSH 登录成功后,一遇到大量输出就卡住。IPv6 对 ICMPv6 的依赖更强。第二条命令在 Linux 上测试路径是否支持 1500 字节的 MTU。
ip route get 192.0.2.10
ping -M do -s 1472 -c 3 192.0.2.10在 CH-J Server Manager 中对比
Server Diagnostics 无需 root,即可通过系统工具运行 ping,同时分别测试 TCP、SSH 标识、HTTP 和 TLS,便于结合其他结果理解 ping 失败的含义。这里的 ping 失败表示没有收到回复,并不能说明数据包在哪里被丢弃,traceroute 也未必能回答这个问题。