仅 Windows 版本,源码就在仓库根目录。安卓版本已移除(备份见
Older/NetAccelerator/NetAccelerator-Android-backup-20261009.zip,也仍可从 git 历史取回)。
NetAccelerator 是只保留 Github 与 国外验证码平台 的轻量 Watt Toolkit Hosts 模式实现。它本身不是全局 CONNECT 代理,也不会修改、停止或重启 Clash。
- 本机反向代理监听
127.0.0.1:80和127.0.0.1:443。 - 仅在服务真实自检通过后,向 Hosts 写入带边界标记的目标域名映射。
- 浏览器访问目标域名时连接本机;上游使用现代
SocketsHttpHandler连接池做应用层 HTTP 反向代理。 ConnectCallback自己完成 TCP 连接与 TLS 握手,因此 SNI 由规则决定而不是被强制成请求域名(见下节)。DNS 使用普通实时查询,并为 GitHub/API 增加多个地区视角的标准 EDNS 查询;成功地址优先复用,失败地址短期退避。- 每个域名首次 Handler 生命周期为 10 秒,后续为 100 秒,旧连接延迟回收,避免失效连接长期驻留。
- 普通规则使用实时 DNS 和转发域名实时 DNS,Watt 缓存中的固定 IP 不再参与连接;现有 Clash 仅作为最后一级可选兜底,未运行时会被立即跳过。程序不修改 Clash 规则或系统代理。
- 退出时只删除
# NetAccelerator Start至# NetAccelerator End,不覆盖其它 Hosts 内容。
本机网络按 TLS SNI 字符串 阻断部分域名,同时会丢弃相当比例的冷握手。旧实现的三个问题叠加起来,就表现为「总是 502 无法加速」:
- SNI 被阻断的域名永远连不上。
raw.githubusercontent.com只要 SNI 等于它自己就在握手阶段被 RST(换任何 IP 都一样);SocketsHttpHandler.SslOptions.TargetHost是被忽略的,SNI 恒等于请求 URI 的主机名,所以旧代码根本无从更换 SNI。现在由ConnectCallback自己握手,规则可以指定替代 SNI,空值表示不发 SNI——raw.githubusercontent.com因此改用空 SNI。 - 只重试一次,且重试不换地址。 现在每个请求最多尝试 3 次,每次都会作废连接池、轮换候选地址并按可用性切换线路;同时限制「连接+TLS」整段时间,避免一个黑洞地址吃掉全部预算。
- 带路径条件的规则匹配失败后直接放弃。 例如
google.com的规则带/recaptcha条件,路径不含该片段时旧代码回到「直连」,而该域名在本机 DNS 被污染,必然失败。现在条件不匹配时仍使用该规则。
另外 watt-rules.tsv 新增第 6 列(替代 SNI),并修掉了会让该列被静默丢弃的解析 bug(Trim() 会吃掉表示空值的行尾制表符)。
目标域名来自当前 Watt Toolkit 中截图所示的两个启用组,完整清单位于 config/domains.txt,包括 Github Dev/API/Assets/Education/Resources/Uploads/UserContent、Git Push、Github App、Docker Hub、Github.io、Hugging Face、Greasy Fork,以及 Google reCAPTCHA、hCaptcha、Arkose Labs。
Hugging Face 与 Greasy Fork 在 Watt 中标记为 Beta,并依赖 Watt 后端签发的短期 X-Watt-Token。NetAccelerator 不读取或伪造 Watt 的账号令牌;这两项只能在可用传输路径下兼容转发。GitHub 与验证码项目不使用保存的固定 IP,每次 DNS 缓存过期后自动获取最新地址;运行时无需启动 Watt 或 Clash。
双击 启动.bat。第一次启动会出现 UAC,并创建仅供本机反向代理使用的 NetAccelerator 根证书和覆盖目标域名的服务器证书。叶证书签发完成后会删除根证书私钥,只保留受信任公钥,避免运行期间继续签发其它证书。
Watt Toolkit 与 NetAccelerator 都需要占用 80/443,不能同时开启加速:
- 当前 Watt 正在加速时,NetAccelerator 只显示端口冲突,不修改 Hosts,不停止 Watt,也不触碰 Clash。
- 要改用 NetAccelerator,请由你在 Watt 界面手动停止加速服务,然后点击 NetAccelerator 的“重新开启加速”。无需退出 Watt,更不要关闭 Clash。
只有真实完成 本机 TLS → 可信 DNS → 上游 TLS → HTTP 2xx/3xx 自检后,托盘才会提示“加速已真实就绪”。自检同时覆盖 github.com 与 raw.githubusercontent.com——后者是 SNI 阻断的代表,只查前者会让坏掉的线路仍显示“已就绪”。
排障时可以用 --http-port / --https-port 指定非 80/443 端口、配合 --no-hosts 在不改动 Hosts、也不与 Watt 抢端口的前提下验证链路;--no-proxy 则跳过 Clash 兜底。正常启动不需要这些参数。
- 系统代理始终保持原状;Clash 的
127.0.0.1:7897不会被覆盖。 - 服务退出时自动恢复 Hosts。
- 若进程异常终止,右键以管理员身份运行
恢复网络.bat;它只删除 NetAccelerator 自己的 Hosts 区块。 runtime/hosts-backup.txt仅在服务生效期间生成,用于人工审计/紧急恢复;日志和状态也集中在runtime/。
src/NetAcceleratorServer.cs:可维护源码。bin/NetAcceleratorServer.dll、bin/NetAcceleratorServer.runtimeconfig.json:基于本机 .NET 10 运行时的轻量服务。src/build_core.ps1:无需安装 SDK,使用现有运行时重新编译服务。config/domains.txt:两个加速组的精确域名清单。config/watt-rules.tsv:从当前 Watt 本地缓存提取的转发目标、优选 IP 和服务器加速规则;第 6 列是可选替代 SNI(空值=不发 SNI,留空该列=使用真实域名)。config/transport-proxy.txt:显式指定上游传输入口;当前为现有 Clash 的http://127.0.0.1:7897,用于避免 UAC 提权进程读取到不同的用户代理环境。程序只连接该入口,不修改或关闭 Clash。config/certificate-info.json、certificates/NetAcceleratorRootCA.cer:服务器证书指纹与仅含公钥的本地根证书。scripts/setup_https.ps1:幂等证书准备。scripts/tray.ps1、scripts/launch_tray.ps1、启动.bat:托盘与启动生命周期。scripts/恢复网络.ps1、恢复网络.bat:异常退出后的定向恢复。