Linux ip route读取策略路由表的命中路径的实现方法
来源:17golang原创
时间:2026-09-19 23:52:11 451浏览 收藏
Linux 多网卡主机出现“同一个目的地址走了不同出口”时,直接执行 ip route show 往往不够。它默认展示 main 表,而策略路由还可能受 ip rule、源地址、入口接口和防火墙标记影响。更稳妥的排查顺序是:先读规则,再看规则引用的表,最后用 ip route get 带着真实查询条件复现一次路径。
ip rule list决定按什么优先级查表,数字越小越先检查。ip route show table N展开某张候选表,不能代替实际路径解析。ip route get ... fibmatch能看到匹配的 FIB 路由,但不是完整的规则执行日志。
步骤一:先读取规则优先级与策略表编号
策略路由的第一现场不是 main 表,而是规则链。先把优先级和条件抄下来,尤其注意 from、iif、fwmark 以及 lookup 后的表号。不要只记住表名,因为临时配置常直接使用数字。
# 先列出策略规则;数字越小,越早参与查找 ip rule list # 展开规则中可能出现的自定义表,100 只是示例编号 ip route show table 100 ip route show table main ip route show table default
常见的 local 表编号是 255,main 是 254,default 是 253。它们是约定俗成的内置表;自定义表仍应以本机规则和 /etc/iproute2/rt_tables 中的映射为准。若规则带有 lookup 100,就必须把 100 的内容展开后再判断。

步骤二:按表查看候选路由与终止类型
看到一条更具体的前缀并不等于它一定被采用。策略路由会先受规则条件约束,再在被选中的表里找路由。查看时把候选项按“目的前缀、类型、网关、设备、首选源地址”记录下来。
| 字段 | 排查意义 | 容易误判的地方 |
|---|---|---|
| table | 说明路由属于哪张表 | 只看 main 会漏掉自定义表 |
| via / dev | 说明下一跳与出口设备 | 直连路由可能没有 via |
| src | 提示优先使用的源地址 | 不等于所有应用最终绑定的源地址 |
| throw / unreachable | 控制继续查找或直接失败 | 不能当作普通可转发路径 |
throw 常用于策略路由表之间的继续查找;unreachable、blackhole 和 prohibit 则分别代表带错误反馈、静默丢弃或管理性禁止的终止结果。出现这些类型时,先确认它们来自哪张表,不要只修改默认网关。
步骤三:用 ip route get 复现一次实际查询
ip route get 的价值在于把查询条件交给内核解析。它不是简单地把现有表打印出来,而是返回内核针对这个目的地址解析出的结果,并且不实际发送数据包。排查多出口问题时,至少把目的地址和候选源地址写出来:
# 复现从指定源地址发往目标地址的出口选择 ip route get 203.0.113.10 from 192.0.2.20 # 模拟报文从 eth0 进入,再查看转发方向 ip route get 203.0.113.10 from 192.0.2.20 iif eth0 # 模拟带防火墙标记的流量;标记值必须与规则中的 fwmark 对应 ip route get 203.0.113.10 mark 0x20
结果里的 dev 是出口设备,via 是下一跳,src 是内核偏好的源地址。若不带 from,你复现的可能只是默认源地址场景;若规则依赖入口接口或 mark,却没有带上相应条件,结论也只覆盖了另一条路径。

步骤四:用 fibmatch 区分命中 FIB 与最终解析结果
普通查询更接近“最终要从哪里发出”;加入 fibmatch 后,可以要求返回完整的 FIB 查找命中路由。两者用途不同:前者适合确认应用流量会走哪个设备,后者适合判断到底是哪条前缀、哪种路由类型被匹配。
# 先看最终解析结果,记录 dev、via 和 src ip route get 203.0.113.10 from 192.0.2.20 # 再请求完整的 FIB 匹配路由,核对前缀和路由类型 ip route get fibmatch 203.0.113.10 from 192.0.2.20
这里要留一个边界:fibmatch 能帮助你确认匹配的 FIB 路由,但不会自动输出一份“每条 ip rule 都执行过”的审计日志。因此完整定位仍要把规则列表、各表内容和两次 get 的结果放在一起对比。
步骤五:按边界条件复查并形成排障清单
最后做一次小范围矩阵复查,避免把偶然的默认路由当成策略结果:
- 同一目的地址分别替换两个合法源地址,比较
dev、via、src。 - 对转发流量补上
iif,对防火墙分类流量补上mark。 - 分别用 IPv4 和
ip -6 route get查询,不把两套规则混为一谈。 - 若出现“无路由”,检查自定义表是否真的存在,以及
throw后是否还有可用规则。
只有当复现条件和线上流量一致时,命中的 dev 与 via 才能作为配置调整依据。修改策略前先保存 ip rule list 与相关表的文本结果,便于回滚和比较。
常见问题
为什么 ip route show 与 ip route get 的结果不一样?
show 展示已有路由条目,通常还要指定正确的表;get 则根据查询条件解析一次路径,源地址、入口接口和 mark 不同,结果自然可能不同。
ip route get 能直接告诉我命中了哪一条 ip rule 吗?
它主要返回解析后的路径;结合 fibmatch 可确认匹配的 FIB 路由,但不能替代规则链审计,所以仍要对照 ip rule list 和被引用的表。
看到 default 路由后就能判断出口吗?
不能。default 只是某张表中的兜底前缀,策略规则可能先让流量进入另一张表,或者由 throw、unreachable 等类型改变结果。
-
426 收藏
-
387 收藏
-
242 收藏
-
238 收藏
-
402 收藏
-
315 收藏
-
223 收藏
-
281 收藏
-
114 收藏
-
文章 · linux | 4天前 | Linux · 日志排查 · Linux journalctl journalctl按unit筛选日志 journalctl时间范围 systemd服务日志排查 journalctl日志为空372 收藏
-
153 收藏
-
211 收藏
-
209 收藏
-
206 收藏
-
381 收藏
-
文章 · linux | 4天前 | cron · 定时任务 · Linux · shell · crontab · Linux cron相对路径失败 cron找不到文件 crontab工作目录 cron环境变量 Linux定时任务排查360 收藏
-
216 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习