Skip to content

Releases: Lithivm/NetHub

v0.9.1 · 托盘图标换成面积图 · 可选总量/上行/下行

Choose a tag to compare

@Lithivm Lithivm released this 21 Oct 01:10

这一版在做什么

托盘图标从小柱子换成面积 + 上沿线(最近 16 秒的迷你曲线),可选只看上行/下行;
配色跟随 Windows 任务栏的明暗(不是我们软件的主题)。另有一处持久化修复。

托盘图标

  • 换成面积 + 上沿线:16px 缩下去细折线会糊成噪点,面积仍然是一块“有形状的东西”,
    上沿线保留“在涨还是在跌”。数据取后端已有的 60 秒采样,最近 16 秒。
  • 设置 › 外观 › 显示内容:总量(默认)/ 上行 / 下行。
    小图标里两个方向同时画必然有一方被压扁;只关心回传或只关心下载时选一个更清楚。
  • 深/浅两套配色,跟随 Windows 任务栏:读 SystemUsesLightTheme(只读注册表,每 30 秒复查)。
    浅色版蓝/绿各压深一档 —— 原来的亮蓝 + 中灰底线在浅色任务栏上几乎看不见。
    注意它跟的是系统明暗,不是软件内的主题(两者可以不一致)。
  • 空载时留一条底线(图标不能全透明,否则托盘上“没有图标”);关掉开关当场换回默认图标。

修复:托盘设置没被“本机偏好”保护

  • 以前 LocalPrefs 只管两个日志档位,-apply / 导入 / 回滚 / deploy.ps1 换配置时
    会把托盘开关、显示内容、主题一起洗回默认。
  • 现在四项都算本机偏好(重启保持,换配置不受影响),并加了回归测试。

界面

  • 外观卡去掉了所有说明小字(开关与下拉不需要说明书),「显示内容」下拉收窄到 88px。

升级说明

  • 老配置直接可用;ui.tray_traffic_mode 是新增的可选项(不写 = 总量)。
  • 托盘图默认仍然是关(用 nethub.ico 品牌图标),要去设置 › 外观 打开。

门禁

gofmt / go vet / go test ./internal/... 全绿;check-ui 与 ui-controls-test 通过;
accept.ps1 8/8。三种显示模式的热切换与重启保持都实测过。

v0.9.0 · 日志分档照 Proxifier · 连接能手动结束 · 托盘显示实时流量

Choose a tag to compare

@Lithivm Lithivm released this 20 Oct 08:30

这一版在做什么

日志照 Proxifier 的三档重排,并让「屏幕」和「文件」各用各的档 —— 平时界面清爽,出事把 nethub.log 发出去又有料。
顺带补了连接列表上的两个常用动作、一个解析白名单,以及托盘图标可显示实时流量。

日志

  • normal 只留连接与错误:连接行改成 open: chrome.exe (8804) → main.his.com(172.30.4.217):80 via etyy
    与 close: … ↑76 B ↓279 B 547ms/682ms;route.match、DNS、stats、ECH 等判定面全部归 verbose。
  • verbose 多出三样排查用的量:upstream.pick(这条连接实际走了哪个上游、rtt、现拨还是预热会话)、
    conn.stage(域名解析 / 连上游 / 目标首个字节 / 全程,分段耗时)、direct.done(直连与阻断连接的收尾)。
  • 屏幕档与文件档分开设(设置 › 文件与日志):最常用的组合是「屏幕 normal + 文件 verbose」。
  • 档位会记住:重启后保持;-apply / 导入配置 / 回滚备份 / 无人值守部署都不再把它改回 normal。
  • 连接页右上角新增 「详细日志」:看到可疑连接点一下就切 verbose,不用跳页去拨滑块。

连接

  • 可以手动结束一条连接:展开连接行,每条明细右边有「结束」(点两次确认)。
    应用会自己重连,规则不变;日志里记 by=user,免得被误认为网络断了。

