4. 网络层排查:IP地址配置、子网掩码、网关、路由表、ICMP(Ping/Traceroute)

网络层出问题,说白了就是数据包找不到路,或者根本没人认领。很多朋友一遇到连不上,就跑去抓包、看应用日志,其实大部分时候问题就卡在IP、掩码、网关这三件套上。我个人习惯,排查链路层没问题之后,第一件事就是敲 ipconfig 或 ifconfig,看看地址对不对。

4.1 IP地址配置:你的设备有没有“身份证”?

IP地址配错了,就像寄快递写错了门牌号。你想想看,数据包发出去,对方要么收不到,要么回不来。

核心检查点:

  • 是否获取到有效IP? 如果是 169.254.x.x(Windows)或 0.0.0.0,说明DHCP失败了。这时候先检查DHCP服务器是否活着,或者手动配一个静态IP试试。
  • IP是否冲突? 同一个局域网里,两台设备用了同一个IP,后启动的那台会提示冲突。我在项目现场遇到过,新装了一台打印机,结果整个办公室断断续续掉线,查了半天发现打印机IP和领导电脑的IP撞了。
  • 是否配了正确的子网? 这个下面细说。

我的小技巧: 排查DHCP问题时,我习惯在客户端抓个DHCP交互包(Wireshark过滤 bootp),看看是服务器没回包,还是客户端没发请求。前者查服务器,后者查客户端防火墙或网卡驱动。

4.2 子网掩码:划清“邻里”边界

子网掩码决定了哪些IP算“邻居”,哪些算“外地”。很多人觉得掩码就是 255.255.255.0,其实不然。掩码配错了,设备会认为目标IP不在同一网段,然后一股脑把包扔给网关——如果网关没配或者配错了,就彻底断了。

举个例子:

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

这俩不在一个网段,通信必须经过网关。但如果A的掩码错配成 255.255.0.0(/16),A就会认为B是邻居,直接发ARP请求——结果B不理它,因为B的掩码还是/24,它觉得A是外地人。这就是典型的“单通”问题。

掩码长度 子网掩码 可用主机数 常见场景
/24 255.255.255.0 254 小型办公网络
/16 255.255.0.0 65534 大型园区网
/30 255.255.255.252 2 点对点链路

避坑指南: 我曾经在配置VPN隧道时,把对端掩码写成了/32,结果路由一直不通。后来发现/32表示只有这一个IP,没有广播地址,ARP根本发不出去。记住:点对点链路用/30或/31,别乱用/32。

4.3 网关:通往外部世界的“大门”

网关就是默认路由。设备要访问非本网段的地址,必须把包交给网关。网关配错了,或者网关设备本身没开路由转发,那你就只能跟局域网里的设备玩,上不了外网。

排查步骤:

  1. 确认网关IP是否正确。 用 ip route(Linux)或 route print(Windows)查看默认网关。
  2. 测试网关是否可达。 ping 网关IP,如果不通,检查网关设备是否开机、端口是否up、有没有ACL拦截。
  3. 检查网关设备的路由表。 登录网关,看看它有没有到目标网络的路由。很多家用路由器默认只有一条默认路由到运营商,如果你内部有多个VLAN,需要配静态路由或启用动态路由协议。

我的经验: 有一次客户说“能上QQ但打不开网页”,我第一反应是DNS问题,但查了一圈发现网关配错了——网关指向了一台已经关机的服务器。QQ用的是UDP直连,不受影响;HTTP请求需要TCP三次握手,包发到错误的网关就石沉大海了。所以,“能上QQ不能上网”不一定是DNS,先查网关。

4.4 路由表:数据包的“导航地图”

路由表决定了数据包下一步往哪走。每台设备(包括PC、服务器、路由器)都有自己的路由表。排查路由问题,核心就是看“目标IP匹配了哪条路由”。

路由匹配原则:最长前缀匹配。说白了,就是看路由表里哪条路由的掩码最长,就优先走那条。如果都没有,就走默认路由(0.0.0.0/0)。

常用命令:

# Linux
ip route show
# 或者
route -n

# Windows
route print

# 路由器(Cisco)
show ip route

举个例子,假设路由表如下:

目标网络          掩码              下一跳
192.168.1.0      255.255.255.0     10.0.0.1
192.168.0.0      255.255.0.0       10.0.0.2
0.0.0.0          0.0.0.0           10.0.0.254

如果目标IP是 192.168.1.100,匹配第一条(/24),走 10.0.0.1。如果目标IP是 192.168.2.100,匹配第二条(/16),走 10.0.0.2。如果目标IP是 8.8.8.8,匹配默认路由,走 10.0.0.254。

避坑指南: 我曾经在配置多出口时,忘了加一条回程路由。结果数据包能出去,但回不来——因为网关设备不知道目标网络在哪。记住:路由是双向的,去程和回程都要配。

4.5 ICMP:网络层的“听诊器”

ICMP(Internet Control Message Protocol)是网络层的诊断协议。最常用的两个工具就是 ping 和 traceroute。

4.5.1 Ping:连通性测试

ping 发送ICMP Echo Request,对方回复Echo Reply。如果ping不通,可能的原因:

  • 目标设备禁用了ICMP(很多服务器出于安全考虑会关掉)
  • 中间防火墙拦截了ICMP
  • 路由不可达(上面说的那些问题)
  • ARP解析失败

但要注意:ping不通不代表网络不通。我遇到过一台Linux服务器,iptables规则把ICMP全丢了,但TCP 80端口是正常的。所以,ping不通的时候,换个端口试试,比如 telnet IP 80 或 curl -I http://IP。

我的习惯: 我会先ping网关,通了说明链路层和IP层没问题;再ping外网(比如114.114.114.114),通了说明网关有路由;最后ping域名(比如baidu.com),通了说明DNS也正常。这样一层层剥开,问题出在哪一目了然。

4.5.2 Traceroute:路径探测

traceroute(Windows下是 tracert)利用TTL(Time To Live)字段,逐跳探测数据包经过的路径。它能告诉你:

  • 数据包在哪一跳丢了
  • 哪一跳延迟高
  • 有没有路由环路

举个例子:

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.234 ms  1.123 ms  1.098 ms
 2  10.0.0.1 (10.0.0.1)  5.678 ms  5.543 ms  5.432 ms
 3  * * *
 4  172.16.0.1 (172.16.0.1)  20.123 ms  19.876 ms  19.654 ms
 5  8.8.8.8 (8.8.8.8)  30.456 ms  30.321 ms  30.210 ms

第3跳全是 *,说明那台设备没回ICMP超时消息,或者防火墙拦了。但只要第4跳能继续,就说明路径还是通的。如果某跳之后全断了,那问题就出在那跳。

避坑指南: 我曾经遇到一个路由环路问题,traceroute显示某几跳在反复循环(比如A->B->C->A->B->C...)。这是因为路由表配错了,导致数据包在两个路由器之间来回跳,直到TTL耗尽。这时候登录路由器看路由表,找到那条错误的路由删掉就行。

4.6 网络层排查流程图

下面这张图总结了我排查网络层问题的基本思路。你可以把它当成一个检查清单,按顺序走一遍,大部分问题都能定位到。

网络层排查流程图 网络层排查流程图 开始排查网络层 1. 检查IP地址配置 ipconfig / ifconfig 2. 检查子网掩码 是否在同一网段? 3. 检查默认网关 ping 网关IP 4. 检查路由表 ip route / route print 5. ICMP诊断 ping / traceroute 定位问题 / 修复 常见问题 • IP冲突 • 掩码不匹配 • 网关不可达 • 路由缺失/环路 • ICMP被拦截

嗯,网络层排查其实没那么玄乎。记住一个原则:从近到远,从简单到复杂。先看自己,再看邻居,最后看远方。配好IP、掩码、网关,路由表别乱写,ICMP工具用起来,大部分连接断开问题都能在十分钟内搞定。