系统流量拦截
如何在不为应用配置代理的情况下,将某个程序或整台机器的流量引入端口:特权服务、其安装、托盘管理与 API 字段。
什么是流量拦截
BlankTrail Proxy 的普通端口是代理:应用必须知道它的地址并会使用它。流量拦截解决相反的问题——由操作系统把流量引到端口,应用侧无需任何设置。完全没有代理设置的程序就是这样接入的。
这需要一个特权 Windows 服务:产品本身以普通权限运行,无法更改本机路由。该服务名为 BlankTrailNetHelper,单独安装,并从托盘菜单管理。
该服务对系统做了什么
在没有端口请求拦截时,服务不做任何更改:它已注册并处于等待状态。只有当带拦截的端口打开时才会产生更改,端口关闭后即撤销。
- 启用虚拟网卡(Wintun 驱动)并为其分配地址。
- 添加两条路由——0.0.0.0/1 与 128.0.0.0/1。二者共同覆盖默认路由但不删除它:原有路由保持不变,拦截撤销后立即恢复生效。
- 在该网卡上声明自己的 DNS 解析器。否则即使流量通过代理出口,域名仍会被您的运营商看到。
只有安装本产品时所用的 Windows 账户才能控制拦截:服务控制通道对该所有者、管理员和 SYSTEM 开放。在有多个账户的机器上,另一个用户会看到“服务无响应”,尽管服务正在运行。
服务何时安装
- 安装过程中,任务页面提供“系统级流量拦截”选项。它会注册该服务。
- 该选项仅在“为所有用户安装”时可见。按用户安装时完全不显示——这是有意为之:安装到个人目录的产品位于您可写的位置,把 SYSTEM 自启服务指向那里将成为提权途径。
- 注册需要管理员确认。拒绝不会中断安装,只是拦截保持不可用——之后可从托盘菜单安装该服务。
- 升级时,若此前已安装,该服务会重新注册——即使未改动该复选框。
- 卸载产品时,移除该服务会在单独的窗口中请求管理员权限。若拒绝,产品会被卸载而服务仍留在系统中——之后可以重新安装产品并在确认的情况下卸载来移除它。
🔴 在管理员安装模式下,该选项默认已勾选:管理员只要一路点击“下一步”就会注册该服务。若不想安装,需要手动取消勾选——这不会中断安装,只是拦截功能在从托盘菜单安装该服务之前保持不可用。
从托盘管理
托盘图标菜单中有“TUN helper”分组。其标题显示服务状态,子项显示该状态下有意义的操作。状态每三秒刷新一次,因此在外部停止或启动的服务菜单会自行察觉。
| 状态 | 含义 | 可用操作 |
|---|---|---|
| 未安装 | 系统中没有该服务。 | 安装 |
| 已停止 | 服务已注册但未运行。 | 启动 |
| 运行中 | 服务已就绪,可接受拦截规则。 | 停止、重启 |
| 已暂停 | 服务已被服务管理器暂停。 | 停止、重启 |
| 正在启动 / 正在停止 | 过渡状态:请求已被接受,管理器正在执行。 | 无——请等待完成。 |
| 状态未知 | 服务管理器未响应。通常表示查询失败,而不是服务不存在。 | 无。 |
谁可以控制拦截
该服务的控制通道对 SYSTEM、机器管理员以及安装该服务时所使用的账户开放。所有者在注册服务时被记录下来。
两种拦截范围
| 范围 | 哪些流量进入端口 | 限制 |
|---|---|---|
system | 本机全部流量。这是默认值。 | 同一时间只能有一个端口占用该范围:第二个端口会被拒绝,提示“系统拦截已被其他端口占用”。 |
process | 仅列出程序的流量(intercept_apps——可执行文件路径)。 | 一个程序只能被一个端口拦截。此模式下没有出口看门狗:出口消失时受影响的是单个应用,而非整台机器。 |
带拦截的端口
这类端口不作为代理监听:外部无法连接其端口号,隧道是唯一入口。手动将应用指向该代理地址会连接失败;反之,保留的代理设置会让应用绕过拦截。
已打开的端口无法开启、关闭或重新配置拦截——此类请求返回 400。请关闭端口并使用所需字段重新打开。
| 端口状态 | 含义 |
|---|---|
active | 规则已被服务接受,流量正在进入端口。 |
degraded | 端口已打开,但拦截规则未生效:实际上没有进行拦截。最常见的原因是本机存在有效的全局 IPv6:捕获只覆盖 IPv4,此时会完全拒绝。其次是服务不可达或被占用。确切原因由 intercept_reason 字段给出。 |
released | 规则已撤销——例如端口正在关闭。 |
通过 API 使用拦截
可用性通过 GET /api/v1/system/intercept 查询,process 范围所需的程序列表通过 GET /api/v1/system/processes 获取;两者的完整字段与示例见 API 参考。
- API 参考——端口与流量两个系统接口的卡片以及全部端口开启字段。
code 字段面向程序,不会变化;reason 面向用户,可能变化。code 的取值如下:
| code | 发生了什么 | 该怎么做 |
|---|---|---|
off | 此版本或平台不支持拦截。 | 拦截功能在 Windows 上可用。 |
not_installed | 服务管理器答复该服务不存在。 | 从托盘“TUN helper”分组安装,或为所有用户重新安装产品。 |
unreachable | 服务在控制通道上无响应。 | 请确认服务正在运行,且您使用的是安装产品时所用的账户。 |
busy | 服务正常,但控制通道已被产品的另一个实例占用。 | 关闭第二个 BlankTrail Proxy 实例。 |
拦截本身在打开端口时启用,由 POST /api/v1/ports/open 请求体中的三个字段控制:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
intercept | bool | 否 | 为该端口启用拦截。默认关闭。 |
intercept_scope | string | 否 | “system”——本机全部流量;“process”——仅列出的程序。留空等同于“system”。 |
intercept_apps | string[] | 否 | process 范围下的可执行文件路径。 |
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——规则状态,以及未生效时的原因。