解析

  • 新增 domain_resolve_local:指定域名强制本机解析(支持 *.his.com),压过全局 domain_resolve。
    混合场景(公网域名交上游、内网域名只有客户 DNS 认得)不用再二选一。

托盘

  • 设置 › 外观 › 「托盘图标显示实时流量」(默认关):开关打开后托盘图标变成上蓝下绿两根柱,
    收起窗口后一眼看出还在不在干活。空载时保留一条底线,不会变成看不见的图标。

升级说明

  • 老配置直接可用,没有必填的新字段;ui.log_level 会显式写进 config.yaml(以前默认配置里没有这一项)。
  • 默认日志档位仍是 normal;如果没有单独设文件档,文件跟随屏幕档(与以前行为一致)。

门禁

gofmt / go vet / go test ./internal/... 全绿;check-ui 与 ui-controls-test(含三条新断言)通过;
accept.ps1 8/8(配置校验、非法配置被拒、启动就绪、驱动、内网连通、热生效、还原)。

v0.8.1 · 托盘点了没反应(已修)· 安装服务 ≠ 启用服务

Choose a tag to compare

@Lithivm Lithivm released this 19 Oct 08:44

双击托盘图标打不开界面(修好了)· 安装服务 ≠ 启用服务 · 顶栏流量图

v0.8.0 → v0.8.1,主要是一个会让人以为程序坏了的 bug,外加一处服务形态的语义调整。

一、托盘点了没反应(本版主戏)

现象:某台机器重启过几次之后,双击托盘图标、点「显示界面」一点动静都没有,
日志里也不留一个字。引擎照跑、内网照通,就是界面出不来。

根因是三个坑叠在一起:

  1. 孤儿界面:引擎被外部强杀(任务管理器 / 计划任务重启 / 崩溃)时,界面进程不会跟着死,
    它活下来、还占着「同一时间只跑一个界面」的那把锁。
  2. 新界面一启动就"让位":之后引擎每次拉起的界面都发现锁被占着,就把唤醒消息丢给那个孤儿、
    自己 30 毫秒后退出(退出码 0)。
  3. 看护把它当成"用户主动退出":于是看护循环永久收工 —— 从此这台机器再也没有界面,
    直到有人手工杀进程。现场那台孤儿活了三天,期间每次重启引擎都是白重启。

修法:

  • 界面进程带 -parent <引擎pid> 起来,宿主没了 2 秒内自己退出(不再产生孤儿占锁);
  • 看护遇到退出码 0 改为待命(点托盘会再拉一次),而不是收工;
  • 托盘点了先请「已经接上的那个界面」把窗口露出来,叫不动才重新拉起 ——
    以前是按"我有没有亲手拉起过进程"判断,等于把活着的那一个当空气。

验证:local/tray-fix.ps1(换 exe + 重启 + 端到端):点 X 收进托盘 → 点托盘能叫回来 →
强杀引擎后界面自己退出 → 再起界面正常,全过。

二、安装服务 ≠ 启用服务

以前 -service-install 装完就是"每次开机自动跑" —— 于是装来备用的服务会悄悄抢走引擎,
登录后起来的界面只能当只读失败者(没托盘、没通知、刷权限报错)。

现在跟「装虚拟网卡」和「开 TUN」分开一个道理:

  • nethub.exe -service-install:只注册(手动启动),不自己跑、不随开机;
  • 界面「设置 → headless 模式」新增开关「开机自启用服务形态」:
    拨开 = 设为开机自启 + 顺手关掉界面版那条计划任务自启(两个都开必然抢引擎)+ 当场交棒;
    拨关 = 取消开机自启(注册保留)+ 停服务 + 把引擎接回界面版;
  • 命令行对应 nethub.exe -service-autostart on|off,-service-state / -status 里能看到
    autoStart;
  • 重新部署(换路径/参数)不会冲掉你已经拨好的自启开关。

