ip rule
是 Linux 策略路由(Policy-based Routing, PBR) 的核心命令,用于控制内核在查找路由时使用哪张路由表。
📌 一、ip rule
基本语法
ip rule [list|add|del] [selectors] [action]
- selectors:匹配条件(如源 IP、入接口等)
- action:匹配后执行的动作(最常见的是
table N
,即使用路由表 N)
📌 二、ip rule add from <IP> table <N>
✅ 含义:
- 匹配源 IP 地址为
<IP>
的出站流量(即本机主动发出的数据包)。 - 当本机发送一个包,其源 IP 是
192.168.1.XX
,则使用路由表<N>
查找下一跳。
🔍 举例:
ip rule add from 192.168.1.XX table 100
- 当你从本机执行
ping 8.8.8.8
,且系统选择192.168.1.XX
作为源 IP 时, - 内核会去查 路由表 100,而不是默认的
main
表。
⚠️ 注意:
from
只对本机发出的流量生效(OUTPUT 和转发流量中的源 IP 匹配)。- 对进入本机的流量(如别人 ping 你)不生效。
📌 三、ip rule add iif <interface> table <N>
✅ 含义:
- 匹配从指定接口进入(ingress interface)的流量。
- 通常用于转发流量或响应入站请求的回包路径控制。
🔍 举例:
ip rule add iif eth1 table 200
- 所有从
eth1
接口进来的包(比如别人访问你 eth1 上的 IP), - 在决定如何回包时,会使用路由表 200 来查找出口。
⚠️ 注意:
iif lo
是一个特例:本地进程通信(如curl http://127.0.0.1
)也会触发iif lo
规则。- 对于本机主动发起的连接,
iif
通常是lo
,而不是物理网卡。
📌 四、其他常用 ip rule
匹配条件(selectors)
除了 from
和 iif
,还有以下常用选项:
选项 | 说明 | 示例 |
---|---|---|
to <IP> | 匹配目的 IP(出站或转发) | ip rule add to 10.0.0.5 table 10 |
oif <iface> | 匹配出站接口(较少用,因路由决定出口) | ip rule add oif eth0 table 20 |
fwmark <mark> | 匹配由 iptables/netfilter 打的标记 | ip rule add fwmark 0x10 table 30 |
priority <N> | 设置规则优先级(数值越小越先匹配) | ip rule add from 192.168.1.56 table 100 priority 1000 |
tos <TOS> | 匹配 IP 头中的 TOS 字段(已逐渐被 DSCP 取代) | ip rule add tos 0x10 table 40 |
protocol <proto> | 匹配路由协议(如 kernel, boot, static) | 较少用于策略路由 |
suppress_prefixlength <len> | 隐藏小于某前缀长度的路由(高级用法) | — |
💡 最常用的是:
from
、to
、iif
、fwmark
、priority
📌 五、规则匹配顺序:priority(优先级)
- 所有规则按
priority
从小到大匹配。 - 默认规则(如
0: from all lookup local
)优先级为0
、32766
、32767
。 - 自定义规则默认优先级是 自动分配(通常从 32765 往下),但强烈建议显式指定。
查看当前规则及优先级:
ip rule show
输出示例:
0: from all lookup local
1000: from 192.168.1.XX lookup 100
2000: iif eth1 lookup 200
32766: from all lookup main
32767: from all lookup default
✅ 建议:自定义规则用
priority 1000~10000
之间,避免与系统规则冲突。
📌 六、典型应用场景
场景 1:多出口(双 WAN)
ip rule add from 192.168.1.XX table wan1
ip rule add from 192.168.1.YY table wan2
→ 不同 IP 走不同运营商线路。
场景 2:对称路由
ip rule add iif eth1 table 100 # 从 eth1 进来的,回包查表 100
ip route add default via 192.168.1.1 dev eth1 table 100
→ 确保回包从原入口返回。
场景 3:基于应用标记路由(配合 iptables)
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1
ip rule add fwmark 1 table https_route
→ 所有 HTTPS 流量走特定路由。
📌 七、注意事项
- 路由表必须存在:
table N
中的 N 必须在/etc/iproute2/rt_tables
中定义(或直接用数字)。 - 规则不等于路由:
ip rule
只决定“查哪张表”,表里必须有实际路由(ip route add ... table N
)。 - 本地地址优先:
local
表(优先级 0)会优先处理本机 IP,所以from
规则通常在local
之后生效。 - 调试命令:
ip route get 8.8.8.8 from 192.168.1.56 # 查看实际使用哪张表 ip rule show ip route show table 100
✅ 总结
选项 | 作用 | 适用流量方向 |
---|---|---|
from <IP> | 按源 IP 选路由表 | 本机发出(OUTPUT) |
iif <iface> | 按入接口 选路由表 | 入站(INPUT/FORWARD) |
to <IP> | 按目的 IP 选路由表 | 所有方向 |
fwmark | 按防火墙标记选表 | 高级流量分类 |
发表回复