返回博客
网络

使用 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 地址,然后才能建立连接。典型的解析流程如下:

  1. 浏览器检查其内部 DNS 缓存
  2. 若未命中,查询操作系统的 DNS 解析器
  3. 操作系统解析器检查其缓存,然后将查询转发到配置的 DNS 服务器(通常为 ISP)
  4. 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 后:

  1. 访问 DNS 泄漏检测站点(如 dnsleaktest.com 或 browserleaks.com/dns)
  2. 运行扩展测试以执行多次查询并识别所有解析器
  3. 确认结果中没有归属于你的 ISP 的 DNS 服务器
  4. 验证所有 DNS 查询都通过预期服务器解析
  5. 检查 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 查询不应暴露不同的位置

最佳实践

  1. 与代理一起始终使用 --bot-local-dns DNS 泄漏是代理设置中最常见的隐私缺口,该标志在引擎级别闭合该缺口。

  2. 结合使用 socks5h:// 获得额外保护。socks5h://--bot-local-dns 结合使用可提供双重防护。

  3. --bot-webrtc-ice 一并使用。 DNS 和 WebRTC 是两条常见的网络泄漏路径,同时关闭两者可获得全面保护。

  4. 使用扩展的 DNS 泄漏测试进行检测。 快速检测可能无法覆盖所有路径,长时/多次查询更具覆盖性。

  5. 在 CI/CD 中监控 DNS 行为。 在自动化管道中加入 DNS 泄漏验证可及早发现配置错误。

  6. 不要同时混用系统 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 ConfigurationWebRTC 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

最佳实践

  1. 始终在代理中使用 --bot-local-dns:关闭 DNS 泄露路径
  2. 使用 SOCKS5 而非 SOCKS4:SOCKS5 原生支持远程 DNS 解析
  3. 结合 --bot-profile:确保浏览器身份一致性和网络保护
  4. 结合 --bot-webrtc-ice:DNS 和 WebRTC 是两个最常见的网络级泄露

验证

使用 --bot-local-dns 启动后:

  1. 在浏览器中打开 DNS 泄露测试网站
  2. 运行扩展测试
  3. 验证没有属于你 ISP 的 DNS 服务器出现
  4. 确认所有 DNS 查询通过预期服务器解析

开始使用

  1. GitHub 下载 BotBrowser
  2. 使用 --bot-profile--proxy-server 配置
  3. 启用 --bot-local-dns 进行 DNS 泄露防护
  4. 使用 DNS 泄露测试网站确认保护效果
#dns#leak-prevention#proxy#privacy#network