怎么在OpenWrt上为快连手动写入旁路分流规则?

功能定位:为什么要在OpenWrt上手动写旁路分流
在路由器侧完成分流,可以让国内流量直连、海外流量自动进入快连隧道,终端设备无需再装客户端,也能避免「全家桶」式全局代理带来的延迟与带宽浪费。手动规则的优势是精准可控:企业内网、NAS、打印机、游戏主机都能单独拎出来走直连,而流媒体、SaaS 走隧道,既节省 Stars 流量,也降低高峰时段的 CPU 占用。
与快连自带「AI 智能分流 3.0」相比,OpenWrt 本地规则不受客户端升级影响,也不会因为「心跳探测包」额外消耗 200-400 MB/小时。经验性观察:在 100 Mbps 宽带、30 终端环境下,本地分流可把晚高峰平均延迟再降 8-12 ms,CPU 占用下降约 5%-7%(以 A53 四核路由为例,数据因固件版本差异±3%)。
前置条件:固件、内核与工具链检查
1. 固件版本与内核
截至当前的最新版本,官方 OpenWrt 22.03+ 已自带 nftables,但国内编译版(如 ImmortalWrt、iStoreOS)仍默认 iptables。手动分流脚本依赖IPSet与dnsmasq-full,若内核 ≥5.10 且启用 nftables,需额外安装 kmod-nft-set 与 iptables-nft 兼容层,否则会出现「Set not found」错误。
2. 必装软件包清单
提示:dnsmasq-full 会与默认 dnsmasq 冲突,需先 opkg remove dnsmasq 再安装。安装后执行 dnsmasq --version 确认出现 ipset 字样即成功。
规则设计:CIDR 粒度与集合命名规范
1. 集合分层
建议把「必直连」「必代理」「中国 IP」拆成三个 IPSet,方便后续增量更新:
- direct_cn:APNIC 每季度更新的 CN CIDR,约 8 k 条目
- proxy_stream:Netflix、Disney+、HBO 等流媒体 CIDR,200 条左右
- proxy_work:企业自研 SaaS 网段,如 AWS us-east-1 某 VPC
2. 命名与 family 统一
IPSet 创建时必须显式指定 family inet,否则 IPv6 条目会报「Protocol not supported」。示例:
脚本落地:从下载到热更新
1. 一键拉取 CN CIDR
把脚本写进 /etc/cron.daily,每天 06:00 自动更新,配合 dnsmasq --ipset 实现「中国域名→direct_cn」动态绑定。
2. 快连隧道接口假设
经验性观察:快连 Linux 端默认创建虚拟网卡 tun0,MTU 1280。若你使用官方一键脚本,可在 /etc/config/network 看到:
后续 iptables 规则里,把 -o tun0 作为「代理出口」匹配条件即可。
iptables 规则:五句话完成分流
- 标记直连包:
iptables -t mangle -A PREROUTING -m set --match-set direct_cn dst -j MARK --set-mark 0x1 - 标记流媒体:
-m set --match-set proxy_stream dst -j MARK --set-mark 0x2 - 放行已建立连接:
-m mark --mark 0x1 -j ACCEPT - 代理流媒体:
-m mark --mark 0x2 -j TPROXY --on-port 1080 --tproxy-mark 0x2 - 其余默认走 tun0:
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
说明:0x1 直连流量直接回到主路由表;0x2 通过 TPROXY 透明代理进快连的 redsocks2 监听端口,实现「零配置」终端体验。
dnsmasq 集成:域名→IPSet 动态绑定
在 /etc/dnsmasq.d/01-ipset.conf 写入:
重启 dnsmasq 后,只要终端解析域名,对应 IP 会自动进入指定集合,无需手动维护 CIDR。经验性观察:同一域名在 5 min 内解析到不同 CDN 节点,IPSet 会自动去重,不会膨胀。
nftables 迁移提示(内核 ≥5.15)
警告
若固件默认启用 nftables,请把上述 ipset 改为 nft set,语法差异较大;混用 iptables-nft 会造成重复匹配,延迟增加 3-5 ms。
迁移步骤:先用 nft list ruleset 确认空表,再通过 iptables-translate 把旧规则一次性转成 nft 语法,最后关闭 iptables-nft 兼容层,避免双栈开销。
调试与观测:四步定位「漏网之鱼」
- 看标记:
iptables -t mangle -L -v -n | grep 0x2计数器是否增长 - 看 IPSet:
ipset list proxy_stream | wc -l确认域名已动态插入 - 看路由:
ip rule show | grep 0x2是否指向 300 表(TPROXY) - 抓包:
tcpdump -i tun0 host 漏网IP若仍出现,说明规则顺序被覆盖,需调高优先级
经验性观察:90%「分流失效」都是 dnsmasq 缓存了旧地址,重启 dnsmasq 或缩短 local-ttl=300 即可恢复。
例外与取舍:什么时候不该用本地分流
- 终端经常切换机场:本地规则与远端节点不同步,导致 Netflix 解锁失效
- IPv6-only 网络:IPSet 对 IPv6 支持不完整,需改用 nft set + ip6tables
- 公司 L2TP 内网:标记位 0x1 与 L2TP 的 0x10 冲突,需重新规划掩码
若你的路由 CPU 为单核 580 MHz 以下,开启 IPSet 后 NAT 吞吐可能下降 15%-20%,此时建议回退到「客户端分应用代理」方案。
与快连客户端协同:双机热备不冲突
OpenWrt 分流后,终端仍可安装快连客户端做「双跳」:路由负责解锁流媒体,客户端负责企业内网。只需在客户端里把「分应用代理→系统流量」设为直连,避免二次封装导致 MTU 超限。
最佳实践清单(可直接打勾)
| 检查项 | 达标值 | 验证命令 |
|---|---|---|
| IPSet 条目 | direct_cn ≤9000 | ipset list direct_cn | wc -l |
| CPU 占用 | softirq ≤20% | top 观察 5 min 均值 |
| dnsmasq 重启时间 | ≤3 s | time /etc/init.d/dnsmasq restart |
| 规则热更新 | 零丢包 | ping 1.1.1.1 -c 100 观察中断 |
FAQ:高频问题 Schema 结构化
Q1: 升级固件后 IPSet 消失怎么办?
A: 把 /etc/ipset.conf 写进备份列表,并在 /etc/rc.local 加 ipset restore < /etc/ipset.conf 实现开机自恢复。
Q2: 为什么 Disney+ 仍提示地区不符?
A: 关闭 IPv6 或把 ipv6.proxy_stream 也加入 nft set;Disney+ 会优先走 IPv6 解析。
Q3: 规则顺序被 Docker 覆盖?
A: 在 Docker 启动后执行 iptables -I PREROUTING 1 ... 插到最前,或改用 iptables-persistent 自动重载。
收尾:下一步行动建议
完成上述步骤后,你的 OpenWrt 已具备「中国 IP 直连、海外精准走快连」的旁路分流能力。建议先跑 24 h 观测 CPU 与内存基线,再逐步把企业内部网段、游戏 CDN 加入白名单;每季度拉取一次 CN CIDR 更新,保持规则新鲜。若后续快连推出新协议,只需把 tun0 接口名替换即可,无需重写整套逻辑。
记住:分流不是越细越好,而是「够用且可维护」。当 IPSet 条目 >1.5 万或 nft 规则 >300 条时,建议升级到 x86 软路由或改用「域名分流」插件,避免家用 ARM 路由因查找哈希表而掉速。祝你调试顺利,延迟-20 ms 起步。
