بازگشت به وبلاگ

راهنمای کامل حل مشکلات احراز هویت پروکسی

چرا پروکسی 407 برمی‌گرداند یا اتصال را قطع می‌کند؟ دلایل خطاهای احراز هویت را بررسی کرده و نحوه تشخیص و رفع آن‌ها را نشان می‌دهیم.

📅۱۹ آذر ۱۴۰۴
```html

راهنمای کامل رفع مشکلات احراز هویت پروکسی

کد 407، قطع شدن اتصال، یا تایم‌اوت هنگام اتصال — آیا این علائم آشنا هستند؟ خطاهای احراز هویت پروکسی دائماً رخ می‌دهند، اما در 90 درصد موارد در عرض چند دقیقه حل می‌شوند. دلایل این خطاها را بررسی کرده و روش‌های مشخصی برای تشخیص و رفع آن‌ها ارائه می‌دهیم.

نحوه کارکرد احراز هویت پروکسی

قبل از جستجوی خطا، درک مکانیسم آن مهم است. سرورهای پروکسی از دو روش اصلی برای احراز هویت استفاده می‌کنند:

احراز هویت بر اساس نام کاربری و رمز عبور (Basic Auth) — کلاینت یک هدر Proxy-Authorization حاوی اطلاعات ورود رمزگذاری شده با Base64 ارسال می‌کند. این روش استاندارد برای پروکسی‌های HTTP است.

احراز هویت بر اساس IP (IP Whitelist) — سرور آدرس IP کلاینت را در لیست سفید بررسی می‌کند. نیازی به نام کاربری نیست؛ اگر IP شما در لیست باشد، دسترسی مجاز است.

برای پروکسی‌های SOCKS5، ساختار مشابه است، اما احراز هویت در سطح پروتکل و نه از طریق هدرهای HTTP انجام می‌شود.

خطاهای رایج و معنای آن‌ها

خطا معنی دلیل احتمالی
407 Proxy Authentication Required پروکسی نیاز به احراز هویت دارد اطلاعات ورود ارسال نشده یا اشتباه است
403 Forbidden دسترسی ممنوع است IP در لیست سفید نیست، اشتراک منقضی شده است
Connection reset اتصال قطع شد پروتکل اشتباه، مسدود شدن توسط فایروال
Connection timeout تایم‌اوت اتصال هاست/پورت اشتباه، مشکلات شبکه
SOCKS5 auth failed خطای احراز هویت SOCKS اطلاعات ورود اشتباه یا عدم سازگاری روش

مشکلات مربوط به اطلاعات ورود (Credentials)

شایع‌ترین دلیل خطای 407، یک اشتباه تایپی ساده یا اشتباه گرفتن اطلاعات است. موارد زیر را بررسی کنید:

  • کپی کردن همراه با فاصله — هنگام کپی کردن از پنل مدیریت، ممکن است فاصله‌های نامرئی در ابتدا یا انتهای رشته کپی شوند.
  • حساسیت به حروف بزرگ و کوچک (Case Sensitivity) — نام کاربری و رمز عبور به حروف بزرگ و کوچک حساس هستند.
  • اشتباه گرفتن اکانت‌ها — اطلاعات ورود به پنل کاربری و اطلاعات مخصوص پروکسی معمولاً متفاوت هستند.
  • انقضای اشتراک — اشتراک شما به پایان رسیده است، اما اطلاعات ورود هنوز معتبر به نظر می‌رسند.

یک تست سریع — سعی کنید با استفاده از curl احراز هویت کنید:

curl -v -x http://user:password@proxy.example.com:8080 https://httpbin.org/ip

فلگ -v کل فرآیند اتصال، از جمله پاسخ سرور پروکسی، را نمایش می‌دهد.

لیست سفید IP: تله‌ها و دام‌ها

احراز هویت بر اساس IP راحت به نظر می‌رسد — نیازی به ارسال رمز عبور در کد نیست. اما این روش هم تله‌های خاص خود را دارد:

IP پویا (Dynamic IP). ارائه‌دهندگان خانگی اینترنت، IP را هنگام قطع و وصل مجدد روتر یا طبق برنامه زمانی تغییر می‌دهند. دیروز کار می‌کرد، امروز نه (خطای 403).

NAT و IP مشترک. اگر پشت NAT سازمانی هستید، IP خارجی شما توسط ده‌ها همکار به اشتراک گذاشته می‌شود. افزودن چنین IP به لیست سفید، یک حفره امنیتی است.

VPN و سرورهای ابری. IP سرور مجازی شما ممکن است هنگام مهاجرت یا راه‌اندازی مجدد تغییر کند. ارائه‌دهندگان ابری مانند AWS، Google Cloud و غیره، بدون IP استاتیک (Static IP) این ثبات را تضمین نمی‌کنند.

نحوه پیدا کردن IP خارجی فعلی شما:

curl https://api.ipify.org
# یا
curl https://ifconfig.me

نتیجه را با IP موجود در لیست سفید ارائه‌دهنده پروکسی مقایسه کنید.

مشکلات رمزگذاری و کاراکترهای خاص در رمز عبور

اگر رمز عبور حاوی کاراکترهای خاصی مانند @، :، #، یا % باشد، ممکن است ساختار URL پروکسی را خراب کند. کاراکتر @ به ویژه مشکل‌ساز است، زیرا برای جدا کردن اطلاعات ورود از هاست استفاده می‌شود.

مثال مشکل: رمز عبور p@ss:word در رشته http://user:p@ss:word@proxy.com:8080 به درستی تجزیه (Parse) نخواهد شد.

راه‌حل — کدگذاری URL کاراکترهای خاص:

کاراکتر کدگذاری
@ %40
: %3A
# %23
% %25
/ %2F

رمز عبور p@ss:word تبدیل می‌شود به p%40ss%3Aword.

در پایتون، کدگذاری به صورت خودکار انجام می‌شود:

from urllib.parse import quote

password = "p@ss:word"
encoded_password = quote(password, safe='')
print(encoded_password)  # p%40ss%3Aword

عیب‌یابی گام به گام

هنگامی که پروکسی کار نمی‌کند، به ترتیب زیر بررسی کنید:

گام 1: دسترسی‌پذیری سرور را بررسی کنید

# بررسی اتصال TCP
nc -zv proxy.example.com 8080

# یا با استفاده از telnet
telnet proxy.example.com 8080

اگر اتصال برقرار نشد، مشکل در سطح شبکه است: هاست یا پورت اشتباه است یا فایروال مانع شده است.

گام 2: احراز هویت را بدون برنامه بررسی کنید

# پروکسی HTTP
curl -v --proxy-user "username:password" -x http://proxy.example.com:8080 https://httpbin.org/ip

# پروکسی SOCKS5
curl -v --proxy-user "username:password" -x socks5://proxy.example.com:1080 https://httpbin.org/ip

اگر curl کار می‌کند اما برنامه شما نه، مشکل در کد یا پیکربندی برنامه شماست.

گام 3: پروتکل را بررسی کنید

خطای رایج، استفاده از کلاینت HTTP برای پروکسی SOCKS یا برعکس است. نوع پروکسی را از ارائه‌دهنده خود بپرسید:

  • پروکسی HTTP/HTTPS — از طریق هدرها کار می‌کند، پورت‌ها معمولاً 8080، 3128، 8888 هستند.
  • SOCKS4/SOCKS5 — پروتکل باینری است، پورت‌ها معمولاً 1080، 1081 هستند.

گام 4: لاگ‌های ارائه‌دهنده را بررسی کنید

بسیاری از ارائه‌دهندگان، لاگ‌های اتصال را در پنل کاربری خود نمایش می‌دهند. در آنجا می‌توانید ببینید آیا درخواست به سرور رسیده است، چه اطلاعاتی ارسال شده و چرا رد شده است.

نمونه کد برای زبان‌های مختلف

Python (requests)

import requests
from urllib.parse import quote

# کاراکترهای خاص در رمز عبور را کدگذاری کنید
username = "user123"
password = quote("p@ss:word", safe='')

proxies = {
    "http": f"http://{username}:{password}@proxy.example.com:8080",
    "https": f"http://{username}:{password}@proxy.example.com:8080"
}

try:
    response = requests.get(
        "https://httpbin.org/ip",
        proxies=proxies,
        timeout=10
    )
    print(response.json())
except requests.exceptions.ProxyError as e:
    print(f"خطای پروکسی: {e}")

Python (aiohttp برای درخواست‌های ناهمزمان)

import aiohttp
import asyncio
from aiohttp_socks import ProxyConnector

async def fetch_with_proxy():
    # برای SOCKS5
    connector = ProxyConnector.from_url(
        'socks5://user:password@proxy.example.com:1080'
    )
    
    async with aiohttp.ClientSession(connector=connector) as session:
        async with session.get('https://httpbin.org/ip') as response:
            return await response.json()

# برای پروکسی HTTP
async def fetch_with_http_proxy():
    async with aiohttp.ClientSession() as session:
        async with session.get(
            'https://httpbin.org/ip',
            proxy='http://user:password@proxy.example.com:8080'
        ) as response:
            return await response.json()

Node.js (axios)

const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');

const proxyUrl = 'http://user:password@proxy.example.com:8080';
const agent = new HttpsProxyAgent(proxyUrl);

axios.get('https://httpbin.org/ip', {
    httpsAgent: agent
})
.then(response => console.log(response.data))
.catch(error => {
    if (error.response?.status === 407) {
        console.log('خطای احراز هویت پروکسی');
    }
});

PHP (cURL)

$ch = curl_init();

curl_setopt_array($ch, [
    CURLOPT_URL => 'https://httpbin.org/ip',
    CURLOPT_PROXY => 'proxy.example.com:8080',
    CURLOPT_PROXYUSERPWD => 'user:password',
    CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if (curl_errno($ch)) {
    echo 'خطا: ' . curl_error($ch);
} elseif ($httpCode === 407) {
    echo 'خطای احراز هویت پروکسی';
} else {
    echo $response;
}

curl_close($ch);

Selenium (Python)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# برای پروکسی که نیاز به احراز هویت دارد در Selenium از افزونه استفاده می‌شود
# یک راه ساده‌تر استفاده از پروکسی با لیست سفید IP است

chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://proxy.example.com:8080')

# برای احراز هویت از طریق افزونه
# (نیاز به ایجاد manifest.json و background.js دارد)

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')

نکته: Selenium با پروکسی‌هایی که نیاز به نام کاربری/رمز عبور دارند، به خوبی کار نمی‌کند. برای اتوماسیون مرورگر، بهتر است از پروکسی‌های مسکونی (Residential) با احراز هویت مبتنی بر IP استفاده کنید تا از شر پنجره‌های پاپ‌آپ احراز هویت خلاص شوید.

ویژگی‌های انواع مختلف پروکسی

مشکلات احراز هویت ممکن است بسته به نوع پروکسی متفاوت باشد:

پروکسی‌های دیتاسنتر معمولاً از اعتبارنامه‌های ثابت استفاده می‌کنند. اگر کار نکردند، تاریخ انقضا یا محدودیت ترافیک را بررسی کنید.

پروکسی‌های مسکونی اغلب از چرخش (Rotation) استفاده می‌کنند. اطلاعات ورود ممکن است شامل پارامترهای سشن در نام کاربری باشد (مثلاً user-session-abc123). فرمت اشتباه باعث خطا می‌شود.

پروکسی‌های موبایل ممکن است برای تغییر IP به پارامترهای اضافی نیاز داشته باشند. مستندات ارائه‌دهنده را مطالعه کنید — فرمت درخواست‌های چرخش IP متفاوت است.

چک‌لیست عیب‌یابی سریع

این لیست را برای مشکلات آتی ذخیره کنید:

  1. آیا پینگ/telnet به هاست و پورت پروکسی موفقیت‌آمیز است؟
  2. آیا اطلاعات ورود بدون فاصله‌های اضافی کپی شده‌اند؟
  3. آیا کاراکترهای خاص در رمز عبور کدگذاری شده‌اند؟
  4. آیا پروتکل صحیح (HTTP در مقابل SOCKS) استفاده می‌شود؟
  5. آیا IP در لیست سفید (در صورت استفاده از احراز هویت IP) قرار دارد؟
  6. آیا اشتراک فعال است و محدودیت ترافیک تمام نشده است؟
  7. آیا curl با همان اطلاعات کار می‌کند؟

نتیجه‌گیری

اکثر خطاهای احراز هویت پروکسی با بررسی موارد اساسی حل می‌شوند: صحت اطلاعات ورود، کدگذاری کاراکترهای خاص، و تطابق IP با لیست سفید. اگر بررسی‌های ساده کمکی نکرد، از curl با فلگ -v برای عیب‌یابی دقیق‌تر استفاده کنید.

برای وظایفی مانند وب اسکرپینگ و اتوماسیون که پایداری اتصال در آن‌ها حیاتی است، استفاده از پروکسی‌های مسکونی با سیستم احراز هویت انعطاف‌پذیر راحت‌تر است — جزئیات بیشتر را در proxycove.com ببینید.

```