使用 BotBrowser 防止 DNS 泄漏
介绍如何使用 `--bot-local-dns` 标志让 BotBrowser 在本地解析 DNS,防止 DNS 泄漏并保护浏览隐私。
介绍
当你使用代理来保护浏览身份时,通常期望所有流量都通过该代理。但 DNS 查询常常走不同路径。在浏览器通过代理连接网站之前,需要先将域名解析为 IP 地址。如果该 DNS 查询发送到了你的 ISP 的解析器而不是通过代理转发,ISP 就能看到你访问的每个域名。这就是 DNS 泄漏,也是基于代理的隐私方案失败的常见原因之一。
BotBrowser 在浏览器内核层面解决 DNS 泄漏问题:使用 --bot-local-dns 标志启用内置的本地 DNS 解析器,使解析受你控制。
隐私影响
DNS 泄漏会从多个方面破坏代理隐私。ISP 的 DNS 解析器会记录你解析的每个域名,从而生成完整的浏览记录;即便所有 HTTP/HTTPS 流量都通过代理,ISP 仍能看到域名、请求时间与你的真实 IP。
此外,DNS 查询还会暴露你的地理位置,因为解析器通常是区域性的。如果你使用德国的代理但 DNS 查询落到了弗吉尼亚的解析器,地理不一致会很明显。追踪系统可据此将解析器位置与报告的 IP 做关联,从而识别异常。
DNS 泄漏还可能通过不太显眼的路径发生:DNS 预取可在你点击之前解析域名;WebRTC 可能触发来自代理路径之外的 DNS 查找;某些代理配置只保护 TCP 流量,但对基于 UDP 的 DNS 查询无保护。
BotBrowser 在引擎级别的 DNS 控制同时封堵了这些路径。
技术背景
浏览器中的 DNS 解析如何工作
当你访问 https://example.com 时,浏览器必须先将 example.com 解析为 IP 地址,然后才能建立连接。典型的解析流程如下:
- 浏览器检查其内部 DNS 缓存
- 若未命中,查询操作系统的 DNS 解析器
- 操作系统解析器检查其缓存,然后将查询转发到配置的 DNS 服务器(通常为 ISP)
- DNS 服务器返回 IP 地址
在配置代理时,理想的行为取决于代理协议:
- SOCKS5H:浏览器将主机名直接发送到代理,由代理处理 DNS 解析。不会产生本地 DNS 查询。
- SOCKS5:浏览器在本地解析 DNS,然后将解析得到的 IP 发送给代理。此情形会发生 DNS 泄漏。
- HTTP CONNECT:浏览器在 CONNECT 请求中将主机名传给代理,DNS 解析行为取决于具体实现。
DNS 预取与推测性解析
现代浏览器会积极预取 DNS 以降低延迟。当页面包含链接时,浏览器可能在你点击之前就解析这些域名。此类预取发生在浏览器引擎层面,并且在某些配置下可能不会遵循代理设置。
类似地,浏览器会对地址栏中输入的域名进行推测性解析,这些查询默认通过操作系统解析器发出,形成难以仅凭代理设置封堵的泄漏路径。
代理提供商 DNS 的问题
即便 DNS 查询通过代理(例如 SOCKS5H),代理提供商的 DNS 行为也可能不理想:
- 提供商可能使用与代理地理位置不匹配的解析器
- 响应可能被缓存或重写
- 提供商可能基于策略阻止某些域名
- 不同提供商对 DoH/DoT 的支持不同
常见方法及其局限
使用 SOCKS5H 替代 SOCKS5
将 socks5:// 切换为 socks5h:// 会指示浏览器将主机名发送到代理进行解析,而不是本地解析。这是一个良好的第一步,但存在局限:
- DNS 预取可能仍使用本地解析器进行推测性查找
- 代理提供商的 DNS 行为并不在你的控制之下
- 并非所有代理协议都支持远程 DNS 解析
- 浏览器内部的 DNS 缓存行为因实现而异
系统级 DNS 配置
将操作系统配置为使用特定 DNS 服务器(如 Cloudflare 的 1.1.1.1 或 Google 的 8.8.8.8)可以防止 ISP 看到 DNS 查询,但这些 DNS 服务器仍会看到查询。它们通常位于与你的代理不同的地理区域,导致地理位置不一致。系统级 DNS 也无法处理浏览器的内部 DNS 预取行为。
DNS-over-HTTPS (DoH)
Chromium 支持 DoH,可加密 DNS 查询,防止 ISP 读取 DNS 流量,但 DoH 提供商仍会看到查询并可能知道你的真实 IP(在许多配置中 DoH 请求不通过代理路径)。DoH 解决的是机密性问题,但不一定封堵泄漏路径。
VPN 级别的 DNS 保护
VPN 通常会将所有 DNS 查询通过隧道路由,这对普通浏览很有效,但会增加整个 VPN 隧道的开销。对于需要每浏览器或每上下文代理控制的用户,VPN 太粗粒度。
BotBrowser 的方法
--bot-local-dns 标志
BotBrowser 的 --bot-local-dns 标志(ENT Tier1)在浏览器引擎内启用一个本地 DNS 解析器:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080" \
--bot-local-dns
该标志在网络栈层面控制 DNS 行为,意味着:
- 所有 DNS 查询都在本地处理,不会发送到 ISP 的解析器。
- DNS 预取遵循代理配置,推测性查找不会泄漏。
- WebRTC 与其他协议无法触发未保护的 DNS 查找,保护覆盖所有网络路径。
- 该保护对网站不可见,页面层面不会观测到不同的 DNS 行为。
何时使用 --bot-local-dns
当发生以下情形时,该标志最有价值:
- 代理提供商会阻止或重写 DNS 查找
- 需要多次运行间保持一致的 DNS 行为
- 想避免提供商侧的 DNS 策略干预
- 使用 SOCKS5(非 SOCKS5H)且希望阻止本地解析泄漏
与其它网络保护结合使用
为了全面的网络隐私,请将 DNS 保护与代理和 WebRTC 设置结合:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080" \
--bot-local-dns \
--bot-webrtc-ice="google"
此配置关闭三类主要的网络泄漏路径:HTTP/HTTPS 流量通过代理、DNS 查询在本地解析、WebRTC ICE 候选受控。
配置与使用
基本 CLI 设置
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080" \
--bot-local-dns
无头服务器部署
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080" \
--bot-local-dns \
--headless=new
Playwright 集成
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--proxy-server=socks5://user:pass@proxy:1080',
'--bot-local-dns',
'--bot-webrtc-ice=google',
],
headless: true,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
// 验证 DNS 未泄漏
const ip = await page.evaluate(async () => {
const res = await fetch('https://httpbin.org/ip');
return res.json();
});
console.log('Detected IP:', ip.origin);
await browser.close();
})();
Puppeteer 集成
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--proxy-server=socks5://user:pass@proxy:1080',
'--bot-local-dns',
],
headless: true,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();
验证
在使用 --bot-local-dns 启动 BotBrowser 后:
- 访问 DNS 泄漏检测站点(如 dnsleaktest.com 或 browserleaks.com/dns)
- 运行扩展测试以执行多次查询并识别所有解析器
- 确认结果中没有归属于你的 ISP 的 DNS 服务器
- 验证所有 DNS 查询都通过预期服务器解析
- 检查 DNS 解析器位置与代理的地理位置是否一致
自动化验证示例:
const page = await context.newPage();
await page.goto('https://httpbin.org/ip');
const ipResponse = await page.textContent('body');
console.log('HTTP IP:', ipResponse);
// HTTP 请求返回的 IP 应与代理 IP 相符
// DNS 查询不应暴露不同的位置
最佳实践
-
与代理一起始终使用
--bot-local-dns。 DNS 泄漏是代理设置中最常见的隐私缺口,该标志在引擎级别闭合该缺口。 -
结合使用
socks5h://获得额外保护。 将socks5h://与--bot-local-dns结合使用可提供双重防护。 -
与
--bot-webrtc-ice一并使用。 DNS 和 WebRTC 是两条常见的网络泄漏路径,同时关闭两者可获得全面保护。 -
使用扩展的 DNS 泄漏测试进行检测。 快速检测可能无法覆盖所有路径,长时/多次查询更具覆盖性。
-
在 CI/CD 中监控 DNS 行为。 在自动化管道中加入 DNS 泄漏验证可及早发现配置错误。
-
不要同时混用系统 DNS 工具与 BotBrowser。 若同时配置系统级 DNS 与
--bot-local-dns,两者交互可能产生意外结果。让 BotBrowser 管理 DNS 解析。
常见问题
--bot-local-dns 在没有代理时是否有效?
是的,该标志会启用本地 DNS 解析,但在没有代理的情况下,HTTP 请求中仍会泄露真实 IP,因此单独的 DNS 隐私价值有限。
--bot-local-dns 会影响页面加载速度吗?
本地解析器带来的开销极小,在某些情况下其速度甚至优于地理较远或性能较差的代理 DNS 服务器。
是否可以与 HTTP 代理一起使用?
可以。--bot-local-dns 与 SOCKS5、SOCKS5H、HTTP、HTTPS 等所有代理协议兼容。
--bot-local-dns 使用哪些 DNS 服务器?
本地解析器在浏览器引擎内处理解析,避免 OS 级别的 DNS 查询。具体解析策略由引擎内部管理以保证一致性。
--bot-local-dns 会阻止 DNS 预取吗?
会的。包括预取和推测性解析在内的所有 DNS 解析都会通过本地解析器进行,不会通过未保护路径泄漏。
可以将 --bot-local-dns 与浏览器级 DoH 一起使用吗?
不建议这样做。--bot-local-dns 已提供全面的 DNS 控制,叠加 DoH 可能导致解析路径冲突。
在使用 SOCKS5H 时是否还需要 --bot-local-dns?
SOCKS5H 已将主机名解析交给代理,但 --bot-local-dns 对 DNS 预取及其他推测性解析路径提供额外保护。
总结
DNS 泄漏是一个常见而严重的隐私缺口,即便所有 HTTP 流量都通过代理,也可能发生。BotBrowser 的 --bot-local-dns 标志在浏览器引擎层面闭合该缺口,确保没有 DNS 查询到达 ISP 或其他受控范围外的解析器。配合代理配置与 WebRTC 保护,可实现全面的网络隐私。
要获得完整的网络保护,请将 DNS 泄漏防护与 Proxy Configuration 和 WebRTC Leak Prevention 一并使用;欲实现多重身份与完全网络隔离,请参见 Multi-Account Browser Isolation。
title: "BotBrowser 的 DNS 泄露防护" description: "BotBrowser 如何使用 --bot-local-dns 标志防止 DNS 泄露,保护你的浏览活动隐私。" date: "2025-09-09" locale: zh category: network tags: ["dns", "leak-prevention", "proxy", "privacy", "network"] published: true
隐私风险
使用代理时,DNS 查询可能泄露到代理隧道之外,到达你的 ISP DNS 服务器。这会暴露你访问的每个域名和真实网络位置,即使页面内容通过代理路由。
BotBrowser 如何防止 DNS 泄露
BotBrowser 在浏览器引擎层面解决 DNS 泄露,不依赖扩展或外部工具。
使用 --bot-local-dns 进行本地 DNS 解析
--bot-local-dns 标志启用 BotBrowser 内置的本地 DNS 解析器:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080" \
--bot-local-dns
这将 DNS 解析置于你的控制之下。当你的代理提供商阻止或重写 DNS 查询时,或需要跨运行的一致 DNS 行为时,这特别有用。
引擎层面保护
BotBrowser 在网络栈内部控制 DNS 行为:
- DNS 预取遵守代理配置
- 没有 DNS 查询通过操作系统级回退泄露
- WebRTC 和其他协议无法触发未受保护的 DNS 查询
- 保护对网站不可见
完整隐私配置
将 DNS 保护与代理、配置文件和 WebRTC 设置结合:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080" \
--bot-local-dns \
--bot-webrtc-ice="stun:stun.l.google.com:19302"
无头服务器部署
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server="socks5://user:pass@proxy:1080" \
--bot-local-dns \
--headless=new
最佳实践
- 始终在代理中使用 --bot-local-dns:关闭 DNS 泄露路径
- 使用 SOCKS5 而非 SOCKS4:SOCKS5 原生支持远程 DNS 解析
- 结合 --bot-profile:确保浏览器身份一致性和网络保护
- 结合 --bot-webrtc-ice:DNS 和 WebRTC 是两个最常见的网络级泄露
验证
使用 --bot-local-dns 启动后:
- 在浏览器中打开 DNS 泄露测试网站
- 运行扩展测试
- 验证没有属于你 ISP 的 DNS 服务器出现
- 确认所有 DNS 查询通过预期服务器解析
开始使用
- 从 GitHub 下载 BotBrowser
- 使用
--bot-profile和--proxy-server配置 - 启用
--bot-local-dns进行 DNS 泄露防护 - 使用 DNS 泄露测试网站确认保护效果