系统流量拦截

如何在不为应用配置代理的情况下,将某个程序或整台机器的流量引入端口:特权服务、其安装、托盘管理与 API 字段。

什么是流量拦截

BlankTrail Proxy 的普通端口是代理:应用必须知道它的地址并会使用它。流量拦截解决相反的问题——由操作系统把流量引到端口,应用侧无需任何设置。完全没有代理设置的程序就是这样接入的。

这需要一个特权 Windows 服务:产品本身以普通权限运行,无法更改本机路由。该服务名为 BlankTrailNetHelper,单独安装,并从托盘菜单管理。

警告默认拦截范围是整台系统,而不是所选程序。开启 intercept 而未显式指定 intercept_scope 的端口会接管本机全部流量,包括远程桌面和管理工具。若只需个别程序,请显式设置 scope 为 "process"。

该服务对系统做了什么

在没有端口请求拦截时,服务不做任何更改:它已注册并处于等待状态。只有当带拦截的端口打开时才会产生更改,端口关闭后即撤销。

  • 启用虚拟网卡(Wintun 驱动)并为其分配地址。
  • 添加两条路由——0.0.0.0/1 与 128.0.0.0/1。二者共同覆盖默认路由但不删除它:原有路由保持不变,拦截撤销后立即恢复生效。
  • 在该网卡上声明自己的 DNS 解析器。否则即使流量通过代理出口,域名仍会被您的运营商看到。
警告路由捕获只覆盖 IPv4。若本机拥有有效的全局 IPv6 地址(通常由运营商或家用路由器下发),服务会完全拒绝捕获——system 与 process 两种范围都一样,而且在改动网络之前就已拒绝。表现为:端口会打开,但拦截并未生效;端口卡片中的 intercept_state 变为 degraded,intercept_reason 会直接说明原因。解决办法是在本机网卡上关闭 IPv6,而不是重装服务、切换账户或重装产品。出于同样的原因,泄漏审计也会以 ipv6_present 代码拒绝启动。
注意该服务同一时间只服务一个产品实例。若同时运行两个 BlankTrail Proxy,第二个会收到 busy 错误——这不是与第三方 VPN 或杀毒软件冲突,而是您自己的第二个实例。请关闭多余的实例。

只有安装本产品时所用的 Windows 账户才能控制拦截:服务控制通道对该所有者、管理员和 SYSTEM 开放。在有多个账户的机器上,另一个用户会看到“服务无响应”,尽管服务正在运行。

服务何时安装

  1. 安装过程中,任务页面提供“系统级流量拦截”选项。它会注册该服务。
  2. 该选项仅在“为所有用户安装”时可见。按用户安装时完全不显示——这是有意为之:安装到个人目录的产品位于您可写的位置,把 SYSTEM 自启服务指向那里将成为提权途径。
  3. 注册需要管理员确认。拒绝不会中断安装,只是拦截保持不可用——之后可从托盘菜单安装该服务。
注意升级时,若此前已安装,服务会自动重新注册——否则每次更新后拦截都会悄然失效。卸载产品时会一并移除。
  • 升级时,若此前已安装,该服务会重新注册——即使未改动该复选框。
  • 卸载产品时,移除该服务会在单独的窗口中请求管理员权限。若拒绝,产品会被卸载而服务仍留在系统中——之后可以重新安装产品并在确认的情况下卸载来移除它。

🔴 在管理员安装模式下,该选项默认已勾选:管理员只要一路点击“下一步”就会注册该服务。若不想安装,需要手动取消勾选——这不会中断安装,只是拦截功能在从托盘菜单安装该服务之前保持不可用。

从托盘管理

托盘图标菜单中有“TUN helper”分组。其标题显示服务状态,子项显示该状态下有意义的操作。状态每三秒刷新一次,因此在外部停止或启动的服务菜单会自行察觉。

状态含义可用操作
未安装系统中没有该服务。安装
已停止服务已注册但未运行。启动
运行中服务已就绪,可接受拦截规则。停止、重启
已暂停服务已被服务管理器暂停。停止、重启
正在启动 / 正在停止过渡状态:请求已被接受,管理器正在执行。无——请等待完成。
状态未知服务管理器未响应。通常表示查询失败,而不是服务不存在。无。
警告四个操作都会提权:Windows 会弹出管理员确认。关闭该提示则不会发生任何事,也不会报错——菜单保持原样,服务不会启动。这是预期行为:拒绝提权不算故障。

谁可以控制拦截

该服务的控制通道对 SYSTEM、机器管理员以及安装该服务时所使用的账户开放。所有者在注册服务时被记录下来。

警告由此在多账户机器与终端服务器上会产生一个不明显的后果:第二个用户启动同一产品时会看到“服务无响应”(代码 unreachable),尽管服务正在运行并听命于第一个用户。解决办法是从所需账户重新安装该服务——即托盘“TUN helper”分组中的“安装”项。

两种拦截范围

范围哪些流量进入端口限制
system本机全部流量。这是默认值。同一时间只能有一个端口占用该范围:第二个端口会被拒绝,提示“系统拦截已被其他端口占用”。
process仅列出程序的流量(intercept_apps——可执行文件路径)。一个程序只能被一个端口拦截。此模式下没有出口看门狗:出口消失时受影响的是单个应用,而非整台机器。
注意对站点证书做固定校验(certificate pinning)的应用在按进程拦截的端口上将无法工作:这类端口在本地终止 TLS 并重新发起连接。这是设计使然,并非故障。

带拦截的端口

这类端口不作为代理监听:外部无法连接其端口号,隧道是唯一入口。手动将应用指向该代理地址会连接失败;反之,保留的代理设置会让应用绕过拦截。

已打开的端口无法开启、关闭或重新配置拦截——此类请求返回 400。请关闭端口并使用所需字段重新打开。

端口状态含义
active规则已被服务接受,流量正在进入端口。
degraded端口已打开,但拦截规则未生效:实际上没有进行拦截。最常见的原因是本机存在有效的全局 IPv6:捕获只覆盖 IPv4,此时会完全拒绝。其次是服务不可达或被占用。确切原因由 intercept_reason 字段给出。
released规则已撤销——例如端口正在关闭。
注意若出口连续十分钟不可用,看门狗会自行撤销拦截并把流量交还系统:否则出口丢失就意味着机器断网。空闲机器上探测较稀疏,因此实际撤销最长需十五分钟。按进程模式下没有看门狗。

通过 API 使用拦截

可用性通过 GET /api/v1/system/intercept 查询,process 范围所需的程序列表通过 GET /api/v1/system/processes 获取;两者的完整字段与示例见 API 参考。

code 字段面向程序,不会变化;reason 面向用户,可能变化。code 的取值如下:

code发生了什么该怎么做
off此版本或平台不支持拦截。拦截功能在 Windows 上可用。
not_installed服务管理器答复该服务不存在。从托盘“TUN helper”分组安装,或为所有用户重新安装产品。
unreachable服务在控制通道上无响应。请确认服务正在运行,且您使用的是安装产品时所用的账户。
busy服务正常,但控制通道已被产品的另一个实例占用。关闭第二个 BlankTrail Proxy 实例。

拦截本身在打开端口时启用,由 POST /api/v1/ports/open 请求体中的三个字段控制:

参数类型必填说明
interceptbool为该端口启用拦截。默认关闭。
intercept_scopestring“system”——本机全部流量;“process”——仅列出的程序。留空等同于“system”。
intercept_appsstring[]process 范围下的可执行文件路径。
示例(curl)
curl -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"port":8080,"intercept":true,"intercept_scope":"process",
        "intercept_apps":["C:/Program Files/MyApp/app.exe"]}' \
  http://127.0.0.1:8891/api/v1/ports/open

端口卡片(GET /api/v1/ports)返回相同字段,另加 intercept_state 与 intercept_reason——规则状态,以及未生效时的原因。