系统学习 故障排查学习路径:从方法论到系统、网络、数据库与 K8s

network-unreachable

本地路由表找不到目标网段,连接直接返回 network is unreachable 的定位与修复

现象

客户端报 connect: network is unreachable、Network is unreachable 或 ENETUNREACH,curl 显示 Failed to connect ... Network is unreachable,Go 程序可能看到 dial tcp [<ipv6>]:443: connect: network is unreachable。这表示本地内核在选路阶段就没有找到可用的路由,数据包通常根本没有发出。

它与 no route to host 不同:后者是已经选好出口,但无法把包交付到具体主机;network is unreachable 更接近“本机不知道去这个网段该走哪”。最常见的两种场景是默认路由缺失,以及应用尝试走 IPv6 但主机或容器没有 IPv6 默认路由。排查顺序应始终从本机地址和路由表开始,而不是先怀疑远端服务。

快速定位

先确认地址、默认路由和实际选路结果:

ip -br addr
ip route show default
ip -6 route show default
ip route get <ipv4>
ip route get <ipv6>
ip rule show
ip route show table all | head -60
ping -c 3 <ipv4>
ping -6 -c 3 <ipv6>
curl -4 -v --max-time 5 https://<host>/
curl -6 -v --max-time 5 https://<host>/
traceroute -n <ipv4>
resolvectl status
nmcli connection show --active
networkctl status

容器或 Kubernetes 场景进入同一网络命名空间对比:

kubectl exec <pod> -n <ns> -- ip route
kubectl exec <pod> -n <ns> -- ip -6 route
kubectl exec <pod> -n <ns> -- ip -br addr
kubectl exec <pod> -n <ns> -- cat /etc/resolv.conf

ip route get 直接报 Network is unreachable,说明主路由表没有匹配项;如果命令有结果但应用仍失败,检查策略路由 ip rule 是否把流量导向了空表,以及应用是否绑定了错误的源地址或地址族。IPv4 正常、IPv6 失败时,用 curl -4 和 curl -6 分别验证,确认是协议族问题还是目标地址问题。

检查转发和 NAT:

sysctl net.ipv4.ip_forward
sudo iptables -t nat -S | grep -E 'MASQUERADE|SNAT'
sudo nft list ruleset | grep -E 'masquerade|snat'

常见根因

  1. 默认路由缺失:DHCP 未下发网关、网络重启后路由被删或手工配置漏写 default via。
  2. 接口没有地址、接口 down 或地址配置在错误的网卡上,内核无法选出源地址。
  3. 应用或客户端优先使用 IPv6,但主机没有全局 IPv6 地址、RA 未提供默认路由或 IPv6 被部分禁用。
  4. DNS 返回了 AAAA 记录,但当前网络没有 IPv6 出口,连接在选路阶段失败。
  5. 容器网络命名空间缺少默认路由,网桥、veth 或 CNI 插件配置异常。
  6. Pod 所在节点没有开启 IP 转发,或缺少到外网的 NAT 规则。
  7. 策略路由把流量送到没有默认路由的路由表,常见于 VPN、kill switch 或多网卡环境。
  8. VPN 断线后路由被清理,或 split tunnel 的 AllowedIPs 没有包含目标网段。
  9. 云主机位于私有子网,路由表没有指向 NAT 网关或目标网段的路由。
  10. 子网掩码配置错误,目标被判断为不同网段,但又没有默认网关。
  11. NetworkManager、systemd-networkd 或 netplan 应用了错误配置,重启后覆盖临时路由。
  12. 目标地址是保留地址、链路本地地址或不属于当前网络的地址,内核拒绝选路。

修复

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. network is unreachable 说明数据包已经到达远端了吗?
  2. IPv4 访问正常、IPv6 地址却报 network is unreachable,应检查什么?
  3. Pod 内访问外网报 network is unreachable,而宿主机正常,排查重点是什么?
答案
  1. 没有。错误由本地内核在选路阶段产生,表示找不到到目标网段的路由,数据包通常还没有发出。
  2. 检查主机是否有全局 IPv6 地址、ip -6 route 是否有默认路由、RA 是否生效、DNS 是否返回了 AAAA,以及网络或云子网是否提供 IPv6 出口;用 curl -6 复现。
  3. 进入 Pod 网络命名空间看地址和默认路由,对比宿主机路由,检查 CNI、网桥、veth、节点 ip_forward、NAT 规则和策略路由是否把流量导向空表。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令