ip route get 是唯一能模拟内核选路过程的命令,它触发完整的路由查找逻辑(含策略路由、源地址选择、fib查询),输出真实转发路径,如“8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.100”,而 route -n 等仅显示静态路由表快照。

ip route get 是唯一能模拟内核选路过程的命令
想看“数据包实际会走哪条路”,不能只查静态路由表,得让内核现场算一遍。只有 ip route get 做得到——它触发内核完整的路由查找逻辑(包括策略路由、源地址选择、FIB 查询),输出结果就是真实转发路径。
- 直接执行
ip route get 8.8.8.8,输出形如8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.100 uid 1000,其中via是下一跳,dev是出接口,src是实际使用的源 IP - 加
-4或-6强制协议族:ip -4 route get 10.0.2.3,避免 IPv6 干扰判断 - 指定源地址测试:
ip route get 10.1.1.1 from 192.168.5.100,验证多 IP 主机下不同源地址是否走不同路由 - 注意:目标必须是可达的三层地址,不能是域名(会报
RTNETLINK answers: Network is unreachable)
为什么 route -n 和 netstat -rn 看不到真实选路结果
这两个命令只是 dump 当前路由表快照,不触发实际查找逻辑。它们显示的是“配置了什么”,而 ip route get 显示的是“实际怎么走”。在策略路由、多网卡、NetworkManager 动态管理等场景下,二者输出经常不一致。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 典型现象:
route -n显示0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 eth0(无 gateway),但ip route get 8.8.8.8明确返回via 192.168.1.1 - 原因:该路由由 NetworkManager 注入到策略表(非 main 表),
route默认只读 main 表,而ip route get会遍历所有策略规则 - 验证方法:运行
ip rule show查看规则链,再用ip route show table 100(假设 rule 指向 table 100)确认具体条目
查看路由缓存(FIB cache)能反映近期真实路径
内核会缓存最近的路由查找结果,ip route show cache 显示的就是这个缓存——它比静态表更接近真实流量路径,尤其适合排查“刚通又断”类问题。
- 执行
ip route show cache,输出每行对应一个已缓存的目标,含cache标志和最近命中时间 - 缓存会自动老化(默认 15 分钟),清空用
ip route flush cache(调试时可强制刷新) - 注意:某些内核版本(如 5.10+)默认禁用 FIB cache,此时命令无输出,不代表没走缓存,只是未显式维护
- 对比用:
ip route get 1.1.1.1 && ip route show cache | grep 1.1.1.1,能确认该路径是否被缓存
容易忽略的源地址影响
Linux 路由决策强依赖源 IP,同一目标地址,不同源地址可能走完全不同路径。不指定源时,内核按 local address selection 规则选,结果未必是你预期的。
- 常见坑:
ip route get 10.10.10.10返回走 eth0,但你绑定了两个 IP(192.168.1.100/24 和 172.16.0.100/24),实际业务用的是后者 —— 这时必须加from参数 - 查当前绑定的所有 IP:
ip addr show dev eth0 | grep inet,再逐个测试:ip route get 10.10.10.10 from 172.16.0.100 - 如果
from指定后报Invalid cross-device link,说明该 IP 不属于该接口,或子网掩码配置错误
ip route show 容易误判,ip route get 加 from 参数才是逼近真实流量的最小可靠操作。