三、顶栏流量图

  • 曲线外面加了一层圆角淡底框,跟状态胶囊、按钮同一套视觉(以前是直接铺在白底上的一块色板);
  • 折线改成过中点的轻平滑(不移动任何采样点,只是把 4px 一个的折角磨圆);
  • 右端加了一个当前值小圆点,告诉你曲线"现在"落在哪;贴到最低/最高也不会被裁半边了。

四、顺手

  • README 的界面截图重拍(旧的被误删过)。
  • 「开机自启用服务形态」那行解释文案去掉(说明放进了卡片右上角的「i」)。

安装 / 升级

  • 包:NetHub.zip(不含任何配置与日志;把 config.yaml.example 复制成 config.yaml 填自己的上游)
  • 已经在用的:直接覆盖 nethub.exe(config.yaml 保留),或用「设置 → 关于 → 一键更新」。
  • 回滚:nethub.exe -rollback(旧程序保留为 nethub.exe.old)。

如果你这台机器上"两种形态都装着":本版之后"装着"是无害的,冲突的只是两条自启。
桌面机 → 界面里关掉「开机自启用服务形态」(服务注册留着备用),GUI 那条计划任务自启开着;
服务器 → 打开「开机自启用服务形态」,界面里关掉计划任务自启。

已知边界

  • UDP(QUIC 那一类)仍然只拦下不中继;只能 Windows x64;IPv6 主动不做。
  • GUI / 计划任务形态被点名杀进程后没有自动恢复能力(系统层面不支持);
    无人值守请用服务形态(它由 SCM 负责拉起,带熔断)。

v0.8.0 · 崩了能自己回来 · 统计卡 · 上游不再依赖 gost

Choose a tag to compare

@Lithivm Lithivm released this 16 Oct 06:57

三件事:崩了能自己回来 · 看得到谁在占通道 · 上游不再依赖 gost

这一版是三块一起上的(v0.7.1 → v0.8.0)。

一、被外部结束 / 崩溃之后自动拉起(服务形态)

包装成 Windows 服务的机器(nethub.exe -service-install)以前被杀掉就一直是死的,没人知道。
现在服务形态会由 SCM 自动重启:5 秒后第一次、30 秒后第二次,而且带熔断 ——
如果程序是因为配置坏了"起来就崩",不会无限重启把客户的网络反复搞断。

日志里也会留一句"上次未正常退出(pid N)"并在托盘弹一条提示,不用去猜它是不是重启过。

GUI 形态(计划任务自启)没有这个保障:计划任务的失败重试对"进程被外部结束"实测不生效
(Task Scheduler 的语义限制,不是我们没做)。长期无人值守的机器本来就该用服务形态。

二、新的「统计」卡:回答"这段时间谁在占通道"

在「连接」页下半部分(没有新开页签,页签带不该长):

  • 三组数字:连接数(含还开着的 / 失败)、流量(↑ 发送 ↓ 接收)、时长(这组数字覆盖了多久);
  • 按目标与按应用两个维度各一张表(同一个连接两边都进,合计相等),
    域名能认出来就并到域名那一行,点表头换列序;
  • 「复制」一下把整张表带走(制表符分隔,直接贴进表格);「清零」从头再数;
  • 口径只有一个:累计(本程序启动以来)—— 与「链」页的累计、顶栏流量图同一个起点,
    引擎重启不会清零(否则同一件事会有两个数)。

直连流量要算进来,得先在「连接」页打开「也统计直连流量的字节数」(关着时直连的包根本不进内核过滤器)。

三、上游协议扩展:内置更多协议,不再需要装 gost

以前上游只能是 socks5(+tls) / http(s) / socks4,要别的协议就得挂一个 gost 进程。
现在这些都在程序里了:

