ip route get 命令触发内核fib实时查找,输出实际选路结果(含出接口、下一跳、源地址等),而非静态配置或历史日志;它不依赖缓存或策略路由快照,能准确反映特定目标ip在当前网络状态下的真实转发路径。

ip route get 能模拟内核选路过程
查“路由选择记录”不是查历史日志,而是看内核对某个目标 IP 实际会怎么走——ip route get 就是干这个的。它不读缓存,也不查策略,而是触发一次真实的 FIB(Forwarding Information Base)查找,输出结果包含出接口、下一跳、源地址、甚至是否绕过策略路由等细节。
常见错误现象:用 ip route show 看到多条匹配路由,但不确定实际走哪条;或修改了策略路由后没生效,却看不出问题在哪。
-
ip route get 8.8.8.8:最常用,确认公网 DNS 流量出口 -
ip route get 192.168.1.100 from 10.0.0.5:指定源地址,模拟特定绑定 socket 的行为 -
ip route get 172.16.0.1 oif eth1:强制限定出接口,验证该接口是否可达目标 - 若返回
RTNETLINK answers: No such process,说明目标不可达(无匹配路由),不是命令写错
route -n 和 netstat -rn 只显示静态配置,不反映实时决策
这两个命令输出的是当前加载进内核的路由表快照,属于“配置态”,而非“运行态”。它们不会告诉你一个包发给 10.0.0.5 时到底走 eth0 还是 wlan0,尤其在多路径、策略路由或源地址选择复杂时容易误判。
使用场景有限:适合快速扫一眼默认网关或直连子网,不适合调试转发异常。
-
route -n输出中UG标志 ≠ 实际生效,默认路由可能被更具体的策略覆盖 -
netstat -rn在较新内核(≥5.10)中已不维护,部分发行版默认不安装net-tools - 两者都不支持 IPv6 源地址策略(如
src字段),而ip route get支持-6和完整策略字段
别指望 /proc/net/route 或日志里有“路由选择记录”
Linux 内核不记录每次路由查找的历史,/proc/net/route 是原始十六进制 dump,只反映主路由表内容,且不含策略、源地址、tos 等运行时参数;系统日志(/var/log/syslog 或 journald)也不会默认记录单个数据包的选路过程。
真要追踪选路逻辑,只有两条路:一是用 ip route get 多次测试不同组合,二是用 tcpdump -i any 抓包反推(看哪个接口发出、目的 MAC 是否为网关)。
- 脚本解析
/proc/net/route需手动转十六进制,例如网关列0100007F→127.0.0.1,易出错且信息残缺 -
ip route show table local可看到本地交付规则(如广播、loopback),但它也不是“选择记录”,只是另一张表 - 所谓“路由缓存”(
route -C)在 2.6.39+ 内核已被彻底移除,现代系统查不到
多表路由下必须显式指定 table 才能查准
如果你用了 policy routing(比如按源 IP 分流),ip route show 默认只显示 table main,而真实流量可能走 table admin 或自定义表。不指定表名,就等于只看了半张地图。
容易踩的坑:明明加了 ip rule add from 192.168.2.0/24 table 200,但 ip route show 里找不到对应路由,其实是忘了 ip route show table 200。
- 先查表编号:
cat /etc/iproute2/rt_tables,确认自定义表名对应数字 - 查指定表:
ip route show table 200或ip route show table admin - 结合
get使用:ip route get 10.10.10.10 table 200,验证该表是否真能命中 - 注意:策略规则本身不存于路由表中,得用
ip rule show单独看
ip route get 不带 from 或 oif 参数时,内核按默认策略选源 IP,可能和你的应用绑定的地址不一致。这点不验证,所有结论都可能偏移。











