"ping不通"大概是运维听到最多的问题描述了。
但"ping不通"只是现象,原因可能有一百种。这篇整理一套排查流程,从最简单的开始,一层层定位问题。
排查思路
网络问题排查有个基本原则:从近到远,逐层排查。
本机 → 网关 → 路由 → 目标
先确认本机没问题,再看网关,再看中间链路,最后看目标。
第一步:确认网络接口状态
# 查看网卡状态ip addr# 或ifconfig# 看什么:# 1. 网卡是否UP# 2. 是否有IP地址# 3. IP地址对不对
常见问题:
# 网卡DOWN了ip link set eth0 up# 没有IP(DHCP没获取到)dhclient eth0# IP配置错误# 检查 /etc/sysconfig/network-scripts/ifcfg-eth0 或 /etc/netplan/
确认网卡有IP且状态正常后,继续下一步。
第二步:ping网关
# 查看网关ip route# 或route -n# 输出示例:# default via 192.168.1.1 dev eth0# 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100# ping网关ping -c 4 192.168.1.1
ping网关不通,说明本地网络有问题:
ping网关能通,继续下一步。
第三步:ping目标IP
ping -c 4 目标IP
能ping通,说明网络是通的,问题在应用层(端口、服务、防火墙)。
ping不通,继续排查。
第四步:traceroute定位断点
# Linuxtraceroute 目标IP# 或者用mtr(更直观)mtr 目标IP# 如果没装apt install mtr # Debian/Ubuntuyum install mtr # CentOS
traceroute会显示到目标的每一跳:
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets 1 192.168.1.1 (192.168.1.1) 1.123 ms 1.089 ms 1.076 ms 2 10.0.0.1 (10.0.0.1) 5.456 ms 5.423 ms 5.410 ms 3 * * * 4 * * * 5 8.8.8.8 (8.8.8.8) 15.789 ms 15.756 ms 15.743 ms
- 看到
* * *说明那一跳没响应(可能是禁ping,不一定是故障)
mtr更好用,持续探测并统计丢包率:
mtr -r -c 100 目标IP# -r 报告模式# -c 100 发100个包# 输出示例:HOST: myserver Loss% Snt Last Avg Best Wrst StDev 1.|-- 192.168.1.1 0.0% 100 0.5 0.6 0.3 1.2 0.1 2.|-- 10.0.0.1 0.0% 100 5.2 5.1 4.8 6.1 0.3 3.|-- 172.16.1.1 15.0% 100 10.2 12.3 9.8 45.2 8.1 <- 这里丢包 4.|-- 8.8.8.8 0.0% 100 15.3 15.1 14.8 16.2 0.4
看到中间某跳丢包,但最终目标不丢包,可能是中间设备限制了ICMP,不用管。
中间和最终都丢包,那确实是链路问题。
第五步:检查DNS(如果用域名)
# 测试DNS解析nslookup 域名# 或dig 域名# 查看DNS配置cat /etc/resolv.conf# 测试特定DNS服务器dig @8.8.8.8 域名
DNS问题的症状:
临时解决:
# 加hostsecho"1.2.3.4 example.com" >> /etc/hosts# 或者换DNSecho"nameserver 8.8.8.8" > /etc/resolv.conf
第六步:检查端口连通性
网络层通了,但服务不通?检查端口:
# telnet(需要安装)telnet 目标IP 端口# nc/netcat(推荐)nc -zv 目标IP 端口nc -zv 192.168.1.100 80# 输出:# Connection to 192.168.1.100 80 port [tcp/http] succeeded!# 或# nc: connect to 192.168.1.100 port 80 (tcp) failed: Connection refused# 批量检测nc -zv 192.168.1.100 80-90# curl测试HTTPcurl -v http://目标IP:端口/
端口不通的原因:
- 服务监听地址是127.0.0.1不是0.0.0.0
第七步:检查防火墙
本机防火墙
# iptablesiptables -L -n# firewalld(CentOS 7+)firewall-cmd --list-all# ufw(Ubuntu)ufw status# 临时关闭防火墙测试systemctl stop firewalld# 或iptables -F
云服务器安全组
如果是云服务器,还要检查:
这个经常被忽略,明明服务器上防火墙关了还是不通,结果是安全组没放行。
实用命令汇总
ss/netstat 查看连接
# 查看监听端口ss -tlnpnetstat -tlnp# 查看所有TCP连接ss -tnp# 查看特定端口ss -tlnp | grep :80# 查看连接状态统计ss -s
网卡流量
# 实时流量watch -n 1 "cat /proc/net/dev"# 更直观iftop # 需要安装nload # 需要安装sar -n DEV 1 # sysstat包
抓包
# 抓指定端口tcpdump -i eth0 port 80# 抓指定IPtcpdump -i eth0 host 192.168.1.100# 抓TCP SYN包(看连接建立)tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'# 保存到文件,用Wireshark分析tcpdump -i eth0 -w capture.pcap
ARP相关
# 查看ARP缓存arp -nip neigh# 清除ARP缓存ip neigh flush dev eth0# 手动添加(排查ARP问题时用)arp -s 192.168.1.1 00:11:22:33:44:55
常见问题速查
1. 能ping通IP,不能ping域名
# DNS问题cat /etc/resolv.confdig 域名# 临时用公共DNSdig @8.8.8.8 域名
2. 能ping通,端口不通
# 检查服务systemctl status 服务名ss -tlnp | grep 端口# 检查防火墙iptables -L -n | grep 端口firewall-cmd --list-ports
3. 连接超时
# 1. 看路由对不对ip route get 目标IP# 2. traceroute看断在哪mtr 目标IP# 3. 可能是安全组/防火墙
4. 连接被拒绝(Connection refused)
# 服务没启动或没监听在该端口ss -tlnp | grep 端口# 服务监听127.0.0.1# 需要改配置监听0.0.0.0
5. 间歇性丢包
# 持续pingping 目标IP# mtr统计丢包mtr -r -c 1000 目标IP# 可能原因:# - 线路质量差# - 带宽跑满# - 对端服务器负载高
6. 延迟高
# 正常参考值:# 同机房 < 1ms# 同城市 < 10ms# 跨城市 10-50ms# 跨国 100-300ms# 用mtr看是哪一跳延迟高mtr 目标IP
排查流程图
ping不通 │ ├─ ping 网关 ──不通──→ 本地网络问题(网线/交换机/IP配置) │ │ │ 通 │ │ │ ▼ ├─ ping 目标IP ──不通──→ traceroute/mtr 定位中间断点 │ │ │ 通 │ │ │ ▼ ├─ 用域名?──是──→ nslookup/dig 检查DNS │ │ │ 不是/DNS正常 │ │ │ ▼ ├─ nc/telnet 目标端口 ──不通──→ 防火墙/安全组/服务未启动 │ │ │ 通 │ │ │ ▼ └─ curl/应用层测试 ──→ 应用层问题
一个真实案例
上周同事说服务器A访问服务器B的8080端口不通。
排查过程:
- nc -zv B 8080 → Connection refused
- 登录B,ss -tlnp | grep 8080 → 服务在跑,监听的是127.0.0.1
这个流程跑下来不到5分钟,比瞎猜快多了。
总结
网络排查的核心就是分层、逐步缩小范围:
掌握这套流程,大部分"ping不通"都能快速定位。
评论区有问题可以聊。