
做运维时间久了就会发现,网络故障最怕的往往不是问题有多复杂,而是现场一乱,排查顺序先乱了。
一出问题,大家就容易开始靠猜:有人先重启设备,有人先改配置,还有人上来就怀疑防火墙。结果常常是,问题还没定位清楚,排查节奏已经被打散了,甚至越查越乱。
其实绝大多数网络问题,都有一条相对清晰的定位路径。只要别跳着查,从物理层、链路层、网络层,一层层往上看,很多问题并没有想象中那么难。
这篇文章,我不只从单一视角去讲,而是尽量把运维主机侧和网络设备侧两种排查方式放在一起。说白了,就是既告诉你服务器上怎么查,也告诉你交换机、路由器、防火墙那边通常该看什么。这样更贴近真实故障现场,也更适合日常排障落地。
很多故障现场,真正的问题不是技术难,而是大家一着急就开始各查各的。
运维盯着服务日志,网工盯着接口状态,安全同学又在翻策略,谁都没错,但如果没有一条统一的排查主线,最后就很容易互相怀疑、互相打断,效率特别低。
所以我一直觉得,网络排障最重要的不是“谁命令背得多”,而是有没有一个大家都能对齐的排查顺序。
比较稳的思路其实很简单:
❝物理层 → 链路层 → 网络层 → 传输层 → 应用层 → 安全策略 → 性能与日志
顺着这个思路走,至少不会乱。
很多人排障时最容易跳过的,就是物理层。
总觉得这层太基础,不像技术活。可现实往往正相反:越基础的地方,越容易出最耽误时间的问题。线松了、模块异常、端口抖动、电源不稳,这些一点都不高级,但足够把业务拖住。
所以第一步,先别急着翻配置。先确认设备、链路、接口是不是真的正常连着。
先看服务器网卡状态、链路状态、错误统计。
查看网卡状态:
ip link
ethtool eth0
查看网卡统计信息:
ip -s link show eth0
ethtool -S eth0
查看系统日志里的链路异常:
dmesg | grep -Ei 'eth|link|nic|network'
重点看这些:
到了网络设备这边,重点通常是:
不同厂商命令不一样,但检查点基本差不多:接口状态、模块状态、硬件健康状态、错误统计。
如果是下面这些场景,优先查物理层基本不会错:
有些问题,真不是查出来的,是看出来、摸出来、换出来的。 换根线、换个模块、换个口,有时候比你坐那分析半小时还快。
物理层 OK,只能说明“接上了”,不代表业务就一定能正常跑。
二层最烦的地方就在这:表面上看没断,流量其实没正常走。端口亮着,接口 up 着,主机也在线,可就是不通,或者时通时不通。这类问题特别容易让人怀疑人生。
最常见的坑,一般集中在:
查看本机网卡和 MAC:
ip link show eth0
查看邻居表:
ip neigh
抓包看 ARP 和广播:
tcpdump -i eth0 arp
tcpdump -i eth0 broadcast
tcpdump -i eth0 -nn
如果服务器发出了 ARP 请求,但一直拿不到回应,或者广播流量明显异常,这时候就要开始怀疑二层了。
网络设备这边一般会看:
说白了,这一层核心不是“配了没配”,而是二层转发逻辑是不是通的。
如果出现这些情况,优先怀疑链路层:
这时候先别急着往三层想,很多问题根子就在二层。
到三层之后,排查思路反而要更简单一点。
别一上来就把所有配置翻一遍,先抓主线。网络层最关键的,其实就是三样东西:
❝IP 配对没?ARP 正常吗?路由走偏了吗?
只要这三样有一样出问题,业务表现就会很怪。
查看 IP 地址:
ip addr
查看路由表:
ip route
route -n
查看 ARP / 邻居表:
ip neigh
arp -n
分段 Ping:
ping -c 4 127.0.0.1
ping -c 4 网关IP
ping -c 4 同网段主机
ping -c 4 目标业务IP
ping -c 4 8.8.8.8
看路径:
traceroute 8.8.8.8
tracepath 8.8.8.8
Windows 下可以用:
tracert 8.8.8.8
网络设备侧通常会重点确认:
这里很容易出现一种情况:运维这边看到“我能 ping 通网关”,就觉得网络应该没问题;但网工那边一查,默认路由可能早就写偏了。
网络层最怕的不是复杂,而是方向搞错。 方向一错,后面查再多都容易白费。
这个误区太常见了。
很多人看到 Ping 有回包,就默认“网络没问题”。其实 Ping 只能说明 ICMP 这条路能走,不代表 TCP 正常,也不代表应用端口一定可用。
真正到了传输层,你要看的已经不是“通不通”,而是:
查看监听端口:
ss -lntp
netstat -lntp
查看连接状态:
ss -ant
测试端口是否可达:
nc -zv 目标IP 端口
telnet 目标IP 端口
测试 HTTP / HTTPS:
curl -I http://example.com
curl -kI https://example.com
curl -v http://目标地址
抓包:
tcpdump -i eth0 host 目标IP and tcp
tcpdump -i eth0 port 443 -nn
网络设备侧通常会关注:
如果运维侧抓到大量重传,而网络设备侧又发现会话表异常、NAT 打满,那这时候问题基本就很清楚了。
这种时候,别再只盯着 Ping 了。Ping 能通,不等于业务真的正常。
有一类问题特别像“网络故障”,但查到最后会发现,根本不是网络层出了问题,而是应用层本身有毛病。
链路正常,路由正常,端口也通,可业务就是不对。 这时候就别再死盯着底层了,直接把注意力拉到应用层。
常用命令:
nslookup www.example.com
dig www.example.com
dig @8.8.8.8 www.example.com
ps -ef | grep 服务名
systemctl status nginx
systemctl status docker
ss -lntp | grep 80
ss -lntp | grep 443
curl -v http://127.0.0.1:8080
curl -vk https://域名
tail -f /var/log/nginx/error.log
journalctl -u nginx -f
tail -f /var/log/messages
网工这边虽然不直接排应用,但一般会配合确认:
有时候运维会说“服务是好的”,网工会说“链路是通的”,但一对起来才发现,问题其实卡在负载均衡、网关或者 DNS 这一跳。
这类问题,很多时候已经不是“网络断了”,而是应用自己没稳住,或者应用链路中间件出了问题。
现场排障时,还有一类问题特别容易误判: 看起来像网络故障,实际上是安全策略把流量挡住了。
先确认主机上的防火墙、规则、云安全组。
查看 iptables:
iptables -L -n -v
iptables -t nat -L -n -v
查看 firewalld:
firewall-cmd --list-all
查看 nftables:
nft list ruleset
网络设备这边通常会看:
这些一看就不能只往链路上想,很可能就是规则问题。
彻底不通,反而有时候好查。 最烦的是那种:能访问、但很慢;不算挂、但用起来特别难受。
这类问题最折磨人,因为它不是“有没有”的问题,而是“好不好用”的问题。
查看网卡流量:
sar -n DEV 1 5
iftop -i eth0
查看连接统计:
ss -s
查看系统负载:
top
htop
uptime
查看延迟和丢包:
ping -c 20 目标IP
mtr 目标IP
测试带宽:
iperf3 -s
iperf3 -c 目标IP
别一说“卡”就默认是带宽不够。 很多时候,不是资源少,而是资源被抢了,或者分配得不合理。
很多人平时不爱看日志,觉得枯燥、杂、信息太多。可真到了故障现场,日志和监控往往是最接近真相的东西。
journalctl -xe
journalctl -f
dmesg | tail -n 50
grep -i error /var/log/messages
grep -i denied /var/log/secure
重点看:
很多故障不是突然发生的,而是早就有征兆:
所以排障别只看“现在”,前后时间线也很重要。
做网络排障时间长了,你会慢慢发现,真正厉害的人,不一定是背命令背得最多的人,而是脑子里一直有一条很清晰的线。
我自己更习惯按这个顺序来:
ip addr
ip route
ping -c 4 网关
ping -c 4 目标IP
ss -lntp
nc -zv 目标IP 端口
curl -v http://目标地址
tcpdump -i eth0 host 目标IP -nn
journalctl -f
iptables -L -n -v
这个步骤特别重要。 真实现场最怕的不是查不到,而是信息没对齐。运维说“服务没问题”,网工说“链路没问题”,安全说“策略也没问题”,结果大家说的根本不是同一个点。
所以排障一定要对齐:
把这些对齐,效率会高很多。
网络故障排查,最怕的不是问题复杂,而是没顺序、靠猜、乱改、乱重启。
真正靠谱的办法,其实一直都很朴素:
❝先看物理层,再看链路层;再查 IP、ARP、路由;然后测端口、看连接、抓包;最后把应用、日志、安全策略一起对上。
而且真实现场里,最有效的排障,往往不是某一方单打独斗,而是运维和网工把信息拼起来一起看。
命令当然重要。 但比命令更重要的,是你知道:
说到底,排障不是拼手速,而是拼思路。
你遇到过最离谱的网络故障是什么?欢迎在评论区聊聊。