Skip to content

NetHub v0.6.0

Choose a tag to compare

@Lithivm Lithivm released this 14 Oct 02:36
· 56 commits to main since this release

NetHub v0.6.0

这一版最重要的一件事:引擎和界面拆成了两个进程 —— 从此"界面被杀"不再连坐隧道。
其余都是现场反馈逼出来的小修(有一处是会丢配置的坑,务必看最后一节)。

新:引擎与界面是两个进程(现场那台机器的救星)

客户现场的 HIS/医保客户端启动器清自己的 WebView2 缓存时,会按进程名杀掉全系统所有
msedgewebview2.exe
(反编译它的启动器实证)。以前界面和引擎在同一个进程里,结果是
"NetHub 整个静默消失、hosts 段留在系统里没人兑付"。

  • 现在是 nethub.exe(引擎 + 托盘 + 看护)和 nethub.exe -frontend(界面)两个进程。
  • 界面被外部程序杀掉:引擎、隧道、hosts 毫发无损,后端看护循环约 2 秒把界面拉回来,
    并在日志里写一行"界面进程被外部程序结束(退出码 N)"。实测退出码 3 → 1.6 秒后新界面拉起。
  • 前端进程不读也不写配置(配置里有上游凭据),只给它 -logdir,结构上碰不到 config.yaml。
  • 已知边界:有人点名杀 nethub.exe 时后端一样会死(那种情况要靠 SCM 失败重启,未做)。
    对外只承诺"杀界面不影响业务"。

新:连接页可以展开「历史连接」

  • 在当前连接列表下面多了一条 ▸ 历史连接,展示已结束连接的存档:
    进程 / 本地端口 / 目标 / 动作 / 链 / 时长 / 收发字节 / 结束时刻 / 状态 / 失败原因。
  • 可按目标 / 进程 / 链 / 规则过滤,带「刷新」和「清空」(先清空再做一次动作,
    剩下的就全是那一次留下的)。
  • 为什么需要:上面那张表只显示"现在还在的"(已结束的 15 秒就消失、引擎 2 分钟物理回收),
    而"刚才那批连到哪儿去了、为什么失败"往往是一两分钟后才来看。

改:报警不再"一闪一闪"(判定收紧)

"代理可能被 Clash 之类的接管"这条红线告警以前太宽松,会出现短暂误报。现在:

  • 系统代理开着但没有代理服务器地址、以及 PAC 模式,都不再拿绕过列表下结论
    (PAC 下绕过列表根本不参与判定),卡片上会写明"为什么这次没按绕过列表算"。
  • 读到"缺条目"隔 3 秒再读一次,还缺才报 —— 杀掉的是"代理工具先写开关、后写绕过列表"
    那个竞态窗口。
  • 引擎没在跑时不告警(没有隧道可被绕过)。
  • 判定结论由后台巡检写进缓存、界面只读结论(以前界面每 1.5 秒现读,把注册表被重写中的
    裸值直接挂成常驻告警条)。
  • 顺带收紧 TUN 让路检测的网卡名判据:以前"名字里含 tun"就算命中,于是 Windows 自带的
    Tunnel adapter Teredo…、各类 VPN 网卡都会被判成"有 TUN 模式的代理在接管流量" ——
    而误判的代价是我们真的让路(DNS 接管不启动、域名规则失效)。

改:几处界面与可观测性

  • 报错可以左键点开了:弹窗里是完整原文 + 「复制全文」(悬停看不全也选不中,
    而现场是要把原文发给别人的)。接到规则页的域名解析提示与状态胶囊的出错态。
  • 状态胶囊补上**「启动中」**中间态(琥珀 + 转圈),不再从"未启动"直接跳到"就绪"。
  • 主题第一帧就对(深色用户不再看到一闪的浅色)。
  • 自检并行猜端口:整轮自检 25 秒 → 3 秒(探测量不变)。
  • 界面处于只读态(服务版/另一实例在跑)时挂常驻告警条 + 一个「接管引擎」按钮,
    不再只有一句"你不能用"。
  • 连接页长任务不再把界面卡住(修了一处 IPC 回调阻塞读循环,界面状态曾整整滞后 30 秒)。

修:一个会弄丢配置的坑(建议都升级)

nethub.exe -apply 的用法有个陷阱:Go 的命令行里字符串选项会吃掉下一个参数,
所以 -apply -apply-force <文件> 会被当成 -apply="-apply-force"。而当时"读一个不存在的
配置路径"会静静生成一份默认配置,于是 apply 把这份默认模板写进了真正的目标配置 ——
5 条链/7 条规则会被打成 1 条示例链、0 条规则。

  • 现在路径不存在就直接报错,什么都不建、什么都不写;报错文案直接点名这个写法。
  • 正确顺序是 -apply-force -apply <文件>,或 -apply=<文件>。
  • 两条回归测试钉住:不建文件、目标配置字节级不变。

修:-clash-check 命令行诊断会崩

它没有引擎实例,调 MarkSelfPort 时空指针 panic,整个命令不可用。现在可用了,
并且会先说明"本命令的探测连接会以 nethub.exe 名义出现在运行实例的连接列表里"
(两个进程,登记不了 —— 不骗你)。

现场注意:内网域名要能在本机解析成真实内网 IP

按域名接管的正常路径是"DNS 接管回假 IP → 转发时把域名交给上游解析"。但如果这个域名
本机解不开(内网名、公网没有记录),上游那边通常也没有这条内网 DNS ——
日志里会是:

[sjy] 把域名 main.xamjyy.com 交给上游解析失败: socks CONNECT 被拒: host unreachable

换链没用(实测 etyy 与 sjy 一样拒)。正解是把域名写进「设置 → 系统 hosts 接管」,
映射到真实内网 IP:应用连的就是那个 IP,它本来就落在接管网段里,谁都不需要解析域名。
实测(DF HIS 打开 http://main.xamjyy.com/login):hosts 加一条
10.100.100.99 main.xamjyy.com 之后,curl 拿回 200、DF HIS 自报
NavigationCompleted: IsSuccess=True、登录页完整渲染。

升级方式

解压 NetHub.zip,用新的 nethub.exe 覆盖旧的(首次使用请把
config.yaml.example 复制成 config.yaml 再填自己的上游)。程序不会碰你的配置,
覆盖 exe 即可,config.yaml 原样保留。