OpenWrt配置

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

作者:快连官方团队
旁路分流IPSetCIDR
快连 OpenWrt 旁路分流规则 如何启用, OpenWrt 手动写入 旁路分流 规则 步骤, IPSet 与 CIDR 旁路分流 规则 区别, 快连 旁路分流 规则 不生效 如何排查, 多WAN 环境下 旁路分流 规则 最佳实践, OpenWrt 快连 旁路分流 配置 文件 路径

功能定位:为什么要在OpenWrt上手动写旁路分流

在路由器侧完成分流,可以让国内流量直连、海外流量自动进入快连隧道,终端设备无需再装客户端,也能避免「全家桶」式全局代理带来的延迟与带宽浪费。手动规则的优势是精准可控:企业内网、NAS、打印机、游戏主机都能单独拎出来走直连,而流媒体、SaaS 走隧道,既节省 Stars 流量,也降低高峰时段的 CPU 占用。

与快连自带「AI 智能分流 3.0」相比,OpenWrt 本地规则不受客户端升级影响,也不会因为「心跳探测包」额外消耗 200-400 MB/小时。经验性观察:在 100 Mbps 宽带、30 终端环境下,本地分流可把晚高峰平均延迟再降 8-12 ms,CPU 占用下降约 5%-7%(以 A53 四核路由为例,数据因固件版本差异±3%)。

功能定位:为什么要在OpenWrt上手动写旁路分流
功能定位:为什么要在OpenWrt上手动写旁路分流

前置条件:固件、内核与工具链检查

1. 固件版本与内核

截至当前的最新版本,官方 OpenWrt 22.03+ 已自带 nftables,但国内编译版(如 ImmortalWrt、iStoreOS)仍默认 iptables。手动分流脚本依赖IPSetdnsmasq-full,若内核 ≥5.10 且启用 nftables,需额外安装 kmod-nft-setiptables-nft 兼容层,否则会出现「Set not found」错误。

2. 必装软件包清单

opkg update opkg install ipset dnsmasq-full iptables-mod-tproxy kmod-ipt-tproxy curl ca-certificates

提示: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」。示例:

ipset create direct_cn hash:net family inet maxelem 65536 ipset create proxy_stream hash:net family inet maxelem 4096

脚本落地:从下载到热更新

1. 一键拉取 CN CIDR

#!/bin/sh # 文件:/etc/cn-ipset.sh CN_URL="https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt" curl -s $CN_URL | awk '{print "add direct_cn " $1}' | ipset restore -exist

把脚本写进 /etc/cron.daily,每天 06:00 自动更新,配合 dnsmasq --ipset 实现「中国域名→direct_cn」动态绑定。

2. 快连隧道接口假设

经验性观察:快连 Linux 端默认创建虚拟网卡 tun0,MTU 1280。若你使用官方一键脚本,可在 /etc/config/network 看到:

config interface 'klink' option proto 'none' option ifname 'tun0'

后续 iptables 规则里,把 -o tun0 作为「代理出口」匹配条件即可。

iptables 规则:五句话完成分流

  1. 标记直连包:iptables -t mangle -A PREROUTING -m set --match-set direct_cn dst -j MARK --set-mark 0x1
  2. 标记流媒体:-m set --match-set proxy_stream dst -j MARK --set-mark 0x2
  3. 放行已建立连接:-m mark --mark 0x1 -j ACCEPT
  4. 代理流媒体:-m mark --mark 0x2 -j TPROXY --on-port 1080 --tproxy-mark 0x2
  5. 其余默认走 tun0:iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

说明:0x1 直连流量直接回到主路由表;0x2 通过 TPROXY 透明代理进快连的 redsocks2 监听端口,实现「零配置」终端体验。

dnsmasq 集成:域名→IPSet 动态绑定

/etc/dnsmasq.d/01-ipset.conf 写入:

ipset=/netflix.com/disneyplus.com/hbomax.com/proxy_stream ipset=/dianping.com/youku.com/direct_cn

重启 dnsmasq 后,只要终端解析域名,对应 IP 会自动进入指定集合,无需手动维护 CIDR。经验性观察:同一域名在 5 min 内解析到不同 CDN 节点,IPSet 会自动去重,不会膨胀。

dnsmasq 集成:域名→IPSet 动态绑定
dnsmasq 集成:域名→IPSet 动态绑定

nftables 迁移提示(内核 ≥5.15)

警告

若固件默认启用 nftables,请把上述 ipset 改为 nft set,语法差异较大;混用 iptables-nft 会造成重复匹配,延迟增加 3-5 ms。

迁移步骤:先用 nft list ruleset 确认空表,再通过 iptables-translate 把旧规则一次性转成 nft 语法,最后关闭 iptables-nft 兼容层,避免双栈开销。

调试与观测:四步定位「漏网之鱼」

  1. 看标记:iptables -t mangle -L -v -n | grep 0x2 计数器是否增长
  2. 看 IPSet:ipset list proxy_stream | wc -l 确认域名已动态插入
  3. 看路由:ip rule show | grep 0x2 是否指向 300 表(TPROXY)
  4. 抓包: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 ≤9000ipset list direct_cn | wc -l
CPU 占用softirq ≤20%top 观察 5 min 均值
dnsmasq 重启时间≤3 stime /etc/init.d/dnsmasq restart
规则热更新零丢包ping 1.1.1.1 -c 100 观察中断

FAQ:高频问题 Schema 结构化

Q1: 升级固件后 IPSet 消失怎么办?

A: 把 /etc/ipset.conf 写进备份列表,并在 /etc/rc.localipset 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 起步。