连接您的应用

端口打开后,将任何支持代理的工具指向它即可。本页展示代理地址格式,以及适用于浏览器、curl 和代码的即用型示例。

代理地址

每个打开的端口都是本机上的一个标准代理。使用运行 BlankTrail Proxy 的主机(本地安装时为 127.0.0.1)以及控制面板中显示的端口号。每个端口在打开时被设置为 SOCKS5 或 HTTP。

socks5://127.0.0.1:20134
http://127.0.0.1:20250
提示概览标签页在每个端口上都有一键复制按钮,可为您复制完整的代理地址。

完全不支持代理的应用无处填写端口。为此提供了拦截功能:所选程序的流量由系统改道至端口,配置文件对其作用完全相同——参见 控制面板 → 系统流量拦截。

信任根证书

为使 HTTPS 正常工作而不报错,设备或工具必须信任 BlankTrail Proxy 的根证书(参见 安装 → 根证书)。某些 HTTP 客户端允许您直接指向证书文件,而无需在系统范围内安装。

浏览器与反检测浏览器

将该端口设置为浏览器的 HTTP/SOCKS 代理(或在反检测浏览器中,设置为某个配置文件的上游代理)。若要驱动真实浏览器,请使用“浏览器”预设打开端口,以便匹配并规范化其指纹。

它可作为一个即插即用的本地代理,适用于 ZennoPoster、BAS、Puppeteer、Playwright、Selenium 以及任何支持 HTTP/HTTPS 或 SOCKS5 代理的工具,无需修改脚本代码。

端口 DoH 入口

通过代理,浏览器把网站域名交给端口,由端口的解析器经与流量相同的出口进行解析。但有些域名浏览器会绕过代理自行解析:WebRTC 的 STUN 和 TURN 服务器域名、ICE 候选中的域名,以及浏览器自身服务的请求。这些查询会交给您电脑的 DNS,检测方可以从中发现您真实的解析器或子网。DoH 入口可以堵住这一泄露:端口本身提供 DNS-over-HTTPS,指向它的浏览器会用与端口流量相同的解析器解析其所有域名。

  • 入口默认关闭。仪表板中的“浏览器”预设会同时开启它和 HTTP/3。通过 API:打开端口时或在 PUT /api/v1/port/{port}/config 中设置 doh: true,或在打开端口时使用 preset: browser(参见 API — 端口与流量 → 打开端口)。
  • 入口地址即端口卡片(“DoH 地址”)和 GET /api/v1/ports 中的 doh_url。其主机为本机的外部地址:设置中的“本机的外部地址”字段(在 Docker 中为 BT_PUBLIC_HOST 变量),否则为打开仪表板时所用的 IP,否则为开启局域网访问期间本机自行检测到的公网地址;以上都没有时为 127.0.0.1。入口证书包含上述所有地址、连接所到达的地址,对于来自私有网络的客户端还包含其 /24 网段中的每个地址——因此在 Docker 的 NAT 或路由器之后无需再做其他设置。
  • 入口证书由与经端口访问 HTTPS 相同的 BlankTrail Proxy 根证书(CA)签发,因此客户端必须信任它(参见信任根证书)。不信任时入口无法建立连接,在安全模式下这些域名将无法解析:不会泄露,但也得不到应答。
  • 入口是否在工作,可以看端口卡片中的“DoH 查询数”计数器(doh_queries):浏览器访问网站后它会增长。为零说明浏览器没有使用 DoH(见下方限制)。

ZennoPoster

在项目的 C# 动作中,一次调用同时设置代理和 DoH。NetworkSettings 仅对 Chromium 浏览器生效;true 表示开启安全模式,不回退到系统 DNS。

instance.SetProxy(new ProxySettings("http://127.0.0.1:20250"),
    new NetworkSettings(true, "https://127.0.0.1:20250/dns-query"));

重置 DoH:instance.SetProxy(null, new NetworkSettings())。

Chrome 与 Chromium

在 Chrome 的安全设置中开启“使用安全 DNS”,选择自定义提供商并填入入口地址。即使 Chrome 已将该端口设为代理,它仍会绕过代理直接发送 DoH 请求,无需额外设置。

基于 Chromium 的反检测浏览器可能有所不同:它们通过配置文件的代理——也就是同一个端口——发送 DoH。端口会识别这种指向自身 DoH 入口的隧道并直接应答,无需任何设置,代理日志会记录每条这样的隧道。在 1.3.13 及更早的版本中,这类请求会被拒绝:日志中出现带有入口地址的“leak-guard: blocked private target”行,浏览器也会拒绝该 DoH 地址(“Please verify…”)。在更新之前,请在浏览器配置文件中关闭安全 DNS:设置了代理时,网站域名本来就由端口解析。

