4. 网络层故障排查:IP、子网掩码、网关与路由

网络层,说白了就是数据包在互联网上找路的那一层。IP地址是门牌号,子网掩码划片区,默认网关是出小区的路口,路由表则是整个导航地图。这一层出问题,最常见的表现就是——能ping通自己,但死活ping不通隔壁工位的同事。

我处理过的网络故障里,大概有六成都能归到网络层配置错误。今天咱们就把这些点挨个捋一遍。

4.1 IP地址配置:别小看这个门牌号

IP地址配错了,网络肯定不通。但有些错误藏得很深。

核心原则:同一广播域内的设备,IP地址必须在同一网段,且不能冲突。

我遇到过最坑的一次:某公司新来的运维把服务器IP配成了网关地址,结果全网断断续续掉线。查了整整两小时,最后发现是IP冲突。嗯,从那以后我养成了一个习惯——配IP之前先扫一遍ARP表。

排查IP配置问题的常用命令:

# Windows
ipconfig /all

# Linux
ip addr show
# 或
ifconfig -a

检查要点:

  • IP地址是否在预期范围内
  • 是否与同网段其他设备冲突(用arp -a看)
  • DHCP获取的地址是否过期(ipconfig /renew试试)

4.2 子网掩码:划片区的尺子

子网掩码决定了你的设备认为“哪些IP是邻居,哪些需要找网关”。掩码错了,设备会误判通信范围。

举个例子:

设备A:192.168.1.10/24(掩码255.255.255.0)
设备B:192.168.2.20/24(掩码255.255.255.0)

这两个设备不在同一网段,通信必须经过网关。但如果把设备A的掩码改成/16(255.255.0.0),它就会认为设备B是邻居,直接发ARP请求——结果当然不通。

注意:子网掩码不一致会导致“单向可达”的诡异现象。A能ping通B,B却ping不通A。为什么?因为A认为B在本地,B认为A在远端,B的回应包会发给网关,网关如果没配回程路由,包就丢了。

快速计算网段的技巧:

IP地址:192.168.1.100
掩码:255.255.255.0(/24)
网络地址:192.168.1.0
广播地址:192.168.1.255
可用主机:192.168.1.1 - 192.168.1.254

我个人习惯用 ipcalc 工具(Linux)或在线计算器,但手算也得会——面试常考。

4.3 默认网关:出小区的唯一路口

默认网关是设备访问非本地网络时的下一跳。配错了,内网能通,外网全挂。

检查默认网关的命令:

# Windows
route print -4 | findstr "0.0.0.0"

# Linux
ip route show default
# 或
route -n | grep "^0.0.0.0"

常见故障场景:

  • 网关地址配错:比如网关是192.168.1.1,你配成了192.168.1.254——而这个地址没人用,包就丢了
  • 网关没配:设备只有IP和掩码,没有默认网关,只能和同网段通信
  • 网关设备挂了:ping网关不通,那肯定出不去

小技巧:先ping网关,通了再ping外网。如果网关通但外网不通,问题可能在路由或DNS上。

4.4 路由表分析:数据包的导航图

路由表决定了数据包怎么走。每台设备(包括PC)都有路由表,只是PC的很简单——要么本地直连,要么走默认网关。

查看路由表:

# Windows
route print -4

# Linux
ip route show
# 或
netstat -rn

路由匹配原则:最长前缀匹配。说白了,就是找最精确的那条路由。

举个例子:

目标IP:192.168.1.100

路由表中有:
192.168.1.0/24 → 直连
0.0.0.0/0 → 192.168.1.1

匹配结果:走192.168.1.0/24,因为前缀更长(24 > 0)

我排查过一个案例:某台服务器能ping通同网段,但访问另一个网段时通时不通。查路由表发现,有一条旧的静态路由指向了错误的下一跳。删掉那条路由后,问题解决。

排查思路:

  1. 用 traceroute 或 tracert 看数据包走到哪一步断了
  2. 在每一跳设备上查路由表,看有没有回程路由
  3. 检查路由的度量值(metric),有时候路由存在但优先级低

4.5 ICMP协议:Ping与Traceroute的深度使用

ICMP是网络层的“信使”,负责传递错误信息和诊断结果。Ping和Traceroute都是基于ICMP的工具。

