Lỗi ERR_TUNNEL_CONNECTION_FAILED khi dùng proxy

Cập nhật:

Để mở một trang https://, trình duyệt gửi cho proxy yêu cầu CONNECT và chờ proxy mở giúp một đường hầm tới website. ERR_TUNNEL_CONNECTION_FAILED xuất hiện khi proxy trả lời yêu cầu đó bằng một mã lỗi thay vì đồng ý. Điểm mấu chốt: Chrome không cho bạn biết mã nào, nên việc đầu tiên là tìm ra mã thật.

Proxy dùng tốt cho Puppeteer, Playwright

Hai tình huống chúng tôi tái hiện được

Cả hai được chạy trên proxy thử nghiệm, viết lại với địa chỉ minh hoạ 203.0.113.10:8080 và user123:pass456. Trong cửa sổ Chrome bình thường, trường hợp 407 không thành lỗi tunnel mà hiện hộp thoại hỏi username và password của proxy. Vì vậy lỗi tunnel do 407 chủ yếu gặp trong công cụ tự động hoá và app không biết hỏi mật khẩu.

Proxy trả lời CONNECT bằngChrome hiệncurl hiện
407 và không có cách nào nhập mật khẩu (Chrome headless)ERR_TUNNEL_CONNECTION_FAILEDcurl: (56) CONNECT tunnel failed, response 407
502 vì proxy không tới được websiteERR_TUNNEL_CONNECTION_FAILEDcurl: (56) CONNECT tunnel failed, response 502

Nguyên nhân, xếp theo khả năng

  • Script tự động hoá không gửi thông tin đăng nhập. Cờ --proxy-server của Chrome chỉ nhận host và port, không nhận user:pass. Puppeteer, Selenium chạy headless sẽ nhận 407 và báo lỗi tunnel.
  • App trên điện thoại dùng proxy Wi-Fi có mật khẩu. App không có hộp thoại đăng nhập nên kết nối HTTPS hỏng, trong khi trình duyệt vẫn chạy.
  • Proxy không tới được website đích. Proxy trả 502 cho CONNECT; trang 502 Bad Gateway đi sâu vào trường hợp này.
  • Chỉ một vài trang lỗi. Website đích chặn hoặc đang sập, các trang khác vẫn vào được qua cùng proxy.

Tìm mã thật bằng một lệnh curl

Chạy curl -v -x http://user123:[email protected]:8080 https://example.com với thông tin của bạn. Nhìn dòng ngay sau > CONNECT example.com:443 HTTP/1.1: nếu là 407 thì xử lý theo lỗi 407; nếu là 502 thì vấn đề ở phía đích hoặc đường đi phía sau proxy. Ai không quen dòng lệnh có thể dán dòng proxy vào công cụ check proxy: kết quả auth failed (407) hoặc HTTP 502 cho đúng thông tin đó.

Cách sửa theo môi trường

  • Puppeteer: giữ --proxy-server=http://host:port khi launch và gọi page.authenticate({ username, password }) trước khi mở trang. Ví dụ đầy đủ ở cài proxy Puppeteer.
  • Playwright: truyền proxy: { server, username, password } khi khởi chạy trình duyệt, Playwright tự trả lời 407, xem Playwright.
  • Selenium: Chrome không nhận user:pass qua tham số dòng lệnh; xem cách xử lý trong hướng dẫn Selenium.
  • Chrome trên Windows: nếu không thấy hộp thoại đăng nhập, kiểm tra tiện ích proxy có đang chặn nó hay không, rồi thử lại trong cửa sổ không có tiện ích.
  • Điện thoại: với app cần proxy có mật khẩu, dùng app proxy hỗ trợ user:pass như hướng dẫn ở cài proxy Android.

Các bước thực hiện

  1. 1

    Xác định mã CONNECT

    Chạy curl -v -x với dòng proxy hoặc dán vào checker để biết proxy trả 407 hay 502.

  2. 2

    Nếu là 407: cấp thông tin đăng nhập đúng cách

    Trong script, dùng cơ chế xác thực của thư viện thay vì nhét user:pass vào --proxy-server.

  3. 3

    Nếu là 502: thử website khác

    Mở một trang lớn như example.com qua cùng proxy. Trang khác chạy được thì lỗi nằm ở website đích.

  4. 4

    Chạy lại và kiểm tra IP ra

    Khi tunnel mở được, mở kiểm tra IP trong chính trình duyệt đó để chắc lưu lượng đi qua proxy.

Câu hỏi thường gặp

Vì sao trang http vào được còn https thì lỗi tunnel?

Trang http không cần CONNECT, proxy chuyển thẳng yêu cầu. Chỉ https mới mở đường hầm, nên lỗi tunnel chỉ hiện ở trang https.

err_tunnel_connection_failed trên Android là do đâu?

Hay gặp nhất là app không gửi được username và password cho proxy Wi-Fi. Thử trang đó trong Chrome Android; Chrome hỏi mật khẩu được thì lỗi nằm ở app.

Có thể ghi user:pass vào --proxy-server không?

Không. Chrome bỏ qua phần đăng nhập trong cờ này, nên bạn sẽ nhận 407 và lỗi tunnel. Hãy xác thực qua API của Puppeteer, Playwright hoặc tiện ích.

Đổi sang SOCKS5 có hết lỗi tunnel không?

Chỉ khi đơn của bạn là SOCKS5. VinaProxy có cả HTTP(S) và SOCKS5; chọn giao thức theo đơn trong dashboard, chọn sai sẽ sinh lỗi khác.

Proxy dùng tốt cho Puppeteer, Playwright

Proxy VinaProxy đăng nhập bằng user:pass chuẩn, chạy được với các thư viện tự động hoá phổ biến.

Xem bảng giá

Bài viết liên quan

Lỗi proxy
Lỗi 407 Proxy Authentication Required là gì và sửa thế nào
Lỗi 407 proxy nghĩa là proxy đã nhận kết nối nhưng từ chối đăng nhập. Xem output curl thật, các nguyên nhân hay gặp và cách sửa trên Chrome, antidetect, code.
Lỗi proxy
Lỗi 502 Bad Gateway proxy: xác định ai đang trả lỗi
502 Bad Gateway qua proxy nghĩa là có một máy trung gian không nhận được phản hồi hợp lệ phía sau. Cách biết lỗi do proxy hay do website, kèm output curl thật.
Cài đặt proxy
Cách cấu hình proxy HTTP(S) trong Puppeteer trên Node.js
Hướng dẫn cấu hình proxy HTTP có mật khẩu trong Puppeteer trên Node.js bằng cờ --proxy-server và hàm await page.authenticate().
Cài đặt proxy
Cách cấu hình proxy trong Playwright (Node.js & Python)
Hướng dẫn gắn proxy HTTP có username và password vào Playwright ở tầng Browser và BrowserContext. Cách chạy nhiều IP song song trên 1 tiến trình.
Cài đặt proxy
Cách gắn proxy có xác thực user:pass vào Selenium WebDriver
Hướng dẫn cấu hình proxy HTTP có xác thực user:pass trong Selenium WebDriver và ChromeDriver bằng selenium-wire hoặc Chrome Extension.
Công cụ miễn phí
Check proxy live/die: kiểm tra proxy sống hay chết
Công cụ check proxy online miễn phí: dán tối đa 100 proxy dạng ip:port:user:pass để xem sống hay chết, IP ra và độ trễ. Hiểu rõ từng loại lỗi.
Cài đặt proxy
Hướng dẫn cài đặt Proxy trên trình duyệt Google Chrome
Hướng dẫn cấu hình proxy HTTP(S) VinaProxy riêng cho trình duyệt Google Chrome hoặc từng Profile Chrome mà không làm đổi IP toàn máy tính.
Cài đặt proxy
Hướng dẫn cấu hình Proxy trên Windows 10 & Windows 11
Hướng dẫn cấu hình proxy HTTP(S) VinaProxy trên Windows 10 và Windows 11 qua System Settings, Credential Manager và PowerShell.