在受管理的机器上,请用策略设置同样的内容:

DnsOverHttpsMode = secure
DnsOverHttpsTemplates = https://127.0.0.1:20250/dns-query

Firefox

在 about:config 中设置三个参数。模式 3 表示仅使用 DoH,不回退到系统 DNS;第三个参数让 Firefox 信任系统根证书(BlankTrail Proxy 的 CA 已安装在其中),也可以手动将 CA 导入 Firefox。

network.trr.mode = 3
network.trr.uri = https://127.0.0.1:20250/dns-query
security.enterprise_roots.enabled = true

curl

curl 可以自行发起 DoH 查询。下面的命令通过端口解析域名(doh_queries 会增长),随后直接连接网站:这只是检查入口,并不经代理转发流量。

curl --doh-url https://127.0.0.1:20250/dns-query https://example.com

Windows 版 curl 使用系统证书库中的根证书,BlankTrail Proxy 的 CA 已安装在其中。在 Linux 和 macOS 上,--cacert 同时作用于 DoH 请求和网站本身,因此进行此项检查时请将 CA 加入系统证书库。

macOS

  • “本地网络”,macOS 15 Sequoia 及更新版本:浏览器只有在“系统设置 → 隐私与安全性 → 本地网络”中获得许可后,才能访问您本地网络中的地址。没有该许可时,Chrome 在保存 DoH 地址时会提示“Please verify that this is a valid provider”,在安全模式下网站无法打开,而终端中的 curl 却能连通。许可按应用分别授予:Chrome 和反检测浏览器的内核(例如 AdsPower 中的 SunBrowser)各需一份。macOS 14 Sonoma 及更早版本没有这一项,无需任何操作;远程服务器的公网地址在任何版本中都不需要该许可。
  • 系统代理:如果浏览器经由 macOS 系统代理上网(“系统设置 → 网络 → 连接 → 详细信息 → 代理”),请同时开启“网页代理 (HTTP)”和“安全网页代理 (HTTPS)”,或使用 SOCKS 代理。只开启 HTTP 时,HTTPS 网站会直接打开:网站看到的是您的真实地址,而域名却经由端口的 DoH 解析,检测方会报告客户端子网与连接地址相矛盾。Chrome 实际使用的代理可在 chrome://net-internals/#proxy 查看。
  • 基于 UDP 的 WebRTC 同样会绕过系统代理——参见下方关于 UDP 的限制。

检查入口

如果浏览器拒绝该地址,请在同一台电脑上绕过代理直接询问入口。对于带登录的端口,请使用端口卡片中带令牌的地址;blanktrail-ca.pem 为根证书(参见信任根证书)。

