快速回答
代理中的ERR_TUNNEL_CONNECTION_FAILED是什么意思?
net::ERR_TUNNEL_CONNECTION_FAILED表示Chrome请求代理开启到HTTPS站点的隧道,代理未响应200 Connection established。浏览器隐藏了真实状态码。在 CrawlRelay住宅代理中,通常因Playwright或Puppeteer缺少凭证,或目标无法访问网关。用curl -v重现查看真实状态码。
ERR_TUNNEL_CONNECTION_FAILED一览
| 错误 | ERR_TUNNEL_CONNECTION_FAILED |
|---|---|
| 类型 | Chromium网络错误 |
| 发送方 | 在代理拒绝或连接失败后浏览器报错 |
| 定义于 | CONNECT method: RFC 9110, section 9.3.6 |
| 要重试吗? | 先确认背后的状态码 |
| 先检查 | 用curl -v重现以查看CONNECT的真实状态 |
ERR_TUNNEL_CONNECTION_FAILED是什么意思?
要通过HTTP代理加载HTTPS页面,浏览器先发送CONNECT host:443请求。代理若回应200,浏览器在隧道内启动TLS连接;其它状态,如407、403或502,会终止尝试,Chromium报一个通用错误。
因此这个错误提示的是失败位置(隧道)但不指明原因。原因即代理返回的状态码,curl能帮你看见。
在Python、curl、Node.js和浏览器中ERR_TUNNEL_CONNECTION_FAILED是什么样?
每个工具中相同的失败会有不同的提示信息。请在日志中搜索以下信息:
- Playwright:
page.goto: net::ERR_TUNNEL_CONNECTION_FAILED at https://... - Puppeteer:
Error: net::ERR_TUNNEL_CONNECTION_FAILED at https://... - Chrome 地址栏: 显示“无法访问此网站”及代码
ERR_TUNNEL_CONNECTION_FAILED - 使用 Selenium 和 Chrome: 出现同样代码,包含在
WebDriverException中
导致ERR_TUNNEL_CONNECTION_FAILED的原因是什么?
最可能的首要原因:
- 未发送凭据(隐藏的 407)。Chrome 会忽略
--proxy-server中的用户名和密码。 - 目标拒绝访问(隐藏的 403),如代理使用政策所阻止的类别。
- 目标无法到达(隐藏的 502 或 504):死主机、拼写错误或出口的 DNS 失败。
- 端口错误:将浏览器指向 SOCKS5 端口当作 HTTP,或反之。
如何一步步诊断ERR_TUNNEL_CONNECTION_FAILED?
- 使用带有
-v的 curl 运行相同 URL(命令如下)并读取CONNECT后的行。 407表示需要凭据;403表示目标被拒绝;502或504表示目标或出口问题。- 确认浏览器为
http://代理服务器使用 HTTP 端口。 - 在访问真实目标前,先测试简单页面如
https://api.ipify.org。
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URL如何修复ERR_TUNNEL_CONNECTION_FAILED?
- Playwright: 在
proxy选项中传递server、username和password,可针对浏览器或上下文。详见 Playwright 指南。 - Puppeteer: 使用
--proxy-server=http://host:port启动,并在首次goto前调用page.authenticate()。详见 Puppeteer 指南。 - Selenium: 运行一个本地小转发器,添加凭据。详见 Selenium 指南。
- 检查目标 是否符合我们的 可接受使用政策。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gw.crawlrelay.com:7777",
"username": "USERNAME-country-us",
"password": "PASSWORD",
})
page = browser.new_page()
response = page.goto("https://api.ipify.org")
print(response.status, page.inner_text("body"))
browser.close()遇到ERR_TUNNEL_CONNECTION_FAILED后要重试吗?
仅当已知隐藏状态时才重试。隐藏的 407 或 403 会一直重复;需修正配置。隐藏的 502 或 504 可在新出口重试,类似任何网关错误。
ERR_TUNNEL_CONNECTION_FAILED如何应用于CrawlRelay?
CrawlRelay 的 HTTP 端口通过 CONNECT 隧道传递 HTTPS,所有基于 Chromium 的工具均支持。浏览器请使用 HTTP 端口:Chromium 不支持带用户名和密码的 SOCKS5。
网关:gw.crawlrelay.com,端口7777(通过CONNECT的HTTP、HTTPS)和端口7778(SOCKS5)。用户名格式:USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}。相关内容:407 代理认证要求 · ERR_PROXY_CONNECTION_FAILED · Playwright 指南。
ERR_TUNNEL_CONNECTION_FAILED:开发者常问的问题
为什么 curl 能用而 Playwright 显示 ERR_TUNNEL_CONNECTION_FAILED?
因为 curl 会从代理 URL 传递凭据,而 Chromium 会忽略写在代理服务器地址中的凭据。在 Playwright 中,需将 username 和 password 作为 proxy 选项的独立字段传递。在 Puppeteer 中,在导航前调用 page.authenticate()。
我能在 Chrome 中使用带身份验证的 SOCKS5 代理吗?
不直接支持。Chromium 支持 SOCKS5 代理,但不支持 SOCKS5 用户名密码认证。改用网关的 HTTP 端口,该端口通过 CONNECT 隧道处理 HTTPS,或运行本地转发器为浏览器认证。
ERR_TUNNEL_CONNECTION_FAILED 是不是网站引起的?
很少直接。隧道位于浏览器和代理之间,所以错误发生在网站看到 TLS 握手之前。网站可能是间接原因,当它无法访问时,代理会对 CONNECT 请求返回 502 或 504。
本参考中的其他代理错误
HTTP 状态码
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
浏览器和客户端错误
连接和 TLS 错误
带有涵盖失败案例文档的住宅代理
来自US$0.50/GB的CrawlRelay住宅代理,流量永不过期。