当前位置:首页 > 文章列表 > 文章 > linux > Linux ip 命令查看策略路由命中顺序

Linux ip 命令查看策略路由命中顺序

来源:17golang原创 2026-10-28 13:21:17 0浏览 收藏

排查 Linux 策略路由时,先看 ip rule show 得到 RPDB 的检查顺序,再用与目标流量相同的目的地址、源地址、入口接口和 fwmark 调用 ip route get。规则的 priority 数字越小越先检查;某条规则匹配后,如果关联路由表没有给出可用结果,内核才会继续看后面的规则。

想知道“哪条规则先被检查”,看 ip rule 的 priority;想知道“这组条件最后选到哪条路由”,看 ip route get。两者是规则顺序和路由解析的两份互补信息,不要把 ip route get 当成逐条规则命中日志。

Linux 内核网络文档地址:https://www.kernel.org/doc/html/latest/networking/

下面把问题收敛成一个只读的小项目:给定一个目的地址,分别模拟普通本机流量、指定源地址的流量和带 mark 的流量,整理出“规则条件—路由表—最终结果”的判断链。示例使用文档保留地址,不代表当前机器的真实配置。

项目目标:做一张策略路由命中诊断卡

假设待排查的目的地址是 203.0.113.8,可能的源地址是 192.0.2.10,入口接口是 eth1,防火墙标记是 0x2。这四个条件并不是每次都必须填写,但它们决定了规则选择器是否相同。

信息对应排查问题常用 ip 参数
目的地址最终要去哪里route get 的位置参数
源地址源地址策略是否改变路由表from
入口接口转发流量是否命中 iif 规则iif
fwmark打标流量是否命中 mark 规则mark

先把这些值写进诊断记录,再开始看规则。这样可以避免第一次查询带了源地址,第二次查询却只给目的地址,最后把两个不同的决策结果误认为“规则顺序不稳定”。

准备环境:只读查看当前 RPDB

ip rule 操作的是路由策略数据库(RPDB),而 ip route 操作的是具体路由表。第一轮只读取版本和规则,不需要为了查看顺序修改任何配置。

# 查看 iproute2 是否可用;这里只读取版本信息。
ip -V

# 按 priority 列出策略规则,先看规则顺序和 lookup 目标。
ip rule show

# 显示更完整的规则属性,便于发现 fwmark、iif、suppress 等条件。
ip -details rule show

常见的默认 RPDB 包含三条规则:priority 为 0 的 local 表、priority 为 32766 的 main 表,以及 priority 为 32767 的 default 表。实际主机可能由 NetworkManager、容器运行时、VRF 或其他网络管理组件添加额外规则,所以以当前命令输出为准。

按 priority 读取 RPDB 的检查顺序

策略规则按 priority 数字递增检查。数字越小,越早进入选择器判断;它和路由表内部的最长前缀、metric 或 preference 不是同一个排序维度。

RPDB 规则、priority、匹配条件与 local main default 路由表之间的静态关系
图1:策略路由规则结构说明图,展示 priority、匹配条件与路由表之间的静态关系,不是命令截图。

下面是格式化后的示例输出,仅用于说明如何阅读字段:

0:      from all lookup local
100:    from 192.0.2.0/24 lookup 100
110:    fwmark 0x2/0xff lookup 200
32766:  from all lookup main
32767:  from all lookup default

阅读这份列表时可以按三列拆开:

  • priority:决定这条规则在 RPDB 中的检查位置,100 先于 110,两者都先于 32766。
  • selector:例如 from、fwmark、iif,决定当前流量是否符合规则。
  • action:例如 lookup 100,表示匹配后尝试查询编号为 100 的路由表。

“命中”不能只理解为选择器匹配。规则匹配后,查表动作还可能没有找到可用路由,或者被 suppress_prefixlength 之类的抑制条件排除;这时 RPDB 才会继续处理后面的规则。最终判断要把规则输出和一次实际查询放在一起看。

用 ip route get 复现一次路由查询

ip route get 不是把路由表静态打印出来,而是请求内核解析一条到目标地址的路由。它可以带上 from、iif、mark 等条件;fibmatch 用于查看完整的 FIB 匹配路由。查询不会真的发送数据包。

ip route get 的目的地址、源地址、入口接口、fwmark、fibmatch 与 FIB 解析结果之间的静态关系
图2:路由查询输入与结果结构图,展示 from、iif、mark 和 fibmatch 如何组成一次静态查询说明。
# 先只按目的地址查询,作为没有额外选择器的基线。
ip route get 203.0.113.8

# 加入源地址,模拟源地址策略可能影响的本机流量。
ip route get 203.0.113.8 from 192.0.2.10

# 加入入口接口,模拟从 eth1 进入后需要转发的流量。
ip route get 203.0.113.8 from 192.0.2.10 iif eth1

# 加入 mark,并请求完整的 FIB 匹配信息;0x2 只是本例的示意标记。
ip route get fibmatch 203.0.113.8 from 192.0.2.10 mark 0x2

这几条命令的关键不是记住某一行示例输出,而是每次只改变一个决策输入:如果加上 from 后出口改变,优先回到含 from 的规则;如果加上 mark 后出口改变,优先回到含 fwmark 的规则。ip route get 给出的是解析结果,规则优先级仍要从 ip rule show 中读取。

把规则条件与查询结果逐项对照

为了把这个小项目做成可复用的诊断卡,可以固定四组查询。它们不写入配置,只收集同一目的地址在不同选择器下的结果。

# 用统一变量避免四组查询使用不同的目标地址。
DST="203.0.113.8"
SRC="192.0.2.10"
IIF="eth1"
MARK="0x2"

# 基线:只提供目的地址,观察普通输出路径。
ip route get "$DST"

# 源地址维度:对应 ip rule 中的 from 选择器。
ip route get "$DST" from "$SRC"

# 入口接口维度:对应转发规则中的 iif 选择器。
ip route get "$DST" from "$SRC" iif "$IIF"

# 标记维度:对应 fwmark 选择器;fibmatch 用于展开 FIB 匹配路由。
ip route get fibmatch "$DST" from "$SRC" mark "$MARK"

对照时可使用下面的判断表:

现象优先检查不要直接下的结论
只加源地址就换出口含 from 的规则及其 lookup 表不能说 priority 最大的规则生效
只加 mark 就换出口mark 值、掩码和 fwmark 规则不能把 mark 当成路由表编号
规则匹配但没有可用路由对应表的前缀、类型和 suppress 条件不能说 RPDB 在此处永久停止
查询结果与预期不同查询是否缺少 from、iif 或 mark不能先假设内核忽略了 priority

特别要注意 ip route get 与 ip route show 的差别:后者是在列出现有条目,前者是在给定查询键下请求解析结果。排障时只看某张表的静态条目,无法替代带完整条件的 route get。

验收:怎样确认自己真的看懂了命中顺序

一张合格的诊断卡至少应当能回答五个问题:

  1. 当前规则按什么 priority 顺序排列,是否存在数字更小的自定义规则?
  2. 目标流量的源地址、入口接口和 mark 是否与查询命令一致?
  3. 匹配到的规则指向哪一张路由表,表内是否存在能返回结果的条目?
  4. 是否存在 suppress_prefixlength、黑洞、不可达或禁止类型等会改变结果的动作?
  5. 最后的 ip route get 输出是否与规则和路由表的解释一致?

如果这五项都能从命令输出中指出对应字段,基本就能解释“为什么这条规则先检查、为什么没有停在那里、最后为什么落到 main 或其他表”。如果只能看到一个出口接口,却说不出使用了哪些查询条件,说明诊断输入还不完整。

ip rule 的数字越大是不是越先命中?

不是。RPDB 按 priority 数字递增检查,数字越小越先。32766 的 main 规则通常会晚于 priority 为 100 的自定义规则。

ip route get 能直接显示第几条 ip rule 命中吗?

它主要返回一次路由解析结果,不能简单当成逐条 RPDB 规则的命中日志。要判断顺序,需要把同一查询条件与 ip rule show 的 priority、selector 和 lookup 目标对照。

为什么只执行 ip route show 看不出策略路由结果?

ip route show 展示的是路由表条目,未必带上源地址、入口接口和 mark 这些策略键。需要使用带完整条件的 ip route get 复现一次查询。

fibmatch 和普通 ip route get 有什么区别?

普通查询返回解析后的路由结果,fibmatch 更偏向展示完整的 FIB 匹配路由。它仍然不是一份逐条策略规则执行日志,规则顺序仍需从 RPDB 输出中确认。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Linux systemd RestrictAddressFamilies 怎样限制服务使用的网络协议族Linux systemd RestrictAddressFamilies 怎样限制服务使用的网络协议族
上一篇
Linux systemd RestrictAddressFamilies 怎样限制服务使用的网络协议族
Linux find 按时间与大小组合筛选文件
下一篇
Linux find 按时间与大小组合筛选文件
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    755次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    753次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    834次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    800次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    634次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码