解决使用代理时的 ERR_TUNNEL_CONNECTION_FAILED 错误
更新于:
要在代理环境下加载 https:// 页面,浏览器会发送 CONNECT 请求,并等待代理与目标网站建立隧道。当代理没有同意建立隧道,而是返回错误时,就会出现 ERR_TUNNEL_CONNECTION_FAILED。问题在于 Chrome 并不会显示具体是哪个错误,因此首要任务是找出实际的错误代码。
我们复现的两种常见情况
两种情况均在测试代理上进行了复现,此处文档中替换为示例地址 203.0.113.10:8080 与凭据 user123:pass456。在正常的 Chrome 窗口中,407 错误通常不会直接导致隧道失败,Chrome 会弹出登录对话框提示输入代理用户名和密码。因此,由 407 引起的隧道错误大多出现在自动化工具以及无法弹出密码提示的应用中。
| 代理返回的 CONNECT 状态 | Chrome 显示 | curl 显示 |
|---|---|---|
返回 407 且无法输入密码(无头模式 Chrome) | ERR_TUNNEL_CONNECTION_FAILED | curl: (56) CONNECT tunnel failed, response 407 |
返回 502(代理无法连接目标网站) | ERR_TUNNEL_CONNECTION_FAILED | curl: (56) CONNECT tunnel failed, response 502 |
常见原因(按概率排序)
- 自动化脚本未传递认证凭据。 Chrome 的
--proxy-server参数仅支持主机和端口,不支持 user:pass。无头模式下的 Puppeteer 或 Selenium 遇到 407 状态时就会报隧道连接失败。 - 手机应用处于需要密码认证的 Wi-Fi 代理环境下。 应用本身没有登录弹窗,导致 HTTPS 无法访问,而浏览器却可以正常打开。
- 代理无法连接目标服务器。 代理对 CONNECT 请求返回 502;详见 502 Bad Gateway 页面。
- 仅部分网站无法访问。 目标网站阻断了连接或已宕机,而通过该代理访问其他网站依然正常。
使用一条 curl 命令获取真实状态码
将参数替换为你自己的信息后运行 curl -v -x http://user123:[email protected]:8080 https://example.com。查看紧随 > CONNECT example.com:443 HTTP/1.1 下方的一行内容:若为 407,请参考 407 指南;若为 502,则说明问题出在目标网站或代理后端的链路上。如果你不想使用终端,可以将该行代理信息直接粘贴到代理检测工具中,遇到相同情况它会明确提示 auth failed (407) 或 HTTP 502。
不同环境下的解决方法
- Puppeteer: 启动时保留
--proxy-server=http://host:port,并在页面跳转前调用page.authenticate({ username, password })。完整示例见 Puppeteer 代理指南。 - Playwright: 启动浏览器时传入
proxy: { server, username, password },Playwright 会自动处理 407 认证;详见 Playwright。 - Selenium: Chrome 无法通过命令行直接接收 user:pass;Selenium 指南提供了可行的替代方案。
- Windows 上的 Chrome: 如果一直不弹出登录对话框,请检查是否有代理扩展拦截了弹窗,然后尝试在无扩展的窗口中重试。
- 手机设备: 针对需要认证代理的应用,请使用支持 user:pass 的代理客户端,具体操作参考 Android 配置指南。
操作步骤
- 1
确认 CONNECT 响应状态
使用你的代理信息运行
curl -v -x,或直接将其粘贴到检测工具中,确认代理返回的是 407 还是 502。 - 2
针对 407:正确配置认证凭据
在代码脚本中,请使用对应库提供的认证接口,切勿直接将 user:pass 写入
--proxy-server。 - 3
针对 502:尝试访问其他网站
通过该代理尝试加载一个大型常用网站(如 example.com)。如果可以正常打开,说明问题出在原目标网站上。
- 4
重新运行并验证出口 IP
隧道成功建立后,在同一浏览器中访问我的 IP,确认流量已正确走代理。
常见问题
为什么 HTTP 页面可以正常打开,而 HTTPS 页面会失败?
普通的 HTTP 请求不需要执行 CONNECT,代理解析后会直接转发请求;只有 HTTPS 才需要建立安全隧道,因此隧道错误仅在 HTTPS 下出现。
Android 设备上出现 ERR_TUNNEL_CONNECTION_FAILED 是什么原因?
最常见的原因是某个应用无法向 Wi-Fi 代理提交用户名和密码。可以在 Android 版 Chrome 中尝试打开同一网页;如果 Chrome 能正常弹出输入框并加载页面,说明问题仅出在那个应用上。
可以在 --proxy-server 中直接写入 user:pass 吗?
不可以。Chrome 会忽略该参数中的账号密码信息,从而触发 407 导致隧道错误。请改用 Puppeteer、Playwright 提供的认证方法或通过扩展程序完成认证。
换用 SOCKS5 协议能解决隧道错误吗?
仅当你的订单本身属于 SOCKS5 时才有效。VinaProxy 同时提供 HTTP(S) 和 SOCKS5;请在控制面板确认订单支持的协议并选择对应配置,协议不匹配会导致其他连接错误。
完美兼容 Puppeteer 与 Playwright 的代理服务
VinaProxy 代理支持标准 user:pass 认证,主流自动化库开箱即用。
查看价格