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

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

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

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

پروکسی از پروتکل مورد نیاز پشتیبانی نمی‌کند: چه باید کرد

شما پروکسی را تنظیم کرده‌اید، اسکریپت را اجرا کرده‌اید و با خطای «Protocol not supported» یا «Connection refused» مواجه شده‌اید. مشکل عدم سازگاری پروتکل‌ها رایج‌تر از آن چیزی است که به نظر می‌رسد. در اینجا بررسی می‌کنیم که چرا این اتفاق می‌افتد و چگونه می‌توانیم بدون تغییر ارائه‌دهنده، مشکل را حل کنیم.

پروتکل‌های مورد استفاده پروکسی‌ها

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

پروتکل پورت‌های پیش‌فرض ویژگی‌ها
HTTP 80, 8080, 3128 فقط ترافیک HTTP، قابلیت تغییر هدرها
HTTPS (CONNECT) 443, 8443 تونل‌سازی از طریق HTTP CONNECT، رمزنگاری
SOCKS4 1080 اتصالات TCP، بدون احراز هویت، بدون UDP
SOCKS5 1080, 1081 TCP و UDP، احراز هویت، DNS از طریق پروکسی

تداخل‌های رایج:

  • Selenium و Puppeteer نیاز به HTTP/HTTPS دارند، اما شما SOCKS5 دارید.
  • بات‌های تلگرام از طریق SOCKS5 کار می‌کنند، اما پروکسی فقط HTTP پشتیبانی می‌کند.
  • کلاینت‌های تورنت به SOCKS5 با UDP نیاز دارند، اما پروکسی SOCKS4 است.
  • برنامه‌های بازی به UDP نیاز دارند، اما پروکسی HTTP آن را پشتیبانی نمی‌کند.

تشخیص: تعیین پروتکل پروکسی

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

بررسی با curl

تست پروتکل HTTP:

# پروکسی HTTP
curl -x http://proxy_ip:port http://httpbin.org/ip

# با احراز هویت
curl -x http://user:pass@proxy_ip:port http://httpbin.org/ip

تست SOCKS5:

# پروکسی SOCKS5
curl -x socks5://proxy_ip:port http://httpbin.org/ip

# SOCKS5 با DNS از طریق پروکسی (socks5h)
curl -x socks5h://proxy_ip:port http://httpbin.org/ip

اگر دستور آدرس IP پروکسی را برگرداند، پروتکل به درستی تشخیص داده شده است. اگر خطای Connection refused یا Unsupported proxy دریافت کردید، پروتکل اشتباه است.

بررسی با Python

import requests

proxy_ip = "proxy_ip:port"

# تست HTTP
try:
    r = requests.get("http://httpbin.org/ip", 
                     proxies={"http": f"http://{proxy_ip}"}, 
                     timeout=10)
    print(f"HTTP کار می‌کند: {r.json()}")
except Exception as e:
    print(f"HTTP کار نمی‌کند: {e}")

# تست SOCKS5 (نیاز به pip install requests[socks])
try:
    r = requests.get("http://httpbin.org/ip", 
                     proxies={"http": f"socks5://{proxy_ip}"}, 
                     timeout=10)
    print(f"SOCKS5 کار می‌کند: {r.json()}")
except Exception as e:
    print(f"SOCKS5 کار نمی‌کند: {e}")

تشخیص خودکار

اسکریپت برای پیمایش پروتکل‌ها:

import requests

def detect_protocol(proxy_address):
    protocols = ["http", "https", "socks4", "socks5", "socks5h"]
    
    for proto in protocols:
        try:
            proxies = {
                "http": f"{proto}://{proxy_address}",
                "https": f"{proto}://{proxy_address}"
            }
            r = requests.get("http://httpbin.org/ip", 
                           proxies=proxies, timeout=5)
            if r.status_code == 200:
                return proto
        except:
            continue
    return None

result = detect_protocol("proxy_ip:port")
print(f"پروتکل کشف شده: {result}")

تبدیل HTTP به SOCKS و بالعکس

اگر پروکسی پروتکلی را پشتیبانی کند که نرم‌افزار شما نیاز دارد، از یک مبدل محلی استفاده کنید.

Privoxy: HTTP به SOCKS

Privoxy درخواست‌های HTTP را دریافت کرده و آن‌ها را از طریق پروکسی SOCKS هدایت می‌کند.

نصب:

# Ubuntu/Debian
sudo apt install privoxy

# macOS
brew install privoxy

# Windows — از وب‌سایت رسمی دانلود کنید

تنظیمات (فایل /etc/privoxy/config):

# گوش دادن روی پورت محلی 8118 (HTTP)
listen-address 127.0.0.1:8118

# هدایت به SOCKS5 خارجی
forward-socks5 / socks_proxy_ip:1080 .

# با احراز هویت
forward-socks5 / user:pass@socks_proxy_ip:1080 .

اکنون نرم‌افزار شما به 127.0.0.1:8118 از طریق HTTP متصل می‌شود و ترافیک از طریق SOCKS5 خارجی عبور می‌کند.

Gost: مبدل جهانی

Gost ابزاری قدرتمند برای هرگونه تبدیل پروتکل است.

# پروکسی HTTP در ورودی → SOCKS5 در خروجی
gost -L http://:8080 -F socks5://socks_proxy_ip:1080

# SOCKS5 در ورودی → HTTP در خروجی
gost -L socks5://:1080 -F http://http_proxy_ip:8080

# با احراز هویت در هر دو طرف
gost -L http://local_user:local_pass@:8080 \
     -F socks5://remote_user:remote_pass@proxy_ip:1080

مبدل مبتنی بر Python

مبدل ساده برای وظایف کوچک:

# pip install pproxy
# HTTP در ورودی، SOCKS5 در خروجی
pproxy -l http://:8080 -r socks5://proxy_ip:1080

# SOCKS5 در ورودی، HTTP در خروجی  
pproxy -l socks5://:1080 -r http://proxy_ip:8080

تنظیم تونل‌های محلی

گاهی اوقات تبدیل کافی نیست و به یک تونل کامل نیاز دارید.

تونل SSH از طریق پروکسی HTTP

اگر سرور SSH و پروکسی HTTP دارید، می‌توانید یک SOCKS5 ایجاد کنید:

# ایجاد SOCKS5 روی localhost:1080 از طریق پروکسی HTTP
ssh -D 1080 -o ProxyCommand="nc -X connect -x http_proxy:8080 %h %p" user@ssh_server

Stunnel برای HTTPS

اگر به پروکسی HTTPS نیاز دارید اما فقط HTTP در دسترس است:

# stunnel.conf
[https-proxy]
client = yes
accept = 127.0.0.1:8443
connect = http_proxy_ip:8080
protocol = connect
protocolHost = target_host:443

تنظیم نرم‌افزار برای پروتکل موجود

گاهی اوقات ساده‌تر است که نرم‌افزار را با پروتکل موجود تنظیم کنیم تا اینکه تبدیل انجام دهیم.

Selenium با پروتکل‌های مختلف

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

# پروکسی HTTP (روش استاندارد)
options = Options()
options.add_argument('--proxy-server=http://proxy_ip:8080')

# پروکسی SOCKS5
options.add_argument('--proxy-server=socks5://proxy_ip:1080')

# برای فایرفاکس با SOCKS5
from selenium.webdriver.firefox.options import Options as FirefoxOptions
profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.socks", "proxy_ip")
profile.set_preference("network.proxy.socks_port", 1080)
profile.set_preference("network.proxy.socks_version", 5)

aiohttp با SOCKS

# pip install aiohttp-socks
import aiohttp
from aiohttp_socks import ProxyConnector

async def fetch_with_socks():
    connector = ProxyConnector.from_url('socks5://proxy_ip:1080')
    async with aiohttp.ClientSession(connector=connector) as session:
        async with session.get('http://httpbin.org/ip') as response:
            return await response.json()

بات‌های تلگرام از طریق HTTP

اگر کتابخانه تلگرام به SOCKS5 نیاز دارد اما شما HTTP دارید:

# python-telegram-bot با پروکسی HTTP
from telegram.ext import ApplicationBuilder

application = (
    ApplicationBuilder()
    .token("YOUR_TOKEN")
    .proxy_url("http://proxy_ip:8080")  # با HTTP کار می‌کند
    .build()
)

نکته: بسیاری از کتابخانه‌های مدرن از هر دو پروتکل پشتیبانی می‌کنند. مستندات را بررسی کنید — شاید کافی باشد که طرح URL را از socks5:// به http:// تغییر دهید.

نحوه انتخاب پروکسی با پروتکل مناسب

برای جلوگیری از مشکلات پروتکل، الزامات خود را از قبل مشخص کنید.

ماتریس سازگاری

وظیفه پروتکل پیشنهادی دلیل
وب‌خراشی (Web Scraping) HTTP/HTTPS پشتیبانی گسترده، تنظیم آسان
اتوماسیون مرورگر HTTP یا SOCKS5 بستگی به مرورگر و فریم‌ورک دارد
بات‌های تلگرام، دیسکورد SOCKS5 الزامات کتابخانه‌ها
تورنت SOCKS5 با UDP DHT و PEX از UDP استفاده می‌کنند
بازی‌ها، VoIP SOCKS5 با UDP تأخیر کم، ترافیک UDP
درخواست‌های API HTTP/HTTPS APIهای REST از طریق HTTP کار می‌کنند

نکاتی که هنگام انتخاب ارائه‌دهنده باید در نظر بگیرید

  • لیست پروتکل‌های پشتیبانی شده — باید به وضوح ذکر شده باشد.
  • قابلیت تعویض — برخی ارائه‌دهندگان دسترسی به یک IP را از طریق پورت‌ها/پروتکل‌های مختلف ارائه می‌دهند.
  • پشتیبانی از UDP برای SOCKS5 — همه پروکسی‌های SOCKS5 از UDP پشتیبانی نمی‌کنند.
  • مستندات تنظیم — نمونه‌هایی برای زبان‌ها و ابزارهای مختلف.

پروکسی‌های مسکونی (Residential) معمولاً از HTTP/HTTPS و SOCKS5 به طور همزمان پشتیبانی می‌کنند که اکثر مشکلات سازگاری را برطرف می‌سازد. پروکسی‌های دیتاسنتر اغلب به HTTP/HTTPS محدود می‌شوند.

چک‌لیست قبل از خرید

  1. تعیین کنید نرم‌افزار شما به چه پروتکلی نیاز دارد.
  2. بررسی کنید که آیا به UDP نیاز دارید (بازی‌ها، تورنت، VoIP).
  3. از ارائه‌دهنده در مورد پشتیبانی از پروتکل مورد نظر سؤال کنید.
  4. دسترسی آزمایشی برای بررسی سازگاری درخواست کنید.
  5. یک برنامه پشتیبان (مبدل محلی) آماده کنید.

نتیجه‌گیری

عدم سازگاری پروتکل‌ها مشکلی قابل حل است. در بیشتر موارد، یک مبدل محلی مانند Privoxy یا Gost کافی است. برای پروژه‌های بلندمدت، بهتر است پروکسی را انتخاب کنید که از ابتدا از پروتکل مورد نیاز پشتیبانی کند.

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

```