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

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与策略规则、优先级和路由表的静态关系
图1:标记匹配结构图。查询输入分组包含 mark,已有规则分组说明匹配条件,路由资源分组说明 lookup 的表;不是操作流程或真实配置截图。

用同一目标对照两个 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 与表不是同一个编号空间

如果我要记录结果,会同时记录完整查询条件与原始响应,而不是只抄一个设备名。选路成功仍不代表真实请求已打标、回程正确或网络端到端可用。本文没有探测远端,也没有提供连通性结论。

路由查询结果字段与连通性边界的静态关系
图2:结果字段结构图。响应字段分组拆解 dev、via、src 与 table,解释边界分组独立标明“非连通性证明”;不是伪造的终端输出。

结果相同或报错时如何判断

两个 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。

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