连接您的应用
端口打开后,将任何支持代理的工具指向它即可。本页展示代理地址格式,以及适用于浏览器、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。
- 在打开端口对话框中选择“MTProto”预设,或选择 mtproto 协议。
- 打开对话框标题栏中的“高级”开关——否则 MTProto 分区不会显示。将密钥留空以便应用生成新的,或按规范的 ee… 形式填入您自己的密钥。
- 打开端口。响应中会包含现成的 tg://proxy?server=…&port=…&secret=… 链接——在装有 Telegram 的设备上打开它即可。
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。
- npm 上的 n8n-nodes-blanktrail通过 Community nodes 安装,以及节点的操作列表
- GitHub 上的节点源码节点的实现方式及其调用的 API
常见连接问题
- 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 入口 → 检查入口):应答会表明问题出在证书、令牌还是浏览器。