ip route 怎样判断策略路由命中了哪个表
来源:17golang原创
时间:2026-10-24 22:43:59 175浏览 收藏
排查策略路由时,单看 ip route show 往往只能看到某一张表,不能回答“这次查询到底走了哪张表”。更稳妥的办法是先读 ip rule 的优先级,再用与流量一致的条件执行 ip route get fibmatch,最后把结果中的表号与 ip route show table 对照。这样判断的是内核实际的 FIB 查找,不是凭默认路由猜测。
- RPDB 规则按 priority 从小到大检查,规则命中且表内返回结果后,后续规则不会接管。
route get要带上真实的from、iif或mark,否则测试条件可能与业务流量不同。fibmatch用来查看完整的 FIB 匹配路由;再用ip route show table 表号做最终对照。
先看 RPDB:优先级决定先查哪张表
策略路由不是把所有路由简单合并后再按最长前缀选择。内核先扫描路由策略数据库(RPDB),规则的选择条件可以包含源地址、目的地址、入接口、TOS、mark 等;每条规则又指向一张路由表。数字越小,优先级越高。
# 先分别查看 IPv4 和 IPv6 的规则,避免把两个地址族混在一起
ip -4 rule show
ip -6 rule show
示例输出可以是:
100: from 10.10.0.0/16 lookup 100
32766: from all lookup main
32767: from all lookup default
这里的 100 是规则优先级,lookup 100 是目标表号,不是“第 100 条路由”。如果第一条规则匹配源地址,但 table 100 没有可用结果,查找才可能继续走 main;如果它返回了单播、黑洞或不可达等终结结果,就不能再把 main 的内容当成实际命中。

用真实查询条件复现一次路由选择
ip route get 查询的是内核针对一个目的地址解析出的单条路径,不会真的发送数据包。若业务连接有固定源地址、入接口或 mark,就应把这些条件写进命令,否则得到的可能只是本机默认出口。
# 用业务报文的源地址和目的地址查询 IPv4 路径
ip -4 route get 203.0.113.20 from 10.10.1.8
# 转发流量还要模拟入接口;带 mark 的流量要保留十六进制值
ip -4 route get 203.0.113.20 from 10.10.1.8 iif eth0 mark 0x2
若排查的是本机发出的连接,通常不使用 iif;若排查转发报文,加入 iif 能让查询更接近真实路径。端口、协议、TOS 等也可能是规则条件,必要时补充 ipproto、sport、dport 或 tos。
用 fibmatch 把命中表和路由条目对上
仅看普通的 route get 输出,常能确认下一跳和设备,但排查“究竟来自哪张表”时还要请求完整 FIB 匹配结果:
# fibmatch 返回匹配到的 FIB 路由;输出中的 table 用于定位表
ip -4 route get fibmatch 203.0.113.20 from 10.10.1.8 mark 0x2
得到表号后,立即把该表单独列出来:
# 把 TABLE_ID 替换为 fibmatch 输出中的表号
ip -4 route show table 100
# 对比具体前缀、设备、下一跳、协议和 metric
ip -4 route show table 100 match 203.0.113.20
如果环境使用 VRF,也可以直接用 ip route get vrf NAME ADDRESS,或用 ip route show vrf NAME 查看其关联 FIB。VRF 的设备会关联一个表,内核通过 l3mdev 规则把查找导向该表;不要把 VRF 场景下的 table red 误读成普通主表别名。

查不到预期表时的排查顺序
- 先核对地址族。 IPv4 用
ip -4,IPv6 用ip -6;两者的规则和表并不共用一套匹配结果。 - 再核对条件。 源地址、入接口、mark、协议和端口少一个,都可能让规则不匹配。特别是 mark 的掩码要与规则一致。
- 检查表内结果类型。
throw表示继续尝试后续规则;blackhole、unreachable和prohibit是明确的策略结果,不等同于“没找到”。 - 最后看 priority。 同时满足条件时,低数字优先。确认规则顺序后,再对照 table 100、main 254 和 default 253 的实际条目。
常见问题
为什么 ip route show 看不到策略路由命中过程?
它默认展示一张路由表里的条目,不负责替你模拟完整 RPDB 查询。用 ip rule show 看规则,用带实际条件的 ip route get fibmatch 看一次查找结果。
为什么不加 from 也能得到结果?
内核可以先按目的地址解析并选择首选源地址,但这不代表它与业务 socket 的源地址、mark 或入接口相同。策略路由排障应尽量复现真实报文条件。
把“规则命中”和“表内路由命中”分开记录,通常就能快速定位问题是在 RPDB 条件、优先级,还是具体 FIB 条目。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
162 收藏
-
128 收藏
-
273 收藏
-
372 收藏
-
418 收藏
-
486 收藏
-
167 收藏
-
448 收藏
-
128 收藏
-
333 收藏
-
117 收藏
-
125 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习