服务器ping不通怎么排查问题

文章导读
服务器 ping 不通时,先不要动防火墙和内核参数。ping 走的是 ICMP 协议,在这条链路上,任何一段被丢弃,都会表现为同样的“请求超时”。所以,第一步应该是判断数据包在哪一段消失,而不是急着猜测“是不是被墙了”或“是不是安全组问题”。可以按下面的顺序定位:先区分本机自身、本机到网关、网关到目标、目标主机内部这四段,再判断该改哪一处配置。如果目标上的业务端口仍然能连上,那么 ping 不通通
📋 目录
  1. 壹 服务器ping不通先定位在哪一层
  2. 贰 服务器ping不通:先看这四个位置
  3. 叁 服务器ping不通:按可能性从高到低排除
  4. 肆 服务器ping不通:改完怎么确认真的解决了
A A

服务器 ping 不通时,先不要动防火墙和内核参数。ping 走的是 ICMP 协议,在这条链路上,任何一段被丢弃,都会表现为同样的“请求超时”。所以,第一步应该是判断数据包在哪一段消失,而不是急着猜测“是不是被墙了”或“是不是安全组问题”。可以按下面的顺序定位:先区分本机自身、本机到网关、网关到目标、目标主机内部这四段,再判断该改哪一处配置。如果目标上的业务端口仍然能连上,那么 ping 不通通常只说明 ICMP 被拦,并不说明主机已经离线。

ping 不通先分层:本机协议栈、默认路由、中间链路、目标主机 ICMP 策略、云上安全组。多数情况问题出在云安全组或主机防火墙没有放通 ICMP,其次是内核 icmp_echo_ignore_all 被打开、默认路由缺失、链路某跳丢包。先抓包确认请求是否到达目标主机,再决定改防火墙还是查路由;改动前备份规则,改完用连续 ping 和 traceroute 观察,确认稳定后再收尾。

服务器ping不通先定位在哪一层

分层的目的,是让每一次动手改配置都有依据。常见的五层和对应判断如下,可以边查边记:

  • 本机协议栈:ping -c 4 127.0.0.1 和 ping -c 4 本机内网IP。如果连回环地址都不通,说明本机网络栈或内核模块异常,与目标无关。
  • 本机出口与默认路由:ip -br a 查看网卡是否有地址、是否 UP;ip route 查看是否有 default via ...。没有默认路由时,发往公网的包根本出不去。
  • 中间链路:mtr -c 50 --report -n 目标IP 或 traceroute -n 目标IP。观察从第几跳开始出现持续丢包,以及丢包是否一直延续到最后一跳。
  • 目标主机网络栈:登录目标机,用 ip -br a、ip route 确认地址和回程路由;在同网段用另一台机器 ping 它,排除是外部链路还是主机本身。
  • 目标 ICMP 策略与云上规则:查 iptables -S、nft list ruleset、sysctl net.ipv4.icmp_echo_ignore_all,以及云控制台的安全组入方向规则。

判断依据可以用抓包来落实:在目标主机执行 tcpdump -i eth0 -nn icmp and host 来源IP -c 20,同时从来源端持续 ping。抓不到 echo request,说明包没到主机,问题在链路或上游策略;抓到了 request 却没有 echo reply,说明包已在主机侧被拦截,或回程路由不通。

服务器ping不通:先看这四个位置

这四个位置是按“从便宜到贵”排列的:越靠前,越不需要登录目标机,越先查看。

  1. 命令输出:先在来源端执行 ping -c 10 目标IP,记录是超时、还是 Destination Host Unreachable、还是 Request timed out;再执行 mtr -c 50 --report -n 目标IP、ip route get 目标IP。不同的报错指向不同的层,先分清再动手。
  2. 配置项:登录目标机后,依次看 sysctl net.ipv4.icmp_echo_ignore_all(部分加固脚本会把它设为 1)、iptables -S 或 nft list ruleset 中是否有丢弃 icmp 的规则、ip route 是否有回程路由。配置文件位置通常是 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的 *.conf,防火墙规则持久化文件在 /etc/sysconfig/iptables 或 /etc/nftables.conf(具体以发行版为准,改前先确认)。
  3. 日志:journalctl -k --since "30 min ago" | tail -100(Debian/Ubuntu 内核日志也常写入 /var/log/kern.log,RHEL 系在 /var/log/messages)。同时用 dmesg -T | tail -50 看是否有网卡 down、IP 冲突、邻居表异常等记录。
  4. 面板字段:登录云厂商控制台,找到这台实例所属的安全组或防火墙,确认入方向是否放通 ICMP(协议选 ICMP 或 icmp/8,源地址按需收紧);再确认实例绑定的公网 IP、弹性 IP 状态、VPC 路由表和子网 ACL。这几个字段的名称各厂商不同,以控制台实际显示为准。

