Files
op-packages/luci-app-homeproxy

新增本仓库“架构重构”试验性产品luci-app-homeproxy-pro

(https://github.com/szwjp/luci-app-homeproxy-pro)

luci-app-homeproxy

The modern ImmortalWrt proxy platform for ARM64 / AMD64

基于 sing-box 1.14 内核的现代代理平台 — 简洁、高效、开箱即用。


项目定位

本项目是 luci-app-homeproxy 的分拆版本线:以 sing-box 1.14 内核为唯一目标,充分结合 1.14 引入的新特性进行升级,不再兼容 1.13 及更早内核。

版本线 内核要求 演进方式
homeproxy1.14(本项目) sing-box ≥ 1.14 1.14 特性驱动,配置生成直接使用 1.14 新格式

已融入的 sing-box 1.14 特性

领域 特性
DNS evaluate / match_response / race 响应匹配,乐观缓存与 store_dns,统一 dns.timeout
规则集 initial_path、多 tag、http_clients 下载客户端
连接 TUN dns_mode / dns_address,UDP NAT 参数(udp_mapping / udp_filtering / udp_nat_max)
证书 tls.acme → certificate_provider(key_type / profile / account_key)
工程化 生成配置内置 $schema;运行要求 sing-box ≥ 1.14

已修复:国内域名走代理问题(r4 / r6 / r7)

背景

bypass_mainland_china 的数据路由原本只用 geoip-cn(按 IP 匹配国内目标)。sing-box 不会把「域名连接」的域名解析成 IP 再去匹配 IP 规则集,因此按域名访问的国内站(如字节、百度等)落到 main-out 走了代理,只有「裸 IP 访问国内 IP」才直连。

修复方式

数据路由改用 action: resolve (prefer_ipv4) + geoip-cn → direct-out——先解析域名再做 IP 匹配,由真实 IP 决定国内 / 国外(国内 IP → 直连,其余 → 代理);数据判定不再依赖 geosite-cn / geosite-noncn 域名规则(geosite-cn 仍用于 DNS 路由)。

对字节、百度等国内域名,以及苹果等全球跨国企业站点更稳更友好;默认使用公共 DNS(223.5.5.5)作为国内 DNS 以降低污染概率。

可选增强 cn_ip_fallback

启用后使用 1.14 原生 evaluate / match_response:对非 geosite-cn 域名,若 main-dns 返回国内 IP,再回退到 china-dns 解析。

这版块确实很难两全,改来改去也都存在缺憾,就这样不改了,照顾大多数为准。

新增:规则集自动更新(r5)

为 bypass_mainland_china 的三个远程规则集(geoip-cn / geosite-cn / geosite-noncn)增加 update_interval: '24h',sing-box 每 24 小时自动重新拉取 .srs:

  • 热替换,不中断既有连接;
  • 下载失败时保留旧规则集,不影响分流。

新增:Snell 协议与 Hysteria2 增强(r9)

面向 sing-box 1.14 的一轮收敛:补齐新协议、暴露传输层新参数,并修复 1.14 DNS 迁移的一个行为缺陷。

领域 变更
Snell(1.14 新协议) 客户端出站 + 自建服务端 inbound 全支持(v4 / v6、psk、多用户 userkey、HTTP 混淆、v6 流量整形);订阅导入 snell://
Hysteria2 新增 disable_chrome_parrot(Ed25519 证书服务器兼容开关)、bbr_profile、hop_interval_max(跳变间隔随机化)、gecko 混淆与 min/max 包长;服务端同步支持 gecko
Hysteria v1 移除上游已废弃的 QUIC 流控调参(上游 1.16 将删除),回归 sing-box 默认
DNS 修正 1.14 自动迁移:legacy ip_cidr / ip_is_private 包装 evaluate 时继承原规则查询条件,不再对全部查询预解析
连接与交互 TLS handshake_timeout;TUN dns_mode 缺省(hijack)与平台 DNS 劫持叠加的界面指引;规则集 merged / OR 匹配语义与 query_type 兼容性提示

设计取舍:Chrome QUIC 指纹(1.14 默认开启)仅在服务器证书为 Ed25519 等握手失败时才需关闭;Snell 采用 sing-box 官方实现(v5 无线协议视同 v4,不支持 v5 QUIC 代理模式)。

新增:规则分流与 TLS 能力补全(r10)

补齐 sing-box 1.14 在路由规则与规则集加载侧的剩余能力,并加固一处规则集配置的校验提示。

领域 变更
route resolve 新增 disable_optimistic_cache、timeout两个控件,乐观缓存增至四个选项
route / route-options 新增 tls_spoof / tls_spoof_method(注入伪造 ClientHello 干扰按 SNI 过滤的中间盒,需特权),LuCI 提供 SNI 与方式选择(默认 wrong-sequence)
规则集加载 多 tag 时若 path/url/initial_path 缺少 {tag} 占位,生成器给出 warn 提示,配合 LuCI 表单校验与 sing-box 的硬拒绝(missing {tag} placeholder),三层防护避免误配
i18n 补齐新增文案的 zh_Hans 译文

工程化加固(r11)

一轮以可维护性与可验证性为目标的加固:重构不改变行为,测试锁住结果,经实机验证。

轮次 做了什么 结果
重构和修复错误 重构:前端 TLS/传输表单收敛、generator 共享 TLS/transport 构建、parse_uri 拆为 13 个协议函数
测试:协议单测 153 条、generator 回归、LuCI 表单快照
修复:executeCommand 清理、dnsmasq 路径告警、fw4 清单单源、启动日志、PEM 校验、wGET 失败原因
工程:提高中文翻译率 CI、架构核实

parse_uri 对比零差异、generator JSON 逐字节一致、表单快照逐字段一致
顺带修复 3 个既有缺陷:证书上传、fw4 清理回滚、dnsmasq 路径

稳定性修复(r12)

修掉两个会让功能整体不可用的缺陷,均由 issue 复现确认。

领域 变更
订阅抓取(#5) 抓取前先探测 wget 实现:GNU wget 用 -nv(静音进度条但保留失败原因),uclient-fetch / busybox wget 用 -q;--user-agent / --timeout 一并换成三家通用的 -U / -T。r11 引入的 -nv 是 GNU 专有选项,而 OpenWrt / ImmortalWrt 的 /usr/bin/wget 默认由 uclient-fetch 提供,参数解析阶段即失败,导致所有订阅更新以 no valid node found 结束
自定义路由(#3 #4) 修复 routing_mode='custom' 完全无法生成配置:direct_overrides 的使用早于声明(ucode 不做变量提升,strict 模式下直接抛未声明变量);本地规则集残留 legacy download_detour 字段,被 sing-box 判为 unknown field 而拒绝整个配置
预设规则集 geoip-cn / geosite-cn / geosite-noncn 改用 SagerNet 上游 raw URL,并经 main-out 下载:直连受 DNS 污染时会超时并静默沿用缓存;每天约 250 KB 的代理开销可忽略,节点引导不受影响
依赖 Makefile 补上 +ip-full、+kmod-tun

回归保障:订阅抓取用 stub wget 覆盖 GNU / 非 GNU 两条分支,并在装有 /bin/uclient-fetch 的目标上直接执行生成的命令行;自定义路由新增 custom.uci fixture(本地规则集 + 直连节点覆盖 + 路由规则)。

运行要求

  • ImmortalWrt / OpenWrt ≥ 24.10+(apk 或 opkg 均可安装)
  • sing-box ≥ 1.14.0(ImmortalWrt 25.12 源对应 sing-box 1.14.0-r1)
  • 低于 1.14 时服务会拒绝启动并记录明确日志

License 版权归 ImmortalWrt.org 与各贡献者