本地路由表找不到目标网段,连接直接返回 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'
default via。AllowedIPs 没有包含目标网段。ip route get 确认内核是否选路成功,以及选中的接口、源地址和网关是否符合预期。nmcli、netplan 或 systemd-networkd 持久化配置,而不是只执行临时 ip route add。ip_forward 与 NAT 规则。ip rule 和所有路由表逐条核对,修正 VPN kill switch、多网卡和源地址选择规则。ENETUNREACH 错误率,按主机和地址族告警。合上页面,先回答,再展开对照。
network is unreachable 说明数据包已经到达远端了吗?network is unreachable,应检查什么?network is unreachable,而宿主机正常,排查重点是什么?ip -6 route 是否有默认路由、RA 是否生效、DNS 是否返回了 AAAA,以及网络或云子网是否提供 IPv6 出口;用 curl -6 复现。ip_forward、NAT 规则和策略路由是否把流量导向空表。
小程序版
微信扫码,随时查命令