浏览器代理配置:SOCKS5、HTTP 和 HTTPS 指南
配置 SOCKS5、HTTP 和 HTTPS 代理的完整指南,包含嵌入凭据、地理位置匹配和选择性路由。
简介
仅靠指纹配置文件不足以构建一致的浏览器身份。你的 IP 地址、DNS 行为和地理元数据必须与配置文件呈现的身份一致。如果你的配置文件说"柏林的 Windows 用户",但你的 IP 解析到弗吉尼亚的数据中心,这种不一致是明显的。
BotBrowser 提供直接内置在浏览器引擎中的增强代理支持。与标准 Chromium 不同,BotBrowser 接受代理 URL 中的嵌入凭据、自动从代理 IP 派生地理设置,并支持 SOCKS5、SOCKS5H、HTTP 和 HTTPS 协议。本指南涵盖代理配置的每个方面,从基本设置到高级选择性路由。
隐私影响
没有正确配置的代理,你的真实 IP 地址对每个访问的网站都是可见的。IP 地址揭示你的 ISP、大致物理位置,且可以跨会话关联以构建持久的追踪档案。
即使使用代理,配置错误也可能破坏你的隐私。DNS 查询可能泄漏到代理隧道之外,向你的 ISP 暴露浏览活动。WebRTC ICE 候选可能通过代理路径之外的 STUN 请求暴露你的真实 IP。声明身份与 IP 地理位置之间的时区和区域设置不匹配会创建追踪系统可以标记的不一致。
BotBrowser 在统一的配置模型中解决所有这些问题。当你设置 --proxy-server 时,BotBrowser 自动检测代理的公共 IP 并派生时区、区域设置和语言设置以匹配。这意味着一个标志就可以对齐你的整个地理身份。
技术背景
浏览器代理工作原理
当浏览器使用代理时,HTTP 和 HTTPS 流量通过代理服务器转发,而不是直接连接到目标。目标看到的是代理的 IP 地址,而不是你的。
不同的代理协议处理方式不同:
SOCKS5 在传输层(第 5 层)操作。它转发原始 TCP 连接,可选地在代理端处理 DNS 解析(SOCKS5H)。SOCKS5 支持 TCP 和 UDP 流量,使其成为最通用的隐私协议。
HTTP 代理使用 CONNECT 方法为 HTTPS 流量建立隧道。代理可以看到目标主机名但看不到加密内容。HTTP 代理不处理 UDP 流量。
HTTPS 代理加密浏览器和代理服务器之间的连接。这防止你的 ISP 看到你发送的代理命令,为代理连接增加了一层保密性。
标准 Chromium vs. BotBrowser 的凭据处理
标准 Chromium 的 --proxy-server 标志只接受不带凭据的代理地址。认证需要通过系统提示或框架特定的 API(如 page.authenticate())单独处理。这不方便且可能干扰 BotBrowser 的自动地理检测。
BotBrowser 扩展了 --proxy-server 以接受直接嵌入 URL 中的凭据:
protocol://username:password@host:port
这消除了单独认证步骤的需要,将所有代理配置保持在单个标志中。
支持的代理类型和配置
BotBrowser 通过 --proxy-server 标志支持四种代理协议:
| 协议 | URL 格式 | 用途 |
|---|---|---|
| SOCKS5 | socks5://user:pass@host:port | 通用,TCP 流量 |
| SOCKS5H | socks5h://user:pass@host:port | DNS 解析留在隧道内 |
| HTTP | http://user:pass@host:port | 广泛可用,HTTP/HTTPS 流量 |
| HTTPS | https://user:pass@host:port | 加密代理连接 |
SOCKS5 vs. SOCKS5H
socks5:// 和 socks5h:// 之间的区别很重要。使用 socks5:// 时,DNS 解析在你的机器上本地进行,然后连接通过代理发送。使用 socks5h:// 时,主机名发送到代理服务器,由代理代表你解析 DNS。对于隐私,socks5h:// 是更好的选择,因为它防止 DNS 查询泄漏到你的本地解析器。
结构化代理用户名
一些代理提供商在用户名内使用逗号或管道等分隔符编码路由指令。BotBrowser 支持这些结构化用户名:
--proxy-server=socks5://user_abc,type_mobile,country_GB,session_1234:password@portal.proxy.example.com:1080
这在根据嵌入凭据中的参数路由流量的住宅代理提供商中很常见。
BotBrowser 的代理集成方法
自动地理对齐
当 BotBrowser 通过代理连接时,它检测代理的公共 IP 并自动配置:
- 时区:从 IP 地理位置派生
- 区域设置:与代理所在国家匹配
- 语言:根据代理区域设置
- 地理位置:从 IP 近似的坐标
这意味着仅使用 --proxy-server 的基本启动就已经产生了地理一致的身份:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server=socks5://user:pass@de-proxy:1080
BotBrowser 将检测到德国 IP 并自动将时区设置为 Europe/Berlin、区域设置为 de-DE、语言为 de-DE,de,en。
手动地理覆盖
当需要与 IP 建议不同的特定地理设置时,使用覆盖标志:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server=socks5://user:pass@proxy:1080 \
--bot-config-timezone=America/New_York \
--bot-config-locale=en-US \
--bot-config-languages=en-US,en \
--bot-config-location=40.7128,-74.0060
CLI 标志具有最高配置优先级,覆盖配置文件设置和自动检测的值。
使用 --proxy-ip 跳过 IP 查找
如果你已知代理的公共 IP,可以使用 --proxy-ip 标志(ENT Tier1)跳过每页 IP 查找:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server=socks5://user:pass@proxy:1080 \
--proxy-ip="203.0.113.1"
这消除了每次页面加载时的 IP 检测请求,提高导航速度。
使用 --proxy-bypass-rgx 选择性代理路由
--proxy-bypass-rgx 标志(PRO)让你将特定 URL 直接路由而不通过代理。这对减少静态资源的代理带宽很有用:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server=socks5://user:pass@proxy:1080 \
--proxy-bypass-rgx="\.(js|css|png|jpg|svg)(\?|$)"
模式使用 RE2 正则语法,匹配主机名和完整 URL 路径。
JavaScript 使用中的重要注意事项:不要在值内包含 shell 引号:
// 正确
launchArgs.push('--proxy-bypass-rgx=\\.js($|\\?)');
// 错误 - 引号成为正则的一部分
launchArgs.push('--proxy-bypass-rgx="\\.js$"');
配置和使用
基本 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-host:1080',
],
headless: true,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
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@de-proxy:1080',
'--bot-config-timezone=Europe/Berlin',
'--bot-config-locale=de-DE',
'--bot-config-languages=de-DE,de,en',
],
headless: true,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();
常见区域配置
| 区域 | 时区 | 区域设置 | 语言 |
|---|---|---|---|
| 美东 | America/New_York | en-US | en-US,en |
| 美西 | America/Los_Angeles | en-US | en-US,en |
| 英国 | Europe/London | en-GB | en-GB,en |
| 德国 | Europe/Berlin | de-DE | de-DE,de,en |
| 日本 | Asia/Tokyo | ja-JP | ja,en |
| 巴西 | America/Sao_Paulo | pt-BR | pt-BR,pt,en |
| 韩国 | Asia/Seoul | ko-KR | ko-KR,ko,en |
自定义 IP 检测服务
如果你运行自己的 IP 检测端点,使用 --bot-ip-service 配置:
chrome --bot-profile="/path/to/profile.enc" \
--proxy-server=socks5://user:pass@proxy:1080 \
--bot-ip-service="https://ip.example.com"
你可以提供多个端点作为逗号分隔列表。BotBrowser 竞争它们并使用最快的响应:
--bot-ip-service="https://ip1.example.com,https://ip2.example.com"
验证
使用代理启动 BotBrowser 后,验证你的配置:
const page = await context.newPage();
// 检查公共 IP
await page.goto('https://httpbin.org/ip');
const ipData = await page.textContent('body');
console.log('Public IP:', ipData);
// 检查时区
const tz = await page.evaluate(() =>
Intl.DateTimeFormat().resolvedOptions().timeZone
);
console.log('Timezone:', tz);
// 检查语言
const lang = await page.evaluate(() => navigator.language);
console.log('Language:', lang);
// 检查区域设置
const locale = await page.evaluate(() =>
Intl.NumberFormat().resolvedOptions().locale
);
console.log('Locale:', locale);
确认:
- IP 匹配代理的预期地址
- 时区与代理的地理区域一致
- 语言和区域设置与时区一致
- 没有可见的 DNS 泄漏(参见 DNS 泄漏防护指南)
最佳实践
-
使用 SOCKS5H 以获得 DNS 隐私。
socks5h://协议通过代理解析 DNS,防止 DNS 查询到达你的本地 ISP。 -
让 BotBrowser 自动检测地理位置。 除非需要特定覆盖,否则基于 IP 的自动检测以更少的配置产生一致的结果。
-
URL 编码密码中的特殊字符。
@、#和%等字符必须编码。例如,p@ss变为p%40ss。 -
与 --bot-local-dns 结合使用。 为获得最大 DNS 隐私,将本地 DNS 解析器与代理配置一起使用。
-
先用 curl 测试。 在配置 BotBrowser 之前,验证代理连通性:
curl --proxy socks5://user:pass@host:port https://httpbin.org/ip。 -
已知 IP 时使用 --proxy-ip。 这消除了每页查找开销并加快导航。
常见问题
应该使用什么代理协议? 大多数用例推荐 SOCKS5H。它支持 TCP 流量,通过代理处理 DNS 解析,与最广泛的代理提供商兼容。
可以使用需要 IP 白名单的代理吗? 可以。确保你的机器 IP 已在代理提供商处白名单,然后使用不带凭据的代理 URL(如果提供商通过 IP 认证)。
BotBrowser 支持代理链吗?
BotBrowser 连接到 --proxy-server 中指定的代理。如果需要代理链,在代理基础设施侧配置。
为什么我的时区与代理位置不匹配?
如果你手动设置了 --bot-config-timezone,它会覆盖自动检测。移除手动覆盖让 BotBrowser 从代理 IP 派生时区。
可以为不同标签页使用不同代理吗?
可以。使用 Playwright 的 browser.newContext({ proxy: ... }) 为每个上下文分配不同的代理。详见动态代理切换。
代理连接失败会怎样? BotBrowser 不会回退到直接连接。如果代理不可达,页面加载将失败,这是隐私安全的行为。
如何处理代理轮换? 为每次代理轮换创建新的浏览器上下文。关闭旧上下文并打开带有不同代理服务器的新上下文是最干净的方法。详见动态代理切换。
总结
代理配置是一致浏览器身份的网络基础。BotBrowser 通过嵌入凭据、自动地理对齐以及对 SOCKS5、SOCKS5H、HTTP 和 HTTPS 协议的支持简化了代理设置。与指纹配置文件结合,代理配置确保你的 IP、时区、区域设置和语言都讲述相同的故事。
关于多代理工作流程,请参阅动态代理切换。关于与代理一起防止 DNS 和 WebRTC 泄漏,请参阅 DNS 泄漏防护和 WebRTC 泄漏防护。