4.5.1 Ping:不只是测通断

很多人用ping就是敲一下看通不通。其实ping能告诉你很多信息。

# 基本用法
ping 8.8.8.8

# 持续ping(Linux默认,Windows加 -t)
ping -t 192.168.1.1

# 指定包大小(测试MTU问题)
ping -l 1472 192.168.1.1

# 指定TTL(测试路径跳数)
ping -i 5 8.8.8.8

解读ping结果:

  • Request timed out:没收到回应。可能是目标不可达,也可能是防火墙拦截了ICMP
  • Destination Host Unreachable:本地路由表里没有到目标的路径
  • TTL expired in transit:数据包超过了最大跳数,说明有路由环路
  • Reply from ...: bytes=32 time<1ms TTL=128:正常回应,TTL值可以推断操作系统类型(Windows默认128,Linux默认64)

注意:很多生产环境会禁用ICMP。ping不通不代表网络不通,可能是防火墙策略。这时候要用TCP层面的工具(如telnet、nc)来验证端口连通性。

4.5.2 Traceroute:追踪每一跳

Traceroute利用TTL机制,逐跳探测路径上的每个路由器。

# Windows
tracert 8.8.8.8

# Linux/macOS
traceroute 8.8.8.8

输出解读:

1  <1 ms  <1 ms  <1 ms  192.168.1.1
2   2 ms   2 ms   2 ms  10.0.0.1
3   *      *      *     Request timed out.
4  15 ms  15 ms  15 ms  172.16.0.1
5  20 ms  20 ms  21 ms  8.8.8.8

第三跳超时,常见原因:

  • 该路由器禁用了ICMP回应
  • 有防火墙拦截了TTL超时消息
  • 路径上有负载均衡设备

我记得有一次排查跨国访问慢的问题,用traceroute发现数据包绕到了欧洲,明明目标在亚洲。后来发现是BGP路由策略的问题,调整后延迟从300ms降到了80ms。

4.5.3 高级用法:路径MTU发现

用ping配合DF(Don't Fragment)标志,可以探测路径上的MTU值。

# Linux
ping -M do -s 1472 8.8.8.8

# Windows
ping -f -l 1472 8.8.8.8

从1472开始,逐步减小包大小,直到能ping通。最终值加上28(IP头+ICMP头)就是路径MTU。

实战经验:VPN连接经常出现“能ping通但打不开网页”的问题,多半是MTU不匹配。把MTU从1500降到1400,问题往往就解决了。

4.6 知识体系总览

下面这张图把网络层故障排查的核心逻辑串起来了:

网络层故障排查知识体系 网络层故障排查核心逻辑 网络不通 / 访问慢 / 单向可达 排查步骤:从底层到上层,逐层验证 ① IP地址配置检查 IP冲突?子网掩码正确? DHCP地址是否过期? 命令:ipconfig / ip addr ② 网关与路由检查 默认网关是否可达? 路由表是否有回程路由? 命令:route print / ip route ③ ICMP诊断工具 Ping:测通断、延迟、丢包 Traceroute:追踪路径 MTU探测:-f / -M do 参数 定位根因 → 修复配置 → 验证连通性 💡 排查顺序:先本地(IP/掩码)→ 再网关 → 再路由 → 最后用ICMP工具验证

4.7 实战案例:一次典型的网络层故障排查

最后分享一个我实际处理过的案例,帮你把上面的知识点串起来。

现象:某办公室的电脑能上内网,但打不开外网网站。其他同事正常。

排查过程:

  1. 查IP配置:ipconfig /all → IP、掩码、网关都有,DHCP正常
  2. ping网关:通,延迟<1ms
  3. ping外网IP(如114.114.114.114):不通,显示"Destination Host Unreachable"
  4. 查路由表:route print -4 → 发现默认网关的metric值是256(无效),而另一条到10.0.0.0/8的metric是20
  5. 根因:有人手动添加了一条静态路由,导致默认网关被覆盖
  6. 修复:删除那条静态路由,route delete 0.0.0.0 然后重新获取DHCP
  7. 验证:ping 114.114.114.114 通了,网页正常打开

经验总结:遇到网络故障,别急着重启。先看配置,再看路由,最后用工具验证。80%的问题都能在十分钟内定位。