Linux ip route读取策略路由表的命中路径的实现方法
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 等类型改变结果。
Go os/signal设置信号通道缓冲容量的参数边界
- 上一篇
- Go os/signal设置信号通道缓冲容量的参数边界
- 下一篇
- Go encoding/base64用 NewEncoder 关闭时补齐尾部数据的实现方案
-
- 文章 · linux | 1小时前 |
- Linux mount namespace选择 shared、private 与 slave 传播属性的实现方法
- 204浏览 收藏
-
- 文章 · linux | 4天前 | Linux · IN_Q_OVERFLOW Linux inotify inotify事件丢失 Linux目录监控 inotify重扫
- Linux inotify处理目录监控事件丢失风险的实现方法
- 223浏览 收藏
-
- 文章 · linux | 4天前 | Linux · Linux OOM cgroup v2 memory.events oom_kill
- Linux cgroup v2用 memory.events 区分 oom 与 oom_kill的实现方法
- 281浏览 收藏
-
- 文章 · linux | 4天前 | Linux · 故障排查 · Linux systemd systemctl journalctl ExecStartPre
- Linux systemd识别 ExecStartPre 失败导致的未启动状态的实现方法
- 114浏览 收藏
-
- 文章 · linux | 4天前 | linux运维 · Linux systemd StartLimitBurst StartLimitIntervalSec Restart
- Linux systemd StartLimitBurst 如何限制失败重启频率
- 211浏览 收藏
-
- 文章 · linux | 4天前 |
- Linux procfs fd 链接如何确认文件仍被进程持有
- 206浏览 收藏
-
- 文章 · linux | 4天前 | Linux Rsync --checksum
- Linux rsync --checksum 何时值得付出额外扫描成本
- 381浏览 收藏
-
- 文章 · linux | 4天前 | cron · 定时任务 · Linux · shell · crontab · Linux cron相对路径失败 cron找不到文件 crontab工作目录 cron环境变量 Linux定时任务排查
- Linux cron 使用相对路径失败时环境差异在哪里
- 360浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 121次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 196次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 139次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 114次使用
-
- CMMLU
- 深入了解CMMLU中文评估基准,涵盖67个学科主题,提供数据集下载、Zero-shot/Five-shot评估方法及排行榜,助力优化中文语言模型性能。
- 96次使用
-
- 详解golang执行Linuxshell命令完整场景下的使用方法
- 2023-01-07 426浏览
-
- go程序部署到linux上运行的实现方法
- 2023-01-02 387浏览
-
- Linux系统下Go语言开发环境搭建
- 2023-01-07 242浏览
-
- 使用golang获取linux上文件的访问/创建/修改时间
- 2022-12-31 238浏览
-
- 在Linux系统中安装Go语言的详细教程
- 2022-12-29 402浏览