服务器ping不通:按可能性从高到低排除

下面按常见程度排序。每一条都配一个能确认或排除它的动作,做完再决定是否继续往下走。

  1. 云安全组或平台防火墙未放通 ICMP。很多默认策略只放通 22、80、443。确认动作:在控制台比对入方向规则,或临时增加一条 ICMP 放通规则,再从来源端 ping 一次。处理后记得收紧源地址范围。
  2. 主机防火墙丢弃了 ICMP。确认动作:iptables -S | grep -i icmp,或 nft list ruleset | grep -i icmp;同时用 iptables -L INPUT -v -n 看是否有匹配计数在增长的 DROP 规则。
  3. 内核禁用了 ICMP 回显。确认动作:sysctl net.ipv4.icmp_echo_ignore_all 输出是否为 1。临时放开可用 sysctl -w net.ipv4.icmp_echo_ignore_all=0,永久生效再写进 /etc/sysctl.d/99-icmp.conf。
  4. 目标主机没配好地址或路由。确认动作:ip -br a、ip route,重点看是否有默认路由、回程网段是否指向正确网关;同 VPC 内用另一台机器直连内网 IP 试一次。
  5. 中间链路丢包或策略拦截。确认动作:mtr -c 100 --report -n 目标IP,观察丢包是从某一跳开始稳定出现,还是只在末尾丢。前者联系网络或云厂商,后者回到主机侧继续查。
  6. 目标只拦 ICMP,业务其实正常。确认动作:nc -vz -w 3 目标IP 22 或 curl -sv --max-time 5 http://目标IP:端口。端口通而 ping 不通,说明服务没挂,只是 ICMP 被拦,排查优先级应降下来。

动手改之前先备份,一条命令的成本很低:

服务器ping不通怎么排查问题
# 备份当前防火墙与内核参数
mkdir -p /root/netbak
iptables-save > /root/netbak/iptables.bak 2>/dev/null
nft list ruleset > /root/netbak/nft.bak 2>/dev/null
sysctl -a 2>/dev/null | grep -E 'icmp|rp_filter' > /root/netbak/sysctl.bak
ip route > /root/netbak/route.bak

注意一个容易踩的坑:在云主机上直接执行 iptables -F 或清空安全组,很可能连自己的 SSH 会话一起断掉,而且部分镜像的规则由 firewalld、ufw 或云厂商 agent 管理,手工改完之后重启会被覆盖。改之前先确认规则由谁托管:用 systemctl is-active firewalld、ufw status 判断;如果是云厂商 agent 托管,应改控制台字段,而不是改本机规则。

服务器ping不通:改完怎么确认真的解决了

单次 ping 通不代表问题解决,可能只是刚好命中了一条放行规则,或者是缓存状态。建议按下面的方式验证:

# 1. 连续发包,看是否有间歇性丢包
ping -c 200 -i 0.2 目标IP | tail -n 5

# 2. 看路径是否稳定,重点关注最后一跳丢包率
mtr -c 100 --report -n 目标IP

# 3. 目标机侧确认包确实收发了
tcpdump -i eth0 -nn icmp and host 来源IP -c 20

# 4. 业务端口仍可连,确认没有连带影响
nc -vz -w 3 目标IP 22

观察多久算稳定:连续 200 个包无丢包、mtr 报告里最后一跳丢包率为 0,通常可以认为该方向已经恢复;跨运营商或跨地域链路建议再多观察一段时间,尤其是工作时段。如果丢包只在特定时段出现,更可能是链路拥塞而非配置问题,应转去查链路而不是继续调整防火墙。

回滚办法要提前想好,出问题时按顺序执行:

  1. 把临时加的 ICMP 放行规则删掉,或直接恢复备份:iptables-restore < /root/netbak/iptables.bak;nft 环境用 nft flush ruleset && nft -f /root/netbak/nft.bak。
  2. 内核参数改回去:sysctl -w net.ipv4.icmp_echo_ignore_all=1(把值换成备份文件里记录的原值),并同步修改 /etc/sysctl.d/99-icmp.conf,否则重启后又会变。
  3. 云控制台的安全组改动,按改动前截取的规则截图或记录,逐条恢复;恢复后从外部再 ping 一次,确认没有把已有业务端口一起收紧。

回滚完同样要用 ping -c 20 和端口连通性检查确认环境回到改动前的状态。如果回滚后仍然不通,说明原因不在这次改动的范围,应回到第一层的四段定位重新判断。