ip rule 策略路由

原文地址:ip rule 策略路由

欢迎参观我的网站:无敌牛 -- 技术/著作/典籍/分享等

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)

除了 fromiif,还有以下常用选项:

选项 说明 示例
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> 隐藏小于某前缀长度的路由(高级用法) ---

最常用的是:fromtoiiffwmarkpriority


五、规则匹配顺序:priority(优先级)

  • 所有规则按 priority 从小到大匹配。
  • 默认规则(如 0: from all lookup local)优先级为 03276632767
  • 自定义规则默认优先级是 自动分配 (通常从 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 流量走特定路由。


七、注意事项

  1. 路由表必须存在table N 中的 N 必须在 /etc/iproute2/rt_tables 中定义(或直接用数字)。
  2. 规则不等于路由ip rule 只决定"查哪张表",表里必须有实际路由(ip route add ... table N)。
  3. 本地地址优先local 表(优先级 0)会优先处理本机 IP,所以 from 规则通常在 local 之后生效。
  4. 调试命令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 按防火墙标记选表 高级流量分类
相关推荐
草莓熊Lotso8 分钟前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·linux·运维·服务器·数据库·c++·mysql
okiseethenwhat11 分钟前
TCP拥塞控制算法原理详解
tcp/ip
盟接之桥13 分钟前
盟接之桥®制造业EDI软件,打通全球供应链“最后一公里”,赋能中国制造连接世界
网络·安全·低代码·重构·汽车·制造
ShineWinsu14 分钟前
对于Linux:文件操作以及文件IO的解析
linux·c++·面试·笔试·io·shell·文件操作
-SGlow-14 分钟前
Linux相关概念和易错知识点(52)(基于System V的信号量和消息队列)
linux·运维·服务器
江畔何人初15 分钟前
TCP的三次握手与四次挥手
linux·服务器·网络·网络协议·tcp/ip
m0_7381207216 分钟前
网络安全编程——Python编写基于UDP的主机发现工具(解码IP header)
python·网络协议·tcp/ip·安全·web安全·udp
Trouvaille ~29 分钟前
【MySQL篇】数据库操作:从创建到管理
linux·数据库·mysql·oracle·xshell·ddl
酸钠鈀32 分钟前
AI WB2 SDK Ubuntu 环境搭建
linux·运维·ubuntu
志栋智能33 分钟前
超自动化巡检:实现运维“事前预防”的关键拼图
大数据·运维·网络·人工智能·机器学习·自动化