新增 写法
传输层 +tls / +ws / +wss(只认两段:socks5+wss 对,socks5+ws+tls 错)
shadowsocks ss://aes-256-gcm:口令@host:8388(传统 AEAD 四种 + 2022-blake3 三种,2022 的口令位置填 base64 的 PSK)
trojan trojan://口令@host:443(天生 TLS)
VLESS vless://uuid@host:443?security=tls&sni=…,也认 type=ws&path=/ws
VMess vmess://<base64(json)> 分享链接直接粘,或 vmess://uuid@host:443?security=tls
  • xray 分享链接可以直接粘(vmess://、vless://…?type=ws&security=tls)。
  • 从聊天工具里粘来的链接没做 URL 编码也认(凭据里的 + / = ? #、中文口令都能解析)。
  • 所有新协议都与真服务端对测过(ws/tls/ss 用 gost,trojan/vless/vmess/ss2022 用 xray-core),
    包括 110KB 分块、域名透传、凭据错、预热连接。

明确不做(写了会报错并告诉你怎么改,不会静默降级):VLESS 的 flow / Vision、REALITY / XTLS、
grpc / kcp / quic / h2 传输、VMess 的 alterId ≠ 0、shadowsocks 的老式流密码与 none/dummy、
ss2022 的多用户(EIH)与 UDP。

四、顺手修的

  • DNS 接管自检不再误报:电脑从睡眠唤醒、或刚换过网络时,自检会把"那几秒的 DNS 空窗"
    当成"我们把 DNS 答坏了"。现在按"我们到底发过包没有"归因、失败先复测 20 秒、
    网络刚变 30 秒内跳过。
  • 「统计」卡去掉了「本次运行 / 累计」的切换(只留累计),时长改成"这组数字覆盖了多久"。
  • 若干界面文案与自检修正(上游提示里带括号的写法会让自检误判等)。

安装 / 升级

  • 包:NetHub.zip(不含任何配置与日志;把 config.yaml.example 复制成 config.yaml 填自己的上游)
  • 已经在用的:直接覆盖 nethub.exe(config.yaml 保留),或者用「设置 → 关于 → 一键更新」。
  • 回滚:nethub.exe -rollback(旧程序保留为 nethub.exe.old)。
  • 一条 exe 两种形态,别混装:有人在用的机器用 GUI(界面里开「开机自启」→ 计划任务),
    服务器 / 无人登录用服务形态(nethub.exe -service-install)。

已知边界

  • UDP(QUIC 那一类)仍然只拦下不中继:本该走链的目标上的 HTTP/3 会被拦下并记一行 quic.block,
    应用回落到 TCP(那条路仍归我们管);单条规则可勾「不拦 QUIC」放行。
  • 只能 Windows x64;IPv6 主动不做(DNS 层把 AAAA 答空防应用绕过)。

v0.7.1 —— 一键更新跟随系统代理(Clash 系统代理模式可用)

Choose a tag to compare

@Lithivm Lithivm released this 15 Oct 09:04

修掉:一键更新在「只有 Clash 系统代理」的机器上用不了

两个原因叠在一起,都是"看着像网络不稳,其实是代码":

  • 不跟随 Windows 的「系统代理」。Go 标准库探测代理时只读环境变量,不读 Internet 选项 ——
    而现场机器多半正是"只有 Clash 的系统代理能出公网"(没开 TUN、也没设环境变量)。
    于是一键更新一直在直连 github.com、10 秒超时,界面上只留一句"网络不通"。
    现在会自动跟随系统代理(含它的绕过列表);环境变量优先于系统设置;PAC 模式如实说"只能直连",不猜。
  • 匿名 GitHub API 的额度是 60 次/小时、按出口 IP 计。经 Clash 出公网的出口是共享节点,
    实测那台机器的额度已经用光、api.github.com 直接回 403 rate limit exceeded ——
    也就是"光把代理接上"仍然会随机失败。
    所以查版本改走 releases/latest 的跳转(不花配额)、包地址与 sha256 改走发布页(不花配额),
    API 只作保底。摘要拿不到时仍然 fail-closed 拒绝自动更新(不拿"来源是 GitHub"当完整性)。

失败时也会把"这次走的是哪条路"直接说出来:

查不到最新版本(连不上 github.com)。更新请求走的是:直连(系统代理没开,也没有代理环境变量)
—— 需要代理才能上外网时,请在 Clash 里打开「系统代理」后重试;也可以直接打开下载页手动取包。

排查用的新东西

nethub.exe -status 多了一行,不用打开界面就能看更新会走哪条路:

"updateProxy": "系统代理 127.0.0.1:7897"

安装 / 升级

  • 包:NetHub.zip(不含任何配置与日志;把 config.yaml.example 复制成 config.yaml 填自己的上游)
  • 已经在用 v0.6.x / v0.7.0 的:这一版请手动替换一次 —— 旧版的一键更新在"只有系统代理"的机器上
    本来就是坏的,它下不动新版本。替换一次之后,「设置 → 关于 → 检查更新 / 下载并更新」就能一直用了。
  • 回滚:nethub.exe -rollback(旧程序保留为 nethub.exe.old,一键更新出问题时用)
  • 一条 exe 两种形态,别混装:有人在用的机器用 GUI(界面里开「开机自启」→ 计划任务),
    服务器 / 无人登录用服务形态(nethub.exe -service-install)

已知边界

  • 系统代理若是 PAC(自动配置脚本) 模式:我们不跑脚本,更新请求只能直连(文案里会说清楚)。
  • Clash 那边若把 github.com 规则成 REJECT,仍然会失败 —— 那是它的规则,不是这边能绕的。

v0.7.0 —— 修服务模式下的静默失效 + 系统主题/通知

Choose a tag to compare

@Lithivm Lithivm released this 15 Oct 08:08

修掉的静默失效

  • GUI 形态下双击 exe 起不来界面:以前叫不回窗口就打印一行然后退出(GUI 子系统里那行没人看得到),
    所以双击后除了 UAC 什么都没发生 —— 没有托盘、看不到任何告警、连「接管引擎」按钮都无从点起。
    现在这种情况会自己起一个只读界面。
  • Access denied 被当成"锁不存在"(真 bug,与部署形态无关):另一个形态/其它会话建的命名锁,
    普通用户打不开(DACL 只给 SYSTEM / Administrators),代码把它当成"环境建不出锁"→
    降级成"我是后端"→ 去抢引擎、装过滤器、写 hosts,于是刷出一整屏 WinDivert / hosts 权限报错。
    现在"打不开"一律判定为"后端正在跑"。
  • 引擎在跑时 -autostart / -no-autostart / -import-bats 被静默吞掉:角色判定排在控制面命令
    之前,只要引擎在跑就在这里 return。自启延迟改了不生效就是这么来的。
  • 停止服务时无限等 SCM(现在幂等 + 20 秒超时)
  • GUI 报错没人接(现在写 logs/fatal.log,只在 stderr 没有接收者时才弹框)

新增

  • 主题「跟随系统」(默认):读 HKCU\...\Themes\Personalize\AppsUseLightTheme,1.5 秒跟随
  • 系统通知(Windows Toast):只给「内网域名可能被别的代理接管」这一条告警用
    (只在 GUI 形态下有效 —— 服务跑在 Session 0,通知到不了用户桌面)

部署形态:一条 exe 两种,按场景选,别混装

场景 形态 怎么装 自启方式
普通机器(有人登录使用) GUI 双击 nethub.exe 界面里「开机自启」开关,或 nethub.exe -autostart → 计划任务(登录后延迟启动,有托盘、有通知)
服务器 / 无人登录 headless nethub.exe -service-install Windows 服务(开机即启、无人登录也跑;无托盘、无系统通知)

两种形态不要装在同一台机器上。 服务在开机时就拿到引擎,登录后才起来的计划任务
界面版只能当"只读失败者",还会刷出一串权限报错(本版已修掉那个报错,但"谁是后端"仍只能有一个)。

  • 有人在用的机器却装了服务 → nethub.exe -service-uninstall,再装计划任务
  • 服务器 → 保持服务形态,不要装计划任务

其它

  • 性能:加了归因埋点(perf.cfg 控制,默认关闭);包循环分片默认仍为 1
  • 「接管失效」的自愈与检测已按实测结论全部撤掉 —— 根因无法复现时不动手,
    理由与排查方法留在知识库(规则/代理/接管失效的判据与处置.md)

v0.6.1 —— 顶栏实时流量图 + 日志与图标小修

Choose a tag to compare

@Lithivm Lithivm released this 14 Oct 07:04

NetHub v0.6.1

小版本:顶栏多了一张实时流量图(Clash / Proxifier 那种卷轴),另加几处界面与日志的小修。
配置格式没有任何变化,覆盖 nethub.exe 即可(用界面里的「关于 → 一键更新」也一样)。

新:顶栏实时流量图

一打开就能看到"现在到底有没有在传",不用等日志刷出来。

  • 位置在顶栏右侧(「累计 / 活跃」旁边),60 秒滚动窗口、每秒一格,下行是主色曲线(带面积)、
    上行是中性色细线,右边两行数字是此刻的速率(↑ 在上、↓ 在下)。
  • 数据由引擎每秒采样,所以界面被现场启动器杀掉、重开之后曲线不会断 —— 回来时拿到的
    还是完整 60 秒(这是把采样放在引擎进程里的原因)。
  • 纵轴按窗口峰值自适应,但以 64 KB/s 打底:否则空闲时几 KB 的噪声会被放大成"很忙"。
  • 上下行共用一根纵轴(Clash 也这样),所以上行小的时段那条线会贴着零轴 —— 以右边的数字为准。
  • 「也统计直连流量」开关影响整段窗口:关掉时曲线里过去 60 秒的直连部分也立即消失,
    与连接列表里直连行立即消失同一口径(不会"要等一分钟才退掉")。
  • 我们自己的探针(自检 / 与其它代理共存检测)不算进去 —— 否则"没人用的时候图上有几 KB 流量"。

改:日志不再被自己的探针刷屏

开机那串 proc=nethub.exe 的 intercept / relay.done 是引擎自己的探针(开界面时的共存检测),
它们本来就不进连接列表、不计累计,但日志仍按普通档逐条打,看着像"应用在连"。
现在这些只在 verbose 档出现(要看自检细节就把日志档位切上去)。

修:两处界面问题

  • 设置(齿轮)图标小到几乎看不见:顶栏加高后在图标按钮上多了一份内边距,
    把 16px 的图标挤成了 4×16px。已修,并在自检里加了断言(顶栏图标小于 14px 直接红灯)。
  • 顶栏速率数字会带着箭头一起动:数字位数一变(含归零成 —),箭头位置也跟着滑。
    现在箭头各自占一个定宽列、数字左对齐,读数改成上下两行 —— 顺带把多余的空隙收掉,
    让给曲线(曲线宽度 250px)。

升级方法

  1. 停掉正在跑的 NetHub(托盘右键退出,或 nethub.exe -quit)。
  2. 用新包里的 nethub.exe 覆盖旧的(config.yaml 不用动,别覆盖它)。
  3. 启动。若开着「开机自启」,计划任务不用重建。

驱动文件(WinDivert.dll / WinDivert64.sys)本次没有变化,但一起覆盖也无妨。


包内不含任何配置与日志(config.yaml 里有上游凭据、日志里有内网地址),
拿到包的人把 config.yaml.example 复制成 config.yaml 填自己的上游即可。

NetHub v0.6.0

Choose a tag to compare

@Lithivm Lithivm released this 14 Oct 02:36

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 原样保留。

NetHub v0.5.3

Choose a tag to compare

@Lithivm Lithivm released this 09 Oct 06:08

NetHub v0.5.3

这一版都在做同一件事:把看不见的东西变看得见 —— 连接有速率了、链路给结论了、
探测与巡检有回执了,规则目标也能照 Proxifier 的区间写法填了。

新:连接实时速率

  • 「连接」页新增速率列(出+入合计),页脚汇总显示全表速率,点开明细每条也带速率。
  • 引擎每秒采样一次(rateLoop):0 显示 —;已结束的连接不显示速率;
    自己的探针不计入(与它不进连接列表一致)。
  • 两个数字口径不同、各有各的用处:累计字节 = 一共传了多少;速率 = 此刻还在不在传
    —— 业务卡住时看的是后者(累计是正常的,之前传完了)。

新:规则目标支持 IP 区间(沿用 Proxifier 的写法)

  • 10.1.1.1-10.1.1.255 这类写法填进目标框就会被接受,读入/保存时展开成网段(写回配置也是 CIDR)。
  • 精确覆盖:10.1.1.1-10.1.1.255 展开成 8 条网段,不会顺手把 .0 也吞进来
    (那是把用户没写的地址一起接管,方向错了);整段写法 10.1.1.0-10.1.1.255 自然并成一条 /24。
  • 横线两边带空格、以及文档自动排版出来的 en dash 都认;带横线的域名(main-1.his.com)不受影响。

新:链路检测给结论(诊断页「链路自检」卡)

  • 卡顶一句话结论 + 该做什么;逐条链一句话折叠着;「复制结果」复制出去的报告以结论开头
    ——现场是把这段整段粘给同事的,一串逐条结果没有结论,读的人得自己总结,而那最容易读错。
  • 关键设计:把「连不上上游」与「上游通了但到不了内网目标」分开说。后者责任在上游那一侧的内网
    (路由/访问策略),不在本机 —— 现场最常见的误判就是看到“上游可用”就去查本机,查一天。
  • 「凭据被拒」是单独一档(不是网络问题,是口令/账号不对),它靠一个错误身份来区分,
    不是比对错误文案。
  • 判据是纯函数(engine.ChainVerdict),九档都有测试钉住。

改:探测与巡检都有回执了(以前是"点了没反应")

  • 链路页:正在探的链显示「探测中…」(琥珀点),与"待探测"分开;
    点「立即探测」按钮立刻变「探测中…」并禁用,旁边一句 "自动完成,不必再点";
    探测期间这一页刷新加密到 800ms,切进来 1~2 秒就能看到结果(以前要等最多 5 秒)。
  • 诊断页「业务目标巡检」:同一套 —— 按钮「巡检中…」、卡片头「正在巡检 N 个业务目标(自动完成,不必再点)」;
    正在巡检时不再显示"还没有可以巡检的目标"(两者在空表上长得一模一样,
    而前者说“再等一秒”、后者说“去干别的”,用户会直接走掉)。
  • 关掉自动探测的链显示「探测已关」,不再永远卡在"待探测"。
  • 已经有结果时不会因为"正在刷新"把旧结果抢掉(否则每 30 秒闪一下)。

其它

  • 手动巡检在日志里留一行 patrol.now: by=ui targets=N(巡检会向上游与业务发真实连接,
    事后翻到一串 target.* 要能对上是"谁点的")。
  • 窗口最小宽度 880 → 980(连接表多了一列「速率」)。
  • README.md、config.yaml.example 与界面上的「i」说明同步更新。

资产:NetHub.zip(Windows x64,单文件 exe + WinDivert + 说明)
校验:见本次 release 附件的 SHA256 与发版记录。
升级:解压覆盖 nethub.exe(配置与日志在同目录,不动),重启即可。

v0.5.2 — 日志分三档、诊断页「接管状态」卡、连接按目标合并

Choose a tag to compare

@Lithivm Lithivm released this 09 Oct 02:04

NetHub v0.5.2

看得见的部分基本重做了一遍:日志分三档、诊断页多了**「接管状态」仪表盘**、连接列表按目标合并,
并且把「我们自己发的探针」从统计与列表里摘了出去。

新:日志分三档(normal / verbose / debug)

照抄 Proxifier 的 Normal / Verbose / Debug,运行日志页右上滑块切换,即时生效、不用重启:

  • normal(默认)—— 现场面:连接开/关、启停、链与目标状态翻转、错误。
  • verbose —— 判定面:多出每条连接为什么这么走(route.match)、DNS 请求与应答、
    名字学习、内置直连逐目标。排查“某个目标为什么没走隧道”就切它。
  • debug —— 内部面:名字表 / 假 IP 池维护、内核层开关、进程表查询失败、规则表编译结果、
    内核过滤器原文。

切到 debug 会立刻转储一份当前内部状态(规则表、过滤器原文、名字表、假 IP 池、连接表、
内核层句柄)—— 那些内容本来只在启动那一刻写,错过就只能重启(而重启会断业务连接)。

新:诊断页「接管状态」卡

一眼看全三个面,是仪表盘不是日志(只有当前值、原地更新,没有时间戳流水):

  • 内核面(拦截与过滤器在不在、内核过滤器原文)
  • 域名面(通配与 DNS 接管、名字表规模)
  • 连接面(累计 / 进行中 / 进程名解析率)

带异常判据:有值得注意的地方会直接给出结论条,不用自己去对数字。卡上的「i」有完整口径说明。

改:连接列表

  • 同目标、同进程的并行连接合并成一行(×N),点开看每一条(本地端口 / 开始时间 / 时长 /
    收发字节 / 包数 / 状态 / 命中的规则 / 错误全文)。一个页面就会对同一 origin 开 6 条 TCP,
    逐条铺开反而看不出“这是一次页面加载”。
  • 最多显示 5 条,更多的在卡片内上下滚动;表头固定。
  • 已结束的连接只保留 15 秒(后台统计不受影响)。
  • 「活跃」与列表一致(含直连与阻断的进行中行);「累计 / 各链累计」仍只算走隧道的 ——
    两个口径都写在列表的「i」里。
  • 开关改完立刻同步:直连流量统计 / QUIC 阻断 改完,列表与接管状态卡立即重画;
    关掉直连统计时,那些靠它才可见的直连条目立刻从列表消失。
  • 修:连接表只剩表头(一行渲染异常会中断整表;v0.5.0 把进程名解析率从 60% 修到 0% 之后
    几乎每条都命中那条分支,于是从“偶尔少几行”变成“基本只剩表头”)。

修:本程序自己的探针不再冒充应用流量

启动时自检、与其它代理(Clash)共存检测会直接 dial 内网目标,那些地址本来就在我们的
接管网段里 → 被自己的过滤器接住 → 连接列表里冒出几条 nethub.exe 的连接,还会被算进“累计接管”。
现在这些探针在 connect 之前就把本地端口登记为“自己人”:不进列表、不计累计、不计进程名解析率
(日志里仍有它们的行——那是真实连接,只是不再冒充应用流量)。

删

  • 「导出诊断包」按钮与相关代码去掉:它的唯一独有价值(内核过滤器原文等现场材料)已被
    “切到 debug 档即转储”覆盖,要交材料就发 logs/nethub.log。

其它

  • 「i」说明共 9 处,文案统一改报告口径(不写口语、不带 markdown 标记)。
  • 诊断页「名字面」改称「域名面」,与「内核面 / 连接面」对齐。

资产:NetHub.zip(Windows x64,单文件 exe + WinDivert + 说明)
校验:见本次 release 附件的 SHA256 与发版记录。
升级:解压覆盖 nethub.exe(配置与日志在同目录,不动),重启即可。