解決使用代理伺服器時出現的 ERR_TUNNEL_CONNECTION_FAILED 錯誤

更新於:

若要透過代理伺服器載入 https:// 網頁,瀏覽器會發送 CONNECT 請求,並等待代理伺服器與目標網站建立通道。當代理伺服器回傳錯誤而非同意建立連線時,就會出現 ERR_TUNNEL_CONNECTION_FAILED。問題在於 Chrome 不會顯示具體的錯誤內容,因此首要任務是找出實際的狀態碼。

完美相容 Puppeteer 與 Playwright 的代理伺服器

我們重現的兩種情況

兩者皆以測試代理伺服器執行驗證,此處以範例位址 203.0.113.10:8080 及 user123:pass456 表示。在一般的 Chrome 視窗中,407 不會變成通道錯誤,而是會彈出登入對話方塊要求輸入代理伺服器的使用者名稱與密碼。因此,由 407 引起的通道錯誤主要出現在自動化工具以及無法提示輸入密碼的應用程式中。

代理伺服器回應 CONNECT 的狀態碼Chrome 顯示curl 顯示
回傳 407 且無法輸入密碼(無頭模式 Chrome)ERR_TUNNEL_CONNECTION_FAILEDcurl: (56) CONNECT tunnel failed, response 407
因代理伺服器無法連線至目標網站而回傳 502ERR_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 能彈出提示並成功載入,則問題出在該應用程式。

我可以將 user:pass 放在 --proxy-server 裡面嗎?

不行。Chrome 會忽略該參數中的帳密資訊,進而導致 407 及通道錯誤。請改用 Puppeteer、Playwright 或擴充功能進行身分驗證。

切換至 SOCKS5 能解決通道錯誤嗎?

只有在您的方案支援 SOCKS5 時才有效。VinaProxy 同時提供 HTTP(S) 與 SOCKS5;請選擇控制台方案中顯示的協議,若協議不符將會引發其他錯誤。

完美相容 Puppeteer 與 Playwright 的代理伺服器

VinaProxy 代理伺服器採用標準的 user:pass 登入方式,各大熱門自動化函式庫皆能開箱即用。

查看定價

相關文章

代理錯誤
如何解決 407 Proxy Authentication Required 錯誤
出現 407 Proxy Authentication Required 錯誤,代表 Proxy 已有回應但拒絕了您的登入。本文提供真實的 curl 輸出範例、常見原因以及各應用程式的解決方法。
代理錯誤
代理伺服器 502 Bad Gateway 錯誤:找出是誰傳回的
透過代理出現 502 Bad Gateway 代表中繼伺服器沒有收到有效回應。本文將透過真實的 curl 輸出,教您如何判斷是代理還是網站出問題。
代理設定教學
如何在 Puppeteer 中設定驗證 Proxy(Node.js 指南)
在 Node.js Puppeteer 中設定帶帳密驗證的 HTTP(S) 代理:透過 --proxy-server 啟動參數結合 await page.authenticate() 達成穩定路由。
代理設定教學
如何在 Playwright 中設定 Proxy(瀏覽器全域與 Per-Context 驗證)
在 Node.js 與 Python 的 Playwright 中設定具備帳密驗證的 HTTP(S) 代理。透過 BrowserContext 在單一瀏覽器處理程序中分配多個獨立靜態 IP。
代理設定教學
如何在Selenium WebDriver中配置帶認證的代理
透過selenium-wire或Chrome onAuthRequired擴充功能在Selenium WebDriver中配置帶帳號密碼認證的HTTP(S)代理。
免費工具
Proxy 檢測工具:線上檢查你的代理
免費 Proxy 檢測工具:以 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) 代理伺服器。