解决使用代理时的 ERR_TUNNEL_CONNECTION_FAILED 错误

更新于:

要在代理环境下加载 https:// 页面,浏览器会发送 CONNECT 请求,并等待代理与目标网站建立隧道。当代理没有同意建立隧道,而是返回错误时,就会出现 ERR_TUNNEL_CONNECTION_FAILED。问题在于 Chrome 并不会显示具体是哪个错误,因此首要任务是找出实际的错误代码。

完美兼容 Puppeteer 与 Playwright 的代理服务

我们复现的两种常见情况

两种情况均在测试代理上进行了复现,此处文档中替换为示例地址 203.0.113.10:8080 与凭据 user123:pass456。在正常的 Chrome 窗口中,407 错误通常不会直接导致隧道失败,Chrome 会弹出登录对话框提示输入代理用户名和密码。因此,由 407 引起的隧道错误大多出现在自动化工具以及无法弹出密码提示的应用中。

代理返回的 CONNECT 状态Chrome 显示curl 显示
返回 407 且无法输入密码(无头模式 Chrome)ERR_TUNNEL_CONNECTION_FAILEDcurl: (56) CONNECT tunnel failed, response 407
返回 502(代理无法连接目标网站)ERR_TUNNEL_CONNECTION_FAILEDcurl: (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. 1

    确认 CONNECT 响应状态

    使用你的代理信息运行 curl -v -x,或直接将其粘贴到检测工具中,确认代理返回的是 407 还是 502。

  2. 2

    针对 407:正确配置认证凭据

    在代码脚本中,请使用对应库提供的认证接口,切勿直接将 user:pass 写入 --proxy-server。

  3. 3

    针对 502:尝试访问其他网站

    通过该代理尝试加载一个大型常用网站(如 example.com)。如果可以正常打开,说明问题出在原目标网站上。

  4. 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 认证,主流自动化库开箱即用。

查看价格

相关文章

代理错误
如何解决 407 Proxy Authentication Required 错误
407 Proxy Authentication Required 错误表示代理服务器已响应,但拒绝了您的身份验证。查看实际 curl 输出、常见原因及各应用的针对性解决方法。
代理错误
代理出现 502 Bad Gateway 错误:排查究竟是谁返回的
通过代理遇到 502 Bad Gateway 意味着中间服务器未收到有效响应。本文结合真实的 curl 输出,带您判断问题出在代理还是目标网站。
代理配置教程
如何在 Puppeteer 中配置带认证的代理(Node.js 指南)
在 Node.js Puppeteer 中配置带身份验证的 HTTP(S) 代理:通过 --proxy-server 启动参数与 await page.authenticate() 结合实现稳定代理连接。
代理配置教程
如何在 Playwright 中设置代理(浏览器级与 Per-Context 认证)
在 Node.js 和 Python 的 Playwright 中配置带认证的 HTTP(S) 代理。通过 BrowserContext 在单一浏览器实例中运行多个独立的静态 IP。
代理配置教程
如何在Selenium WebDriver中配置带认证的代理
通过selenium-wire或Chrome onAuthRequired扩展在Selenium WebDriver中配置带账号密码认证的HTTP(S)代理。
免费工具
代理检测工具:在线检测你的代理IP
免费代理检测工具:以ip:port:user:pass格式粘贴最多100个代理,在线检测可用性、出口IP和延迟,并了解各种错误的含义。
代理配置教程
Google Chrome代理配置完整指南
通过Chrome扩展插件、--proxy-server命令行参数或独立用户配置,在Google Chrome中配置VinaProxy HTTP(S)代理,无需更改整台电脑的系统IP。
代理配置教程
如何在 Windows 10 与 Windows 11 上配置代理
通过 WinINET 系统设置、PowerShell 环境变量或 netsh winhttp 在 Windows 10 和 Windows 11 上配置 VinaProxy HTTP(S) 代理。