ip rule 通过匹配流量特征(如源ip、目的ip、入接口等)将数据包导向指定路由表,按priority从小到大匹配,决定查哪张表而非直接转发。

Linux 用 ip rule 管理多路由表规则,核心是把“流量特征”和“路由表”绑定起来,让不同来源或去向的包查不同的路由表。它不直接转发数据,而是决定“该查哪张表”。
先搞清楚三要素关系
-
路由表(如
main、local、自定义table_eth0):存具体路径,比如default via 192.168.1.1 dev eth0 -
规则(
ip rule):定义“什么包 → 查哪张表”,靠匹配条件(from/to/iif/fwmark等)触发 -
匹配顺序:按
priority数值从小到大执行,0 最高,32767 默认最低;相同 priority 的后加规则会被忽略
系统默认有三条规则:
0: from all lookup local # 本地地址、广播等,最高优先 32766: from all lookup main # 主路由表,常规流量走这里 32767: from all lookup default # 备用空表,兜底
添加规则:明确匹配条件和目标表
常用场景对应写法:
-
按源 IP 分流(最常见)
让本机从192.168.1.100发出的流量走table_eth0:ip rule add from 192.168.1.100/32 table table_eth0 priority 100
-
按源网段分流
所有来自10.0.2.0/24的出向流量进table_eth1:ip rule add from 10.0.2.0/24 table table_eth1 priority 101
-
按入接口区分(适合网关/防火墙)
从eth1进来的包,查table_eth1:ip rule add to 0.0.0.0/0 iif eth1 table table_eth1 priority 200
-
按目的地址回程保一致(配合 SNAT 或服务暴露)
若192.168.10.0/24是对外提供服务的网段,需确保响应包也走原路径:ip rule add to 192.168.10.0/24 table table_eth0 priority 99
⚠️ 注意:只配 to 不配 from,通常无效——内核初始选路基于源,to 规则主要用于回程控制。
查看与调试规则
-
列出所有规则(含 priority):
PyCharm 2026.2.0.1 Linux版下载PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
ip rule show
-
检查某条规则是否生效,可结合
ip route get验证路径:ip route get 8.8.8.8 from 192.168.1.100 # 输出应显示用了 table_eth0 中的路由
-
查看指定路由表内容:
ip route show table table_eth0
-
删除某条规则(推荐用 priority 删除,避免误删):
ip rule del priority 100
-
清空所有自定义规则(慎用,会清掉非默认规则):
ip rule flush
关键避坑点
- 路由表必须存在且有有效路由:
ip route show table X至少要有一条default via ...或直连路由 -
priority必须唯一:重复值会导致后加规则静默失效 - 关闭反向路径校验(
rp_filter),否则非对称路径包可能被丢弃:echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter # 或设为 2(宽松模式):echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter
- 规则不持久:重启后消失,需写入网络启动脚本或使用
ip rule save+ip rule persist(部分发行版支持)
不复杂但容易忽略










