ip route get 怎样带 mark 模拟策略路由选择
来源:17golang原创
时间:2026-10-15 05:49:28 320浏览 收藏
使用 ip route get 目标地址 mark 标记值,即可把指定 fwmark 作为一次路由查询的条件。例如 mark 0x20 表示让内核按这个标记值查找路线,不是给实际应用的数据包设置标记。查询本身不发送数据包,也不添加策略规则。
官方地址:https://github.com/iproute2/iproute2
如果我要排查“同一个目标为什么被分到不同出口”,我会先固定目标地址,只改变 mark,观察选路差异。这适合拆开条件做比较;它不适合独自证明整个业务请求能成功。下面都是未执行的原创示例,不是某次线上故障的复盘。
mark 是查询条件,不是发包操作
ip route show 用于查看路由条目,而 ip route get 根据给定条件请求一次选路结果。因此,光看主路由表有默认路由,并不能回答带特定标记的查询会选哪条路线。
我会把这个工具看作“假设条件下的选路观察”。它没有重放真实应用的整个请求,也不会替应用、套接字或其他网络组件产生真实标记。这里是 Linux iproute2 的能力,不是浏览器 API;使用前要确认本机 ip 命令支持 mark 参数。
先确认现有规则能匹配这个值
读取 ip -4 rule show,关注已有的 fwmark 条件、可选 掩码、规则优先级 和 lookup 路由表。这些对象共同解释为何某个查询 mark 会关联到一张表;mark 数值不是路由表编号。
规则编号越小,优先级越高。带标记规则不保证必然成为最终决定因素:其他选择条件、优先级和规则动作同样有关。对我来说,先读现有配置比看到出口不符就补一条新规则更适合这一轮只读排查。
例如环境中若有匹配 0x20 且掩码为 0xff 的条件,可以用 0x20 作为查询输入。这个值只是文章假设,不表示你的机器已经配置了该规则。不要把规则里的值/掩码整体当作 get 的 mark 参数;get 输入标记值,掩码属于已有规则的匹配条件。

用同一目标对照两个 mark
# 先查看现有IPv4策略规则,不添加或删除规则。 ip -4 rule show # 查看本机命令支持范围。 ip -4 route help # 文档示例地址不代表本机有可达目标;请替换为待查地址。 route_test_dst='198.51.100.27' # 两次只改变mark,零值不是忽略策略规则。 ip -4 route get "$route_test_dst" mark 0 ip -4 route get "$route_test_dst" mark 0x20
198.51.100.27 是示例地址,0x20 是示例标记。替换目标并按已有规则选择标记后,再读实际输出;没有预设的 eth0、网关或路由表结果。两次查询要保持网络命名空间、地址族、执行身份及其他输入一致,避免把上下文变化误当成 mark 的作用。
mark 0 依然是一个数值查询条件,不是绕过策略。若规则还限定源地址或入口接口,本例没有自动补全这些条件。需要接近真实流量时,应在有依据的情况下明确它们,而不是随意添加字段。
输出能回答选路,但不能回答连通性
可以把响应中的 选路结果 理解为若干字段的组合:dev 出口设备、via 下一跳、src 源地址 与可能出现的 table 路由表。字段是否展示取决于结果类型和输出形式,不要求每行都出现全部字段。
| 字段 | 阅读用途 | 不能推出什么 |
|---|---|---|
| dev | 识别所选设备 | 不能证明链路或远端服务正常 |
| via | 识别返回的下一跳 | 缺少 via 不等于一定报错,可能是直连路线 |
| src | 理解查询返回的源地址 | 不能证明应用最终使用相同源地址 |
| table | 辅助识别所关联的表 | mark 与表不是同一个编号空间 |
如果我要记录结果,会同时记录完整查询条件与原始响应,而不是只抄一个设备名。选路成功仍不代表真实请求已打标、回程正确或网络端到端可用。本文没有探测远端,也没有提供连通性结论。

结果相同或报错时如何判断
两个 mark 返回相同出口时,我会先看规则是否有对应匹配、其他条件是否满足,以及关联表是否本就指向相同出口。结果相同不能单独证明 mark 被忽略,也不能单独证明规则配置正确。
语法错误时,回到本机 help 与随包手册确认参数支持。没有路线或查询被拒绝时,保留真实错误文本,再结合当前命名空间和策略解释;不要把任何报错都归为网络断开。本文不添加、删除或刷新路由,也不配置防火墙标记。
mark 0x20 会把以后所有请求打上标记吗?
不会。它是这一次查询的输入,不是全局配置,也不是应用流量的打标证据。
有同名路由表,为什么标记查询仍走别处?
存在路由表不等于查询会选它。需要已有策略把相应条件关联到该表,并考虑优先级与其他选择条件。
适合直接放进健康检查吗?
可作为选路条件的一项检查,但我不会把它作为业务可用性的唯一信号。它更适合管理员在获授权的环境中解释既有策略,而不是替代真实业务观测。
参数与选路语义参考:https://github.com/iproute2/iproute2/blob/main/man/man8/ip-route.8.in;规则选择参考:https://github.com/iproute2/iproute2/blob/main/man/man8/ip-rule.8.in。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
214 收藏
-
207 收藏
-
356 收藏
-
327 收藏
-
380 收藏
-
449 收藏
-
360 收藏
-
415 收藏
-
199 收藏
-
367 收藏
-
399 收藏
-
290 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习