干网络运维这几年我越来越觉得IPv4 故障这个词在双栈环境里带有很强的迷惑性。用户报障说上不了网、访问不了业务系统你 ping 网关通了、ping 公网也通了但问题确实存在——这时候如果还按单栈时代的思路一根筋排查 IPv4很容易绕进死胡同。问题可能压根不在 IPv4 身上而是被 IPv6 的路由优先级、DNS 解析顺序、甚至终端的协议栈回退机制给带偏了。这篇文章想把我在 IPv4/IPv6 双栈网络里做 IPv4 故障排查时沉淀下来的一套闭环思路完整梳理出来从接到报障到信息收集、分层过滤、协议栈隔离、根因确认再到修复验证和复盘沉淀。每一环该问什么、该测什么、有哪些高发坑点我都会结合具体实操展开。适合正在做双栈网络运维的同行也适合刚接触双栈排障、想建立系统排查方法的入门读者。1. 双栈环境下的IPv4故障为什么值得单独写一篇排查指南先说一个反直觉的结论在 IPv4/IPv6 双栈网络中真正需要修的可能不是 IPv4但报障描述里一定会带一句IPv4 不行因为大部分人眼里IP 地址默认就是 IPv4。这是双栈排障的第一个难点——现象与根因天然错位。1.1 双栈不是两条平行路而是一套路上的两个世界双栈网络在物理链路上同时跑 IPv4 和 IPv6 两套协议栈终端上会同时拿到两组地址、两组网关、两组 DNS 配置。看起来像是两条独立的路但它们在操作系统内部共享同一个邻居表、同一套路由决策逻辑、同一份 DNS 解析结果。这意味着 IPv6 侧的异常比如 IPv6 默认路由缺失、RA 通告不稳定完全可能表现为IPv4 访问卡顿因为系统先尝试走 IPv6等到超时才回退 IPv4。我在某企业园区网里就遇到过一个典型场景终端从 DHCPv6 拿到了 IPv6 地址但 IPv6 出口链路在核心交换机上少了一条回程路由。结果终端访问一个只有 IPv4 A 记录的业务系统时流量被系统按IPv6 优先策略先尝试走 IPv6 路由黑洞丢包等到 3 秒超时后才回退 IPv4。用户感知就是每次打开页面都要转圈三秒钟偶尔直接超时。这个现象的根因是 IPv6 路由缺失可报障单上写的是IPv4 网络故障。1.2 单栈时代的经验为什么在这里会失灵以前做 IPv4 单栈排障路径相对线性物理层通不通、链路层邻居表、网络层路由、传输层端口、应用层报错一层一层往上问答案往往就在某一层。双栈时代这套逻辑还在但每一层都要多问一句这个现象在当前层是 IPv4 导致的、IPv6 导致的还是两个栈的交互导致的举例来说单栈时代 DNS 解析只有 A 记录解析失败就是 DNS 服务或网络问题。双栈时代多了 AAAA 记录解析成功不代表网络通——系统拿到 AAAA 记录后可能优先走 IPv6而 IPv6 实际不可达。再比如单栈时代防火墙策略只需考虑源目 IPv4 地址和端口双栈时代要分别核对两套 ACL很多故障来自IPv4 策略放通了、IPv6 策略漏配了但表面上却是同一份业务配置。所以双栈排障的第一步不是急着测连通性而是先建立一个意识先把这个故障到底是不是真的发生在 IPv4 上这个前置问题搞清楚。后面所有排查手段其实都在回答这一个问题。2. 从物理链路到应用层这套分层过滤法能帮你快速缩小范围接到IPv4 故障报障后我习惯先画一条从终端到目标资源的完整路径然后按层做快速过滤。分层不是机械地走完每一层而是用排除法把故障范围快速收缩到某一段、某一层避免在无关方向上消耗时间。2.1 先判断物理与链路层网卡、协商和邻居表第一件事是看网卡状态。终端上执行ipconfig /allWindows或ip addrLinux确认网卡 up、速率协商正常、拿到地址。这一步虽然基础但恰恰是双栈环境里最容易出现半故障的地方某些网卡驱动在同时启用 IPv4 和 IPv6 时会出现 IPv4 正常但 IPv6 DAD 冲突、或链路本地地址反复变更的情况间接拖累整块网卡的健康状态。判断邻居关系时IPv4 对应 ARP 表arp -aIPv6 对应邻居发现协议的邻居缓存ip -6 neigh show。如果 IPv4 能 ping 通网关但业务异常建议顺手看一眼 IPv6 邻居表是否完整。我一个实测经验终端能访问 IPv4 外网但 IPv6 邻居表里网关条目频繁过期导致系统认为 IPv6 链路不稳定在双栈回退策略下产生间歇性访问延迟。这种物理链路正常、邻居关系异常的隐性故障不看邻居表根本发现不了。2.2 网络层路由表与网关这次要把IPv6也扫一眼网络层排查离不开路由表。Windows 用route print、Linux 用ip route重点确认默认路由指向是否正确、到目标网段有没有精确匹配路由。双栈环境有个容易踩的坑IPv4 和 IPv6 的默认路由并非总是共用的有些网络设备会给 IPv6 下发默认路由但实际下一跳不可达或者反序配置。终端路由表里同时存在两条默认路由时操作系统的源地址选择规则RFC 6724会优先匹配 IPv6导致流量被引向黑洞。所以我在网络层排查时会做一次双栈路由快照把终端的route print和 IPv6 路由表一起打出来比对默认路由的下一跳是否可达、两条路由的优先级谁高。曾经遇到过一个案例终端 IPv4 默认路由走的是有线网关IPv6 默认路由却指向了一个已失效的无线链路网关结果系统判定 IPv6 链路存在把所有业务流量优先丢向 IPv6表现就是有线网络明明 IPv4 正常却始终打不开网页。这种问题如果只盯 IPv4 路由表排一辈子也排不出来。2.3 传输层与应用层端口探测与报错语义网络层通不代表应用层通。传输层排查的核心是用端口探测判断链路是否真的到达目标服务Windows 上用Test-NetConnection 目标IP -Port 端口Linux 上用nc -vz 目标IP 端口。这一步能有效区分网络不通和服务没起。应用层的报错信息往往是最直接线索但要注意语义偏移。比如浏览器报无法访问此网站可能由 DNS 解析失败、TCP 连接超时、TLS 握手失败等多重原因导致而应用系统提示连接超时则建议先确认是连接建立超时还是响应超时这两种情况对应的故障位置完全不同。我通常会把应用报错原文记录下来再结合传输层探测结果交叉比对避免被模糊的报错带偏方向。分层过滤法的价值在于快速排除物理链路有问题就直接换线换口路由表有问题就看网关和回程端口不通就去查服务监听和防火墙。每一层都留下了明确的判定依据而不是凭感觉到处试。3. DNS优先级的坑当IPv6解析让IPv4背锅的时候有一类故障特别值得单独拿出来讲因为它是双栈网络里最典型的IPv4 表象、IPv6 根因案例而且在高版本操作系统上触发率极高。我在排障中遇到的所有时好时坏的 IPv4 故障里至少有三成和这套机制有关。3.1 现象与本质AAAA记录如何让IPv4背锅双栈终端向 DNS 发起解析时通常同时查询 A 和 AAAA 两类记录。只要域名存在 AAAA 记录即 IPv6 地址多数主流操作系统会按IPv6 优先策略尝试先用 IPv6 发起连接。这是 RFC 标准建议的默认行为本身没毛病前提是 IPv6 链路真实可用。但实际很多网络的 IPv6 是半吊子状态地址能分下去出口链路质量差、丢了路由甚至安全设备对 IPv6 报文默认丢弃。这时候终端拿着一个看起来可用的 IPv6 地址尝试连接业务系统结果必然是超时。现代操作系统有一个快速回退机制Happy Eyeballs会尝试在 IPv6 连接不成功时切换到 IPv4但切换需要探测时间一般几百毫秒到数秒不等用户体验就是卡一下才打开或偶尔打不开。这里有一个认知误区需要纠正很多人测试 DNS 解析时只执行nslookup看是否返回了 IP 地址返回了就认为 DNS 没问题。但在双栈场景下解析到 AAAA 记录恰恰可能是故障的起点——解析正常不等于连接可用关键要看这条 AAAA 记录对应的 IPv6 链路是否真实通畅。3.2 验证手段与修复方向我遇到访问慢、间歇性超时的第一反应就是分别测试 IPv4 和 IPv6 两条链路的实际连通性。隔离测试命令很直接Windows 和 Linux 都支持# 强制走IPv4 ping -4 目标域名或IP # 强制走IPv6 ping -6 目标域名或IP如果ping -4正常、ping -6不通或严重丢包再回来查 DNS 解析结果# 查看A记录IPv4 nslookup -typeA 目标域名 # 查看AAAA记录IPv6 nslookup -typeAAAA 目标域名确认域名确实有 AAAA 记录且本机 IPv6 链路不可达后问题就定位了。修复方向有三层从根治到临时应对依次是修复 IPv6 链路本身让 AAAA 记录对应的路径真正可达这是最理想的方案梳理应用系统的 DNS 策略对仅支持 IPv4 的业务域不做 AAAA 通告减少无谓的 IPv6 尝试终端侧临时禁用 IPv6 或调整优先级作为应急手段但要注意策略一致性别只改单台。有一种很隐蔽的情况也提一下部分老旧应用系统自身存在 IPv6 适配缺陷监听在双栈套接字上但只正确处理了 IPv4 连接收到 IPv6 连接请求后直接无响应。这种故障排查起来更费时因为链路通、端口通、TLS 都建立不起来最终往往要借助抓包才能看见SYN 发出去了、没回包的细节。后面我会专门说抓包的思路。4. 端到端对照与协议栈隔离判断问题真正归属的实操方法分层过滤把故障范围缩小到某一段链路之后接下来要做的是协议栈隔离和端到端对照。这一阶段的目标非常明确用可控实验证明问题到底出在 IPv4 还是 IPv6、出在哪一跳、出在协议栈还是应用。4.1 协议栈隔离法-4/-6参数与临时禁用协议栈隔离的核心思路是在对同一目标、同一路径的前提下只改变一个变量。比如目标域名同时有 A 和 AAAA 记录我们可以强制终端只用 IPv4 访问一次、再用 IPv6 访问一次对比两次行为差异。这就是上面提到过的ping -4/ping -6、curl -4/curl -6的用途。更进一步可以在终端上临时禁用 IPv6 协议栈验证去掉 IPv6 后故障是否消失。Windows 上可以在网卡属性里取消勾选 IPv6Linux 上可以通过sysctl临时关闭这是我做隔离实验最常用的方法。但切记这只是一个诊断性实验不是最终修复方案。禁用 IPv6 后故障确实消失只能说明 IPv6 链路参与了这个故障具体问题在网络链路、路由策略还是终端配置还需要顺着链路继续查。4.2 端到端对照从终端到网关到远端的分段测试端到端对照的核心思想是逐跳定位。我常用的做法是把一条完整路径拆成几段分段测试并对照结果测试段命令示例判定规则终端到本机回环ping 127.0.0.1/ping ::1不通说明本机协议栈异常终端到网关ping 网关IPv4/ping 网关IPv6不通说明二层或网关故障网关到远端在网关设备上 ping 远端地址不通说明是出口或远端问题终端到远端逐跳tracert -d 目标IP在哪一跳丢包问题就在哪一段在具体项目里我习惯挑选一个已知正常的终端作为对照组。它和故障终端位于同一网段、走同一出口如果两个终端对同一目标的测试结果出现显著差异那么问题基本锁定在终端本身配置、策略、协议栈状态如果两个终端的表现一致问题则大概率在共享路径网关、出口、DNS、防火墙。这个方法简单到几乎没有技术门槛但它能有效减少大量无效排查。4.3 抓包确认抓什么位置、用什么过滤条件遇到链路测试全部正常但业务依然故障的幽灵问题最终手段就是抓包。抓包位置的选择非常关键终端侧抓包只能验证发出去和收回来的报文中间哪个环节被丢弃看不到如果需要确认路径上的问题最好在网关和出口设备同时镜像抓包做报文对比。Wireshark 的过滤条件建议分三步展开。先看协议栈归属过滤表达式ip.addr 10.1.1.100 || ipv6.addr 2001:db8::100可以快速筛出某个终端的所有报文再看连接状态过滤tcp.flags.syn 1观察三次握手是否有响应最后看重传过滤tcp.analysis.retransmission大量重传通常意味着路径上存在丢包或链路质量劣化。我在双栈排障中通过抓包发现过不少链路测试正常但实际丢包的场景——ping走的是 ICMP 报文有些中间设备对 ICMP 做了限速或优先转发所以 ping 测试的结果并不能等价于 TCP 业务的真实体验。只有站在业务流量的角度去抓包才能看到应用实际遭遇的转发质量问题。5. 一个完整案例从业务访问时好时坏到根因落地的全流程复盘理论讲了这么多用一个真实结构的案例把整个闭环串起来。这个案例来自某个有双栈网络的企业办公环境现象是部分终端访问总部核心业务系统时好时坏报障单上写的是IPv4 网络故障。5.1 报障与初判收集信息比动手测试更重要我接到报障后第一件事不是跑现场而是把信息收集完整。这次关键信息有三条故障终端约占办公终端的四分之一分布在不同楼层正常终端能同时访问 IPv4 和 IPv6 资源故障终端的共性是都从某网段获取了 IPv6 地址前缀。这三条信息综合下来基本把方向指向了IPv6 配置或链路相关问题而不是全网性的 IPv4 故障。这个初判的价值在于避免了最耗时的做法——逐台终端排查网线和端口。双栈排障遇到影响固定的终端组优先排查它们之间的共性配置通常比逐台测试更高效。5.2 对照组实验为什么同样的应用有的终端正常在故障终端上执行ping -4 业务系统IP结果延时正常、无丢包执行ping -6 业务系统IP结果 50% 丢包且延时极高。再换到正常终端上执行同样的两组测试IPv4 和 IPv6 的结果都正常。对照结果把故障范围锁定到了故障终端的 IPv6 链路质量差上接下来的问题是为什么同一栋楼、同一个出口这批终端的 IPv6 链路会差到这种程度5.3 根因落定问题不在IPv4而在IPv6路由缺失进一步检查发现故障终端使用的是某个未规划的 IPv6 前缀而核心网络设备上根本没有回程路由——发往这个前缀的报文到了核心交换机就被丢弃。正常终端使用的前缀是网络规划内的路由完整所以链路质量正常。到这里整个故障链路已经完整业务系统域名同时通告 A 和 AAAA 记录所有终端默认优先走 IPv6故障终端拿到一个网络设备不认的前缀IPv6 报文发出后大部分被丢弃终端等待 IPv6 超时后回退 IPv4但回退需要时间所以表现为时好时坏、偶尔超时。IPv4 链路从头到尾都是好的它只是被迫承担了 IPv6 故障的表象。5.4 修复、验证与复盘修复动作分两步先修正核心设备上缺失的路由配置让已分配的 IPv6 前缀不再落入黑洞这是根治同时排查为什么会有未规划前缀被下发追溯到网关设备的 RA 配置错误修复后故障终端重新获取到正确前缀。验证不是一个动作而是一段时间的观察。我在修复后做了三件事终端侧重新执行ping -6 业务系统IP确认丢包消失业务访问测试确认页面打开速度恢复正常连续监测一周确认没有回升现象。这个过程就是闭环中最重要的验证环节——修完没验证等于没修完。复盘时沉淀了两条经验一是双栈网络中所有 IPv6 前缀必须纳入路由规划不允许能下发但不可达的悬空前缀存在二是报障单上写IPv4 故障只是用户视角的描述排查时必须先分辨真实协议栈归属。这两条经验后来都固化到了排查手册里成了后续同类故障的快速处置依据。6. 双栈排障常用命令与输出解读速查最后整理一份我在双栈环境排障时高频使用的命令清单按功能分类附上输出解读要点。这不是完整手册但覆盖了 90% 的日常场景。6.1 连通性与路径类命令命令适用范围双栈注意点ping -4/ping -6基础连通性测试不加参数时系统可能自动选择栈诊断时必须强制指定tracert -dWin/traceroute -nLinux逐跳路径探测同样支持-4/-6参数只显示沿途路由器出接口地址注意有些设备会隐藏pathping连续丢包与延迟分析比 tracert 更适合间歇性丢包场景但耗时较长这部分的一个实操心得ping通了不等于业务可达ping丢包也不一定等于业务全挂。ICMP 和 TCP 业务在中间设备上的处理优先级往往不同最严谨的判断方式是直接对业务端口做 TCP 连接测试而不是反复 ping。6.2 解析与端口类命令命令用途解读要点nslookup -typeA 域名/-typeAAAA 域名查看域名的解析记录同时比对两类记录是否存在是判断DNS 正常但 IPv6 链路异常的前提Test-NetConnection 目标 -Port 端口WinTCP 端口连通性测试返回 TcpTestSucceeded: True/False 是核心判定依据nc -vz 目标 端口Linux同上端口通但不代表应用层正常还需要结合应用日志判断一个容易忽略的细节DNS 解析结果在不同终端上可能不一样取决于终端的 DNS 服务器配置和缓存状态。排障时建议用故障终端自身的 DNS 服务器做解析而不是用本地电脑的 DNS 服务器去查否则可能得出完全不同的结论。6.3 双栈状态与抓包类命令双栈排障离不开查看协议栈状态。Windows 上netsh interface ipv6 show addresses可以查看 IPv6 地址的 DAD 状态和地址类型route print同时展示两个协议栈的路由表。Linux 上ip addr和ip -6 route show功能类似。这些命令输出的核心价值在于确认两点地址是否在可用前缀范围内默认路由的下一跳是否可达。抓包方面Wireshark 的常用过滤条件已经在前文提过这里再补充一个实用组合排查应用访问慢时过滤条件tcp.analysis.time可以查看每个 TCP 连接段的时延统计排查TLS 握手失败时过滤tls.handshake能看到握手过程停在哪个阶段。抓包结束导出的日志还能用于和同事复核比口头描述直观得多。如果觉得 Wireshark 太重现场快速排查也可以用 tcpdump# 监听指定IP的所有TCP流量 tcpdump -i eth0 host 10.1.1.100 and tcp # 监听HTTP流量 tcpdump -i eth0 tcp port 807. 一些只有实践中才体会得到的经验最后分享几条我在大量双栈排障里沉淀下来的个人心得不一定成体系但很实用。第一双栈排障的第一原则永远是先区分流量走的是哪个协议栈再往下排查。很多同事一听到IPv4 故障就直奔 IPv4 的网关和路由折腾半天找不到根因最后发现是 IPv6 链路把流量带偏了。多花几十秒钟做一个ping -4和ping -6的对照测试能节省大量无效时间。第二闭环的关键不在排查过程有多严谨而在修复之后的验证和复盘。我自己吃过亏修完路由配置后没有持续观察第二天故障复发只能重新排查最终发现是设备配置被覆盖导致回弹。现在我做任何修复动作都会至少连续观察一段时间、做多次验证并把操作记录和结果同步到故障单里形成完整的证据链才敢宣布闭环。第三双栈网络里最值得做的预防工作之一是维护一份终端协议栈特征表。记录不同终端类型、不同操作系统的双栈行为差异比如哪些系统默认 IPv6 优先、哪些系统回退时间较长、哪些网卡驱动对 IPv6 支持有问题。下一次再遇到时好时坏的访问故障直接对照特征表做初步判断能比从零开始快上不少。这些小文档不花什么时间但在关键时候能让整个团队的排障效率明显提升。双栈网络的故障排查本质上不是会不会用命令的问题而是有没有把两个协议栈当做一个整体来思考的问题。把这个视角建立起来绝大多数 IPv4 故障背后的真实根因都能在合理的时间内浮出水面。
阅读完成 · 觉得有帮助?