PBR:OpenWrt 路由器上的策略路由完全指南
pbr(Policy-Based Routing,策略路由)是 OpenWrt 路由器生态中一个功能强大且高度灵活的框架。它的核心使命是让你摆脱“要么全走 VPN,要么全不走”的二元困境,实现基于精细规则的流量调度。简单来说,你可以通过它设定:访问 google.com 的流量走 VPN 隧道,而访问 taobao.com 的流量则直连本地宽带——这一切由你定义。
一、从需求到架构:PBR 解决什么问题?
在传统的网络环境下,数据包的路由选择依据是目标 IP 地址,由内核的路由表决定。这带来了一个局限:你很难基于更细致的条件(如访问的是哪个“域名”、是哪个“设备”发出的请求)来灵活地选择数据通道。
pbr 正是为了解决这个痛点而生。它是一个为 OpenWrt 设计的规则化路由框架,允许你基于源/目标 IP、MAC 地址、端口、协议,甚至是域名来决策数据包的流向。它的定位是 mwan3 的一个轻量级、高灵活性的替代或补充方案,尤其擅长处理“特定流量走特定线路”的精细化路由需求。
二、核心工作机制:它究竟是如何运作的?
pbr 的运作机制可以拆解为几个层面,理解这些有助于你更好地配置和排查问题。
1. 与防火墙的深度集成(Fw4 Nft File 模式)
从 1.1.8 版本开始,pbr 已完全转向支持 OpenWrt 22.03 及以上版本的 fw4(基于 nftables)防火墙,不再支持传统的 iptables 方案。
它的工作方式非常现代且健壮,采用了一种被称为 “fw4 include nft file” 的模式:
- 生成规则文件:
pbr会将你配置的所有策略,翻译成一个完整的nftables规则集文件,临时存放在/var/run/pbr.nft。 - 原子化安装:校验无误后,这个文件会被安装到
/usr/share/nftables.d/ruleset-post/30-pbr.nft。 - 随防火墙自动加载:当 OpenWrt 的防火墙(
fw4)重新加载时,这个文件会被自动包含进来。这意味着pbr的规则与系统防火墙规则是浑然一体的,无需单独维护,也大大减少了服务启动时的开销和冲突可能性。
2. 路由表管理模式
pbr 支持三种路由表管理模式,以适应不同的网络环境:
- 动态路由表(Dynamic Routing Tables):这是默认模式。
pbr会为每个你指定的 VPN 出口(如wg0)动态创建独立的路由表,并管理相应的数据包标记链。 - Netifd 集成(Netifd Integration):从
1.2.2版本开始,pbr可以更好地与 OpenWrt 的netifd守护进程集成。在这种模式下,netifd负责管理路由表和标记链,pbr无需在接口状态变化时重启,实现了更平滑的体验。 - Mwan4 集成(Mwan4 Integration):当
mwan4(多 WAN 负载均衡和故障转移软件)安装并运行时,pbr会自动检测并进入集成模式。此时,mwan4管理路由表和标记链,而pbr的策略除了指向具体接口,还可以指向mwan4定义的策略组(如负载均衡组),实现策略匹配与多 WAN 能力的结合。
3. 如何实现“按域名分流”?
这是 pbr 最精妙的设计。它依赖于 DNS 解析器(dnsmasq-full)的 nftset 功能,通过一种动态的方式,将对域名的访问转换为对 IP 地址的路由控制。
工作流程如下:
- 配置规则:你在
pbr中创建一条策略,指定 “访问google.com的流量,走wg0(WireGuard)接口”。 - 动态 DNS 解析:当局域网设备请求解析
google.com时,请求会到达路由器的dnsmasq-full。pbr利用dnsmasq的nftset功能,在解析出 IP 地址的瞬间,自动将该 IP 添加到由pbr管理的、名为nftset的动态 IP 集合中。 - 策略实时生效:
pbr生成的nftables规则会检查每一个数据包。如果发现目标 IP 属于上述动态 IP 集合,就会给数据包打上特定的防火墙标记(fw mark),然后策略路由会根据这个标记,强制数据包从你指定的 VPN 接口发出。
关键优势:
- 自动化:无需手动维护庞大的 IP 地址列表。
- 动态更新:即使
google.com的 IP 地址变更,dnsmasq的新解析结果也会实时更新到集合中,策略永远有效。 - 子域名匹配:
dnsmasq的nftset会自动将domain.com的策略应用到所有*.domain.com的子域名上。
三、配置详解:从基础到进阶
pbr 提供了丰富的配置选项,主要通过编辑 /etc/config/pbr 文件或使用 LuCI 界面(luci-app-pbr)完成。
1. 全局配置(config pbr)
在 /etc/config/pbr 的主配置段中,有几个关键参数决定了服务的行为:
| 参数名 | 作用 | 推荐值/说明 |
|---|---|---|
resolver_set | 最重要的参数。控制域名策略的实现方式。 | 在 OpenWrt 23.05+ 上设为 dnsmasq.nftset;在 22.03 上可能需要设为 dnsmasq.ipset 并安装兼容包。 |
strict_enforcement | 当策略指定的 VPN 接口掉线时,是否强制执行规则。 | 默认 1(启用)。若接口 down,匹配该策略的流量将被丢弃,避免“泄露”。可改为 0 让其回退到主路由表。 |
uplink_ip_rules_priority | 策略路由规则(ip rule)的起始优先级。 | 默认 30000。数值越小优先级越高。 |
uplink_mark / fw_mask | 用于给数据包打标记(fw mark)的起始值和掩码。 | 默认 00010000 / 00ff0000。高起始值用于避免与 SQM/QoS 等流量控制工具的标记冲突。 |
2. 策略(Policy)配置
这是最核心的部分,每条策略定义 “什么样的流量,走哪个出口”。
| 参数名 | 作用 | 示例 |
|---|---|---|
src_addr | 匹配流量的来源(局域网侧)。 | 192.168.1.8/32(单台设备);192.168.1.0/24(整个子网);或 MAC 地址,如 AA:BB:CC:DD:EE:FF。 |
dest_addr | 匹配流量的目标地址。 | 可以是 IP 地址、子网,或在启用 resolver_set 后直接填域名,如 google.com。 |
dest_port / sport | 匹配目标端口或源端口。 | 如 443(HTTPS)、53(DNS),或范围如 5060-5061。 |
ipproto | 匹配协议类型。 | tcp、udp、icmp。对于 HTTP/3 这种基于 UDP 的协议,必须将协议设为 udp 才能匹配。 |
interface | 指定出口接口。策略的最终目标。 | 直接填入接口名,如 wg0(WireGuard)、tun0(OpenVPN)、wan(普通宽带)。 |
lookup | 指定使用的路由表 ID。 | 一般不填,pbr 会自动为 interface 生成动态路由表。高级用户可手动指定表 ID。 |
priority | 策略优先级。 | 数值越低,越优先匹配。默认 2000。 |
其他策略类型:
- DNS 策略:
pbr从1.2.2版本起增强了 DNS 策略功能,可以将特定设备的 DNS 请求劫持并重定向到指定的 DNS 服务器。这能有效解决“客户端使用自定义 DNS 导致域名策略失效”的问题。 - DSCP 标签策略:甚至可以基于数据包的服务质量标签(DSCP)进行路由,实现与 QoS 联动的精细化控制。
- 自定义用户文件:对于需要管理大量 IP/域名(如整个国家的 IP 地址段)的场景,
pbr支持自定义脚本文件。社区项目openwrt-pbr-iran-rules提供了一个动态获取伊朗全国 IP 列表的脚本,下载到/usr/share/pbr/后即可在 LuCI 中启用,实现大规模的国家级 IP 分流。
四、避坑指南:你必须知道的关键事项
pbr 很强大,但它的工作机制带来了一些“硬性约束”。以下是社区中最常见的几个问题:
- DNS 依赖是核心:
pbr的域名策略 完全依赖 于局域网设备的 DNS 请求经过路由器的dnsmasq-full。如果某台设备(或浏览器)启用了 DNS over HTTPS(DoH) 或Cloudflare's 1.1.1.1 App,它的 DNS 查询就会绕过路由器,导致pbr的域名策略对其完全失效。解决方案:在浏览器中禁用 DoH,或在路由器层面部署https-dns-proxy统一处理加密 DNS 查询。 dnsmasq-full是必须的:OpenWrt 默认安装的dnsmasq是精简版,不支持nftset。你必须手动卸载dnsmasq,并安装dnsmasq-full,否则域名策略不会生效。- IPv6 的复杂性:由于 IPv6 设备常使用临时地址(Privacy Extensions),导致源地址频繁变化,传统的基于 IPv6 源地址策略很难生效。建议:在策略中使用 IPv6 的 ULA(唯一本地地址)或 LL 地址来匹配特定设备。
- Netflix/流媒体服务的“诅咒”:官方文档明确指出,
pbr无法帮助你绕过 Netflix、Amazon Prime 或 Hulu 等流媒体服务的地区限制。这些服务检测 VPN 的技术非常成熟。相反,如果你的 VPN 是默认网关,可以用pbr强制 Netflix 等流量走 WAN,避免被流媒体服务判定为代理而拒绝访问。 - 版本兼容性:
- OpenWrt 22.03:这是一个过渡版本,虽然使用
fw4,但dnsmasq-full默认只支持ipset。你需要安装pbr-iptables兼容包,并将resolver_set设为dnsmasq.ipset才能正常工作。 - OpenWrt 23.05+:这是最理想的运行环境。
dnsmasq-full已原生支持nftset,直接安装pbr并将resolver_set设为dnsmasq.nftset即可。
- OpenWrt 22.03:这是一个过渡版本,虽然使用
五、总结:PBR 适合你吗?
pbr 是一把精密的瑞士军刀,它把网络的精确控制权交还到你手中,但也要求你具备一定的网络知识去驾驭它。
- 适合:拥有 OpenWrt 路由器(22.03+),希望实现精细分流(按域名、设备、端口),且愿意花时间理解其原理的技术爱好者。
- 不适合:只想在单台电脑或手机上实现分流(应改用客户端工具如 Clash/sing-box),或希望“一键傻瓜式”配置的用户。