登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

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 的内容当成实际命中。

RPDB 优先级与 table 100、main 254 关系的静态说明图
图1:RPDB 到路由表的静态结构说明图,不是终端截图或运行证据。

用真实查询条件复现一次路由选择

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 误读成普通主表别名。

route get fibmatch 查询条件与 table 100 路由条目关系的静态说明图
图2:fibmatch 查询条件与 FIB 路由条目的关系说明图,不是实际命令输出截图。

查不到预期表时的排查顺序

  1. 先核对地址族。 IPv4 用 ip -4,IPv6 用 ip -6;两者的规则和表并不共用一套匹配结果。
  2. 再核对条件。 源地址、入接口、mark、协议和端口少一个,都可能让规则不匹配。特别是 mark 的掩码要与规则一致。
  3. 检查表内结果类型。 throw 表示继续尝试后续规则;blackhole、unreachable 和 prohibit 是明确的策略结果,不等同于“没找到”。
  4. 最后看 priority。 同时满足条件时,低数字优先。确认规则顺序后,再对照 table 100、main 254 和 default 253 的实际条目。

常见问题

为什么 ip route show 看不到策略路由命中过程?

它默认展示一张路由表里的条目,不负责替你模拟完整 RPDB 查询。用 ip rule show 看规则,用带实际条件的 ip route get fibmatch 看一次查找结果。

为什么不加 from 也能得到结果?

内核可以先按目的地址解析并选择首选源地址,但这不代表它与业务 socket 的源地址、mark 或入接口相同。策略路由排障应尽量复现真实报文条件。

把“规则命中”和“表内路由命中”分开记录,通常就能快速定位问题是在 RPDB 条件、优先级,还是具体 FIB 条目。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>