Linux ip route 处理多出口策略路由
来源:17golang原创
时间:2026-10-17 08:29:21 204浏览 收藏
Linux 多出口如果只是共用一个优先出口,可以在主路由表中管理默认路由;如果要求不同源地址使用不同出口,就需要 ip rule 选择路由表,再由 ip route 提供该表中的具体路由。规则的 priority 与路由的 metric 不是同一个排序空间:前者决定先考虑哪条规则,后者参与同一张表内的路由选择。
iproute2 官方源码镜像地址:https://github.com/iproute2/iproute2。本文比较主表与源地址策略表两种组织方式,只讨论 IPv4 路由表、规则和优先级;不配置 NAT、负载均衡、转发或动态线路探测。
双网卡不等于所有流量都需要两张表
设想一台主机拥有两个已经配置好的地址:ens18 上是 192.0.2.20/24,网关 192.0.2.1;ens19 上是 198.51.100.20/24,网关 198.51.100.1。这里使用文档示例网段,接口名、地址和编号均为教学约定,不代表可直接使用的公网线路,也不是本机实测配置。
需求如果是“普通连接都走 A,只在明确调整时换 B”,主表更容易维护。需求如果变成“源地址为 A 时从 A 出,源地址为 B 时从 B 出”,单纯把 B 的默认路由 metric 调高就不够了:那是在比较候选路由,而不是按源地址隔开策略。
先写下决策条件,再选配置方式。Red Hat 的 策略路由说明也将按源地址等条件选路作为策略路由的使用场景;这里不沿用它的拓扑和操作步骤。
主表方案和源地址方案分别付出什么代价
| 方案 | 适合的要求 | 主要限制 |
|---|---|---|
| 主表管理出口 | 大部分连接共享统一出口偏好 | 不能只靠 metric 表达两组源地址的独立出口契约 |
| 源地址规则加专用表 | 已知源地址与出口需要一一对应 | 必须维护表内路由、规则优先级和例外目的网段 |
| 动态线路管理 | 需要判断运营商链路可用性并切换 | 超出静态 rule 与 route 的职责,需要另行设计 |
本例选择第二种,但不把它当成第一种的升级版。源地址策略要求查路由时有合适的源地址信息;它不会根据进程名称猜测业务归属,也不会自动替未绑定源地址的新连接选择任意指定线路。

先准备表内路由,再添加选择它的规则
以下命令只供已具备示例地址、网关和接口的隔离实验主机参考,需要管理员权限。执行前应确认 table 101、102 与 priority 1100、1200 尚未被占用,并保留控制台或其他恢复入口;不要在承载当前 SSH 会话的生产主机上照抄。
# 只读查看现有规则和两个计划使用的表,先确认编号没有业务用途 ip -4 rule show ip -4 route show table 101 ip -4 route show table 102
表为空或不存在不代表整个环境已经适合改动,还需要确认接口地址、网关可达和网络管理器的配置归属。下面只增加教学专用表,不覆盖 main 表的默认路由。任何一条命令出错时,应停下处理,不能继续添加引用不完整路由表的规则。
# A 表先包含本网段的链路路由,使本表的下一跳具有明确出口 sudo ip -4 route add table 101 192.0.2.0/24 dev ens18 scope link src 192.0.2.20 sudo ip -4 route add table 101 default via 192.0.2.1 dev ens18 # B 表使用另一组地址与出口,不把两个默认路由塞入同一策略表 sudo ip -4 route add table 102 198.51.100.0/24 dev ens19 scope link src 198.51.100.20 sudo ip -4 route add table 102 default via 198.51.100.1 dev ens19 # 表准备好后才添加精确源地址规则;数字是明确保留的示例优先级 sudo ip -4 rule add priority 1100 from 192.0.2.20/32 lookup 101 sudo ip -4 rule add priority 1200 from 198.51.100.20/32 lookup 102
src 是路由的首选源地址信息,不是源地址改写规则;from 才是这里的规则选择条件。数字表 ID 可以直接使用,不必为了理解这个例子先修改系统的路由表名称文件。具体语法参考 ip-route 官方手册。
表中一旦有 default,它也可能匹配其他内部目的地址。若主机还要访问管理网、另一张直连网或其他特殊网段,应在实施前明确对应的更具体路由或更高优先级目的规则;不能假定策略表会自动继承 main 的全部内容。这也是多表方案的维护成本。
规则优先级不能和路由 metric 混着比较
Linux 的常见初始规则包含 priority 0 查询 local、32766 查询 main、32767 查询 default。实际主机可能已被发行版、VPN 或管理员修改,必须以现有配置为准。本例保留 local,将两条源规则放在 main 之前,并使用不同优先级,避免相同编号带来维护歧义。
priority 1100 比 1200 先被考虑,并不意味着 A 的流量比 B 快;它只是规则顺序。对本例不重叠的两个 /32 源选择器,谁先写不应改变各自所属流量。若后续增加一条覆盖更大源网段的规则,顺序就可能影响结果。规则并不会自动按源前缀长度替你重新排序。规则语义见 ip-rule 官方手册。
选定一个表后,再在该表中匹配目的路由。不要拿 table 101 的 metric 与 main 的 metric 做跨表竞价,也不要用“把 main 的 metric 降低”来期望绕过已经成功找到路由的前置策略。

查表失败与链路故障不是一种回退
查某张表没有得到路由时,策略查找可以继续考虑后续规则;throw 路由也可表达结束当前表的查找。相反,明确的拒绝类型不是普通“未找到”,不能一概当成继续查表。内核的规则实现可参阅 IPv4 fib_rules 源码。
但网关实际不响应,并不意味着表中的 default 消失。只要路由查找仍成功,就不能指望内核自动跳过它并改用 main。这是静态选择与故障探测的分界:业务要求切换时,应另行定义检测、状态变更及恢复策略,而不是把两条规则的先后误认为自动主备。
也要先决定是否允许落到其他表。如果业务要求固定出口且不允许其他出口,应另行设计明确的终止策略;“未命中后回退 main”和“拒绝改走其他出口”是相反的要求,不能共用一句模糊的默认回退。
如何判断选择正确,以及何时不该采用
读者可以查询带明确源地址的路由决策。下面不会实际发送探测包,也不证明端到端连通;本文没有执行这些命令,因此不附虚构输出:
# 明确给出源地址,分别观察查询结果中的 dev、via 和表信息 ip -4 route get 203.0.113.80 from 192.0.2.20 ip -4 route get 203.0.113.80 from 198.51.100.20 # 分开读取规则与表内容,避免只看 main 表就判断策略没有生效 ip -4 rule show ip -4 route show table 101 ip -4 route show table 102
示例目标是 A 源地址对应 ens18、B 源地址对应 ens19。如果结果不同,应先找更早匹配的规则和该表中的路由,而不是立即追加第三条默认路由。对转发报文,还需要准确描述入接口等上下文;本文的主机源地址例子不能直接作为路由器完整配置。
正式持久化应由当前主机使用的网络管理组件统一维护,临时 ip 命令不等于已写入持久配置。需要按应用身份选择出口、自动健康切换或全网转发时,这套最小方案并不完整。
删掉测试配置时,能不能直接 flush all?
不要。回退应按已记录的两条规则及专用表内条目逐项删除,并先确认它们仍属于本次实验。这里不提供清空全局规则或路由的命令,以免误删管理入口和其他业务策略。
为什么不带 from 查询,看起来仍然走 A?
因为那不是同一个查询条件。未指定源地址的初始选路,不能代替“已使用 B 地址的报文”这一决策;应用需要选择源地址时,也要在它自己的连接配置中明确处理。
两条默认路由能自动把带宽相加吗?
不能据此推导。本文只建立源地址与路由表的对应关系,没有定义多路径分担机制,更没有保证单连接带宽叠加。先选清楚是统一出口、源地址分流还是动态主备,再安排相应的路由设计。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
194 收藏
-
文章 · linux | 1小时前 | 定时任务 · Linux · 日志排查 · Linux journalctl OnCalendar Persistent systemd timer cron迁移253 收藏
-
331 收藏
-
420 收藏
-
443 收藏
-
452 收藏
-
129 收藏
-
394 收藏
-
442 收藏
-
211 收藏
-
275 收藏
-
180 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习