解決使用代理伺服器時出現的 ERR_TUNNEL_CONNECTION_FAILED 錯誤
更新於:
若要透過代理伺服器載入 https:// 網頁,瀏覽器會發送 CONNECT 請求,並等待代理伺服器與目標網站建立通道。當代理伺服器回傳錯誤而非同意建立連線時,就會出現 ERR_TUNNEL_CONNECTION_FAILED。問題在於 Chrome 不會顯示具體的錯誤內容,因此首要任務是找出實際的狀態碼。
我們重現的兩種情況
兩者皆以測試代理伺服器執行驗證,此處以範例位址 203.0.113.10:8080 及 user123:pass456 表示。在一般的 Chrome 視窗中,407 不會變成通道錯誤,而是會彈出登入對話方塊要求輸入代理伺服器的使用者名稱與密碼。因此,由 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 能彈出提示並成功載入,則問題出在該應用程式。
我可以將 user:pass 放在 --proxy-server 裡面嗎?
不行。Chrome 會忽略該參數中的帳密資訊,進而導致 407 及通道錯誤。請改用 Puppeteer、Playwright 或擴充功能進行身分驗證。
切換至 SOCKS5 能解決通道錯誤嗎?
只有在您的方案支援 SOCKS5 時才有效。VinaProxy 同時提供 HTTP(S) 與 SOCKS5;請選擇控制台方案中顯示的協議,若協議不符將會引發其他錯誤。
完美相容 Puppeteer 與 Playwright 的代理伺服器
VinaProxy 代理伺服器採用標準的 user:pass 登入方式,各大熱門自動化函式庫皆能開箱即用。
查看定價