4. 网络层故障(上):IP地址冲突、子网掩码配置错误、默认网关不可达

网络层,说白了就是数据包的「导航系统」。IP地址是门牌号,子网掩码是小区范围,默认网关是出小区的路口。这三个东西任何一个出问题,你的数据包就送不出去。

我干网络这十几年,遇到最多的故障就集中在这三个点上。今天咱们一个一个掰开揉碎了讲。

4.1 IP地址冲突

IP地址冲突,就是局域网里两台设备用了同一个IP。交换机不报错,路由器也不报错,但网络就是断断续续的。

典型现象: 电脑右下角弹出「IP地址冲突」提示,或者没提示但网络时通时断。Windows系统会每隔几分钟发一次ARP探测,发现冲突就弹窗。

4.1.1 为什么会冲突?

原因其实就三种:

  • 手动配置撞车 —— 有人手贱设了静态IP,正好跟DHCP地址池里的地址一样。
  • DHCP地址池耗尽 —— 新设备接入时没地址可分配,有人就手动填了一个,结果撞了。
  • 虚拟机/容器漂移 —— 我遇到过最坑的一次,是VMware的虚拟机克隆后没重置网卡MAC,导致IP冲突。查了两小时。

4.1.2 排查方法

我个人习惯按这个顺序来:

  1. 看现象 —— 先问用户:是刚开机就这样,还是用着用着突然断的?刚开机一般是静态IP冲突,用着断一般是DHCP续租冲突。
  2. 查ARP表 —— 在网关或核心交换机上执行 arp -a,看目标IP对应了几个MAC地址。两个MAC就是冲突。
  3. 抓包确认 —— 在冲突的设备上抓ARP包。正常ARP应答只有一个,冲突时你会看到两个不同的MAC轮流应答。

实战命令:

# Windows 查看ARP表
arp -a

# 持续监听ARP冲突(需要管理员权限)
arp -s 192.168.1.100 00-11-22-33-44-55

# Linux 查看ARP表
ip neigh show

# 抓ARP包
tcpdump -i eth0 arp and host 192.168.1.100

4.1.3 怎么解决?

分情况处理:

场景 操作
静态IP冲突 找到冲突的设备,改成一个没被占用的IP。建议用 ping 先测试一下目标IP是否通。
DHCP冲突 在DHCP服务器上查租约记录,找到冲突的MAC,释放租约或排除该地址。
虚拟机克隆 重新生成MAC地址,或者手动指定一个不冲突的IP。

我的经验: 我曾经在一个200人的办公室里排查IP冲突,最后发现是某位同事的无线打印机用了静态IP,正好跟新来的实习生电脑的DHCP地址撞了。从那以后,我要求所有打印机、服务器都用DHCP静态绑定,别手动配。

4.2 子网掩码配置错误

子网掩码这东西,很多人配完就不管了。但你知道吗?掩码错一位,整个网络就废了。

举个例子:IP是 192.168.1.10,掩码是 255.255.255.0,那它认为自己在 192.168.1.0/24 这个网段里。如果掩码错写成 255.255.0.0,它就会认为 192.168.0.0/16 都是本地网络,发数据包时直接ARP广播,不找网关。

4.2.1 典型症状

  • 能ping通同网段,但ping不通网关 —— 这是最常见的。因为掩码算错了,设备认为网关不在同一个网段,所以不发ARP请求,直接丢包。
  • 能上网,但很慢 —— 掩码配大了,设备以为很多IP都在本地,发大量ARP广播,交换机CPU飙升。
  • 完全不能上网 —— 掩码配小了,设备认为网关不在本地,也不在默认路由范围内,直接丢弃。

4.2.2 排查方法

我一般三步走:

  1. 看IP配置 —— ipconfig /all(Windows)或 ip addr show(Linux),确认掩码值。
  2. 算网段 —— 用脑子算或者用计算器。把IP和掩码做与运算,看结果是不是跟网关地址在同一网段。
  3. 对比正常设备 —— 找一台能正常上网的设备,对比它的掩码。很多时候就是抄错了。

快速验证命令:

# Windows 查看详细IP信息
ipconfig /all

# Linux 查看IP和掩码
ip addr show

# 手动计算网段(以192.168.1.10/24为例)
# IP:   192.168.1.10  -> 11000000.10101000.00000001.00001010
# 掩码: 255.255.255.0 -> 11111111.11111111.11111111.00000000
# 网段: 192.168.1.0   -> 11000000.10101000.00000001.00000000

4.2.3 怎么修?

说白了就一句话:改成正确的掩码。但要注意:

  • 如果是DHCP分配的,检查DHCP作用域的掩码设置。
  • 如果是静态配置的,直接改网卡属性。
  • 如果是路由器接口的掩码配错了,那影响面就大了,整个网段都可能不通。

注意: 改掩码前一定要确认新掩码不会导致IP地址越界。比如 192.168.1.10/24 改成 /23 没问题,但改成 /25 的话,这个IP可能就不在原来的网段里了。

4.3 默认网关不可达

默认网关,就是设备出局上网的「大门」。门关了,你就只能在内网转悠。

我记得有一次,整个办公室突然上不了外网,但内网文件服务器访问正常。我第一反应就是网关挂了。结果一查,网关设备正常运行,是交换机上连网关的端口被误关了。

4.3.1 为什么会不可达?

原因很多,我列几个常见的:

  • 网关设备宕机 —— 路由器、防火墙死机或重启。
  • 链路故障 —— 网线断了、光模块坏了、交换机端口down了。
  • ARP问题 —— 网关的MAC地址在ARP表里过期了,或者被错误地解析到了别的设备。
  • 路由问题 —— 网关设备本身的上行链路断了,或者路由表被清空了。
  • ACL/QoS限制 —— 有人配了访问控制列表,把某些IP的流量给拦了。

4.3.2 排查步骤

我个人的排查顺序是这样的:

  1. 先ping网关IP —— 不通?那问题就在本机到网关之间。通?那问题可能在网关的上行链路。
  2. 查ARP表 —— arp -a | grep 网关IP,看有没有对应的MAC地址。没有?说明ARP解析失败。
  3. 查路由表 —— route print(Windows)或 ip route show(Linux),确认默认路由存在且指向正确的网关。
  4. 查网关设备 —— 登录网关,ping外网(比如8.8.8.8),确认网关本身能不能上网。
  5. 查物理链路 —— 看交换机端口指示灯,看网线是否松动,看光模块收发光功率是否正常。

常用命令:

# 测试到网关的连通性
ping 192.168.1.1

# 查看ARP表
arp -a

# Windows查看路由表
route print

# Linux查看路由表
ip route show

# 跟踪路由路径
tracert 8.8.8.8   # Windows
traceroute 8.8.8.8  # Linux

4.3.3 解决方案

故障原因 解决方法
网关设备宕机 重启网关设备,检查电源和硬件状态。
链路故障 更换网线、光模块,检查交换机端口配置(是否被shutdown)。
ARP问题 清除ARP缓存:arp -d 网关IP,然后重新ping触发ARP解析。
路由问题 检查网关设备的路由表,添加或修正默认路由。
ACL限制 检查网关设备的访问控制列表,放行被拦截的流量。

避坑指南: 我曾经遇到一个案例,网关能ping通,但就是上不了网。查了半天,发现是网关设备的NAT配置被误删了。所以,ping通网关不代表网关能帮你转发数据,还要检查NAT、路由转发等功能是否正常。

4.4 知识体系总览

下面这张图,把这三个故障的关系和排查路径串起来了。你保存下来,遇到问题对着走一遍,基本能解决80%的网络层故障。

网络层故障排查总览 IP地址冲突 子网掩码配置错误 默认网关不可达 症状: 时通时断 / 冲突弹窗 症状: 能ping同网段/不能上网 症状: 内网通/外网不通 排查: 1. 查ARP表 2. 抓ARP包 排查: 1. 查看IP配置 2. 计算网段 排查: 1. ping网关 2. 查路由表 解决:改IP / 绑定MAC 解决:修正掩码 解决:修复链路/路由 提示:排查时从症状入手,自上而下走一遍,不要跳步骤

4.5 小结

网络层这三个故障,说白了就是「你是谁、你在哪、你找谁」的问题。IP地址冲突是「你是谁」搞混了,子网掩码是「你在哪」算错了,默认网关是「你找谁」找不到了。

排查的时候,别慌。先看症状,再查配置,最后动手修。我见过太多人一上来就重启设备,结果问题没解决,还把正常业务给断了。

嗯,今天就到这儿。记住这张图,下次遇到网络层故障,你心里就有底了。