路由下一跳不可达是linux网络不通的典型原因,需联动验证网关是否真能触达:先确认其是否在直连网段内,再检查arp缓存状态,接着测试网关可达性与转发能力,最后排查内核对下一跳合法性的硬性校验。

路由下一跳不可达,是Linux网络不通的典型原因——路由表里明明有路径,但发不出去包。核心问题在于:内核查到路由后,发现下一跳网关本身无法通信,于是直接丢包。排查关键不是只看ip route,而是要联动验证“网关是否真能触达”。
先确认下一跳是否在直连网段内
执行ip route get (例如ip route get 8.8.8.8),看输出中via后的IP和dev网卡。然后检查该网关IP是否属于本机任一网卡的直连子网:
- 运行
ip -br addr show,列出所有接口IP及掩码 - 用
ipcalc或手动计算:若网关192.168.5.1不在ens3: 192.168.10.2/24范围内,就不是直连——此时必须确保有通往该网关的直连路由(如ip route add 192.168.5.0/24 dev ens3)或它本身是本机地址 - 特别注意
/32地址(如192.168.10.2/32):它不构成网段,需配合onlink或显式直连路由才能作为合法下一跳
检查ARP缓存是否缺失或失效
下一跳IP有了,但没对应MAC地址,数据包就发不出去。用ip neigh show查状态:
- 如果输出中该网关条目为
FAILED或完全缺失,说明ARP请求未得到响应 - 尝试手动触发:执行
arping -I ens3 192.168.1.1(替换为实际网卡和网关),观察是否收到reply - 若
arping无响应,可能是网关宕机、物理链路断开、交换机ACL拦截ARP、或网关自身禁用了ICMP/ARP响应
验证网关本身是否可达且允许转发
即使ARP通了,网关也可能不转发流量。分两步验证:
- 用
ping -c3 192.168.1.1测试基础连通性;超时≠网关宕机,可能只是禁ping,但需继续验证 - 用
tcping 192.168.1.1 80(或nc -zv 192.168.1.1 22)测试具体端口,绕过ICMP限制 - 若端口也不通,检查网关设备是否开机、物理连接(网线/光模块)、交换机端口状态(
link UP)、以及网关自身是否启用了IP转发(sysctl net.ipv4.ip_forward应为1)
留意内核对下一跳合法性的硬性检查
Linux内核函数fib_check_nh会在添加/使用路由时校验下一跳。常见被拒情况包括:
- 指定了
via但没指定dev,且内核无法自动推导出出口网卡 - 网关IP被判定为
hostscope(如加了scope host),而路由又带via——这直接冲突,会报错 - 使用非直连网关却没加
onlink标记(例如ip route add 10.0.0.0/24 via 192.168.10.1 dev ens3 onlink),否则内核默认要求网关必须在直连子网内











