رفع خطای ERR_TUNNEL_CONNECTION_FAILED هنگام استفاده از پروکسی
Updated:
برای بارگذاری یک صفحه https:// از طریق پروکسی، مرورگر یک درخواست CONNECT ارسال میکند و منتظر میماند تا پروکسی یک تونل به سایت باز کند. خطای ERR_TUNNEL_CONNECTION_FAILED زمانی رخ میدهد که پروکسی به جای موافقت، با یک خطا به این درخواست پاسخ دهد. مشکل اینجاست که Chrome نوع خطا را به شما اعلام نمیکند، بنابراین اولین کار پیدا کردن کد خطای واقعی است.
دو موردی که بازتولید کردیم
هر دو مورد روی یک پروکسی آزمایشی اجرا شدند که در اینجا با آدرس مستنداتی 203.0.113.10:8080 و user123:pass456 بازنویسی شدهاند. در یک پنجره معمولی Chrome، خطای 407 به خطای تونل تبدیل نمیشود؛ در عوض، Chrome پنجرهای برای ورود نام کاربری و رمز عبور پروکسی باز میکند. بنابراین، خطاهای تونل ناشی از 407 بیشتر در ابزارهای اتوماسیون و برنامههایی ظاهر میشوند که امکان درخواست رمز عبور را ندارند.
| پاسخ پروکسی به CONNECT | آنچه Chrome نشان میدهد | آنچه curl نشان میدهد |
|---|---|---|
407 بدون امکان وارد کردن رمز عبور (headless Chrome) | ERR_TUNNEL_CONNECTION_FAILED | curl: (56) CONNECT tunnel failed, response 407 |
502 به دلیل عدم دسترسی پروکسی به سایت | ERR_TUNNEL_CONNECTION_FAILED | curl: (56) CONNECT tunnel failed, response 502 |
علتها، به ترتیب احتمال
- اسکریپت اتوماسیون اطلاعات ورود را ارسال نمیکند. فلگ
--proxy-serverدر Chrome فقط host و port را میپذیرد، نه user:pass را. نسخه headless برنامههای 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 روشهای کاربردی را نشان میدهد.
- Chrome در Windows: اگر پنجره ورود هرگز ظاهر نمیشود، بررسی کنید آیا یک افزونه پروکسی مانع از نمایش آن میشود یا خیر، سپس در پنجرهای بدون افزونه مجدداً امتحان کنید.
- گوشیهای موبایل: برای برنامههایی که به پروکسی دارای احراز هویت نیاز دارند، از یک برنامه پروکسی با پشتیبانی از 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 یک تونل باز میکند، بنابراین خطاهای تونل فقط در آن رخ میدهند.
علت خطای ERR_TUNNEL_CONNECTION_FAILED در Android چیست؟
در اغلب موارد، برنامهای که نمیتواند نام کاربری و رمز عبور را به پروکسی Wi-Fi ارسال کند. همان صفحه را در Chrome برای Android امتحان کنید؛ اگر Chrome توانست درخواست مشخصات داده و صفحه را باز کند، مشکل از برنامه است.
آیا میتوان user:pass را درون --proxy-server قرار داد؟
خیر. Chrome اطلاعات ورود در این فلگ را نادیده میگیرد که منجر به خطای 407 و خطای تونل میشود. در عوض از طریق Puppeteer، Playwright یا یک افزونه احراز هویت کنید.
آیا تغییر به SOCKS5 خطای تونل را برطرف میکند؟
تنها در صورتی که سفارش شما SOCKS5 باشد. VinaProxy هر دو پروتکل HTTP(S) و SOCKS5 را ارائه میدهد؛ پروتکلی را انتخاب کنید که سفارشتان در پنل نشان میدهد، زیرا عدم تطابق باعث خطاهای متفاوتی میشود.
پروکسیهایی سازگار با Puppeteer و Playwright
پروکسیهای VinaProxy از ورود استاندارد با user:pass استفاده میکنند که کتابخانههای معروف اتوماسیون به صورت پیشفرض از آن پشتیبانی میکنند.
مشاهده قیمتها