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.
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ằng | Chrome hiện | curl hiện |
|---|---|---|
407 và không có cách nào nhập mật khẩu (Chrome headless) | ERR_TUNNEL_CONNECTION_FAILED | curl: (56) CONNECT tunnel failed, response 407 |
502 vì proxy không tới được website | ERR_TUNNEL_CONNECTION_FAILED | curl: (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-servercủ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:portkhi launch và gọipage.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
Xác định mã CONNECT
Chạy
curl -v -xvới dòng proxy hoặc dán vào checker để biết proxy trả 407 hay 502. - 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
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
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á