直接读取/proc/net/route可获取默认路由网关,需将十六进制网关字段按小端序转为点分十进制,并结合ping或ip route get验证其存活与实际转发角色,二者任一失败即判定逻辑不可达。

直接读取 /proc/net/route 可以获取内核当前生效的默认路由(即核心网关)及其下一跳地址,但需注意它只反映静态路由快照,不包含连通性状态。要实现“存活监控”,必须将路由存在性检查与可达性验证结合,形成闭环判断。
解析 /proc/net/route 提取默认网关
该文件是十六进制格式,需转换目标网络和网关字段:
- 每行对应一条路由,字段按空格分隔
- 第 2 列(
Destination)为网络目标,00000000表示0.0.0.0/0(即 default) - 第 3 列(
Gateway)是网关 IP 的小端十六进制,例如0100000A→10.0.0.1(字节倒序:01 00 00 0A→0A 00 00 01→10.0.0.1)
可用一行 shell 提取并转为点分十进制:
GW_HEX=$(awk '$2 == "00000000" {print $3; exit}' /proc/net/route 2>/dev/null)
[ -n "$GW_HEX" ] && printf "%d.%d.%d.%d" 0x${GW_HEX:6:2} 0x${GW_HEX:4:2} 0x${GW_HEX:2:2} 0x${GW_HEX:0:2} 2>/dev/null结合 ping 或 ip route get 验证网关活跃性
仅存在路由不等于网关可达。推荐两种轻量验证方式:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
-
单次 ping 检测:
ping -c1 -W1 "$GW" &>/dev/null,超时 1 秒,避免阻塞 -
路由可达性验证(更可靠):
ip route get 8.8.8.8 | awk '{print $7}' | grep -q "^$GW$",确认网关确实是实际转发下一跳
二者任一失败,即判定网关“逻辑不可达”。
在巡检脚本中结构化集成
建议封装为函数,输出明确状态码供后续动作调用:
- exit 0:网关存在且可达
- exit 1:网关缺失、解析失败或 ping 不通
- exit 2:网关存在但非实际下一跳(如被策略路由绕过)
示例片段:
check_default_gateway() {
local gw_hex=$(awk '$2 == "00000000" {print $3; exit}' /proc/net/route 2>/dev/null)
[ -z "$gw_hex" ] && return 1
local gw=$(printf "%d.%d.%d.%d" 0x${gw_hex:6:2} 0x${gw_hex:4:2} 0x${gw_hex:2:2} 0x${gw_hex:0:2} 2>/dev/null)
[ -z "$gw" ] && return 1
ping -c1 -W1 "$gw" &>/dev/null || return 1
ip route get 8.8.8.8 2>/dev/null | awk -v expected="$gw" '$7 == expected {exit 0} END{exit 1}' || return 2
}注意事项与避坑点
-
/proc/net/route不含 IPv6 路由,IPv6 网关需查/proc/net/ipv6_route,逻辑不同 - 多网卡或多默认路由场景下,
00000000可能出现多行,应取metric最小者(需额外解析第 8 列) - 容器或 network namespace 中运行时,需确保在 host netns 下读取,否则看到的是隔离视图
- 不建议轮询频率高于每 5 秒,避免对内核 proc 接口造成压力
不复杂但容易忽略


