curl -v --noproxy "*" --cacert blanktrail-ca.pem "https://地址:端口/dns-query?dns=AAABAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE"
  • 证书校验错误(例如“unable to get local issuer certificate”)——根证书未被信任,或 --cacert 指向了别的文件。
  • “no alternative certificate subject name matches target host name”——该地址不在入口证书中:请填写“本机的外部地址”字段,或通过该 IP 打开仪表板(1.3.12 之前的版本——见限制)。
  • HTTP 401——端口启用了登录,而地址中没有令牌:请重新从端口卡片复制 doh_url。
  • HTTP 200 且 content-type: application/dns-message——入口正常;问题在浏览器:其策略(chrome://net-internals/#dns)、其代理,以及在 macOS 15 及更新版本中的“本地网络”许可。

限制

  • 带登录的端口(设置中的代理鉴权):浏览器不会向 DoH 服务器发送登录信息,因此此时 doh_url 以令牌结尾——https://地址:端口/dns-query/令牌。令牌由用户名和密码推导,随密码一起变化:请重新从端口卡片复制地址。入口同样接受登录本身(Authorization 或 Proxy-Authorization 头,Basic 方案),供能够发送它的客户端使用。
  • 1.3.12 之前的版本:没有令牌,因此在带登录的端口上 Chromium 和 ZennoPoster 不会使用 DoH;对于用 IP 而非主机名的地址,证书只包含连接所到达的地址——在 Docker 的 NAT 之后那是容器的地址,Chrome 会提示“Please verify that this is a valid provider”。此类版本的变通办法是在 DoH 地址中用主机名代替 IP:证书随后会为该名称签发。
  • 如果机器上存在任何 Chrome 策略或计算机已加入域,Chromium 会静默关闭在设置中配置的 DoH:域名又会交给系统 DNS。表现为 doh_queries 不增长;DNS 模式可在 chrome://net-internals/#dns 页面查看。此时请通过策略设置 DoH。
  • DoH 能堵住 DNS 泄露,但管不了 UDP:基于 UDP 的 STUN 请求会绕过代理。对此请使用 ZennoPoster 的 WebRTC 模拟(ProxySettings 中的 emulateWebrtc)或 Chrome 策略 WebRtcIPHandling = disable_non_proxied_udp。
  • 向局域网开放或在 Docker 中运行的端口会为所有能访问到它的人应答 DoH,也就是成为经其出口的解析器。
  • 每个查询的应答时限为 6 秒;显式选择的解析策略(isp、exit、pool、custom)最长为 10 秒。解析器未能按时应答时返回 SERVFAIL;不在套餐域名列表中的域名返回 REFUSED。

curl

curl -x socks5://127.0.0.1:20134 https://example.com
curl -x http://127.0.0.1:20250 https://example.com

代码示例

Python (requests)

import requests

proxies = {
    "http": "socks5://127.0.0.1:20134",
    "https": "socks5://127.0.0.1:20134",
}
r = requests.get("https://example.com", proxies=proxies)
print(r.status_code)

Node.js (undici)

import { ProxyAgent, request } from 'undici'

const agent = new ProxyAgent('http://127.0.0.1:20250')
const { statusCode } = await request('https://example.com', { dispatcher: agent })
console.log(statusCode)

Telegram(MTProto)

Telegram 客户端无法通过普通的指纹伪装代理——它使用自有协议。为它打开一个使用 MTProto 协议的端口:从外部看这就是普通的 Telegram 代理,而伪装会让连接看起来像是访问某个无关站点的 TLS。

  1. 在打开端口对话框中选择“MTProto”预设,或选择 mtproto 协议。
  2. 打开对话框标题栏中的“高级”开关——否则 MTProto 分区不会显示。将密钥留空以便应用生成新的,或按规范的 ee… 形式填入您自己的密钥。
  3. 打开端口。响应中会包含现成的 tg://proxy?server=…&port=…&secret=… 链接——在装有 Telegram 的设备上打开它即可。
打开 MTProto 端口
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"port":20443,"protocol":"mtproto",
       "mtproto_camouflage_domain":"www.google.com"}' \
  http://127.0.0.1:8891/api/v1/ports/open
响应
{
  "port": 20443,
  "protocol": "mtproto",
  "status": "opened",
  "tg_link": "tg://proxy?server=203.0.113.10&port=20443&secret=ee…",
  "mtproto_secret": "ee…"
}
  • 伪装域名同时也是客户端提供的 SNI:默认是 www.google.com。从网络角度看,该连接就像是对该站点的普通访问。
  • 对探测者或密钥错误的客户端,端口默认会把连接转接到真实的伪装站点,而不是直接断开:断开本身就会暴露此处存在代理。
  • 若上游出口本身就是 MTProto 代理,faketls 出口模式会让端口以伪 TLS 与其通信;auto 自动选择,obfuscated 为普通混淆。
  • MTProto 端口不是 HTTP 代理:不能把它配置给浏览器或 curl,TLS 指纹伪装也不适用于它。

n8n

n8n 有现成节点:n8n-nodes-blanktrail 包可在“Settings → Community nodes”中从 npm 安装。该节点开启端口、选择浏览器配置文件与路由,并把代理地址交给流程的下一步——无需自写 HTTP 代码,也无需手动调用 API。

提示如果 BlankTrail 与 n8n 都运行在容器中,请将它们放在同一 Docker 网络内,并按容器名而非 127.0.0.1 访问代理——在 n8n 容器内,该地址指向容器自身。

常见连接问题

  • HTTPS 上出现证书错误 —— 该设备未信任证书。请安装它(安装 → 根证书)。
  • 连接被拒绝 —— 端口未打开,或您使用了错误的主机/端口。请检查概览标签页。
  • 协议错误 —— SOCKS5 端口不会接受 HTTP 代理设置,反之亦然。请匹配端口上显示的协议。
  • 代理鉴权被拒——端口要求用户名与密码,而地址中没有。请写完整地址:socks5://用户名:密码@127.0.0.1:20134。在推荐的 Docker 启动命令中,密码是默认设置的。
  • 端口曾经存在却消失了——无流量的端口会在 30 分钟后自行关闭,计时从打开那一刻开始。可为该端口设置自己的时长(PUT /api/v1/port/{port}/idle,请求体 {"seconds": 0}),或把它列入 portmanager.startup_ports。
  • 一切正常但站点仍能识破客户端——请检查该端口是否启用了 TLS 直通:启用后对外发送的是您自己应用的指纹,而不是所选的配置文件。
  • Chrome 对 DoH 地址提示“Please verify that this is a valid provider”——请用 curl 检查入口(端口 DoH 入口 → 检查入口):应答会表明问题出在证书、令牌还是浏览器。