پروکسی از پروتکل مورد نیاز پشتیبانی نمیکند: چه باید کرد
شما پروکسی را تنظیم کردهاید، اسکریپت را اجرا کردهاید و با خطای «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 محدود میشوند.
چکلیست قبل از خرید
- تعیین کنید نرمافزار شما به چه پروتکلی نیاز دارد.
- بررسی کنید که آیا به UDP نیاز دارید (بازیها، تورنت، VoIP).
- از ارائهدهنده در مورد پشتیبانی از پروتکل مورد نظر سؤال کنید.
- دسترسی آزمایشی برای بررسی سازگاری درخواست کنید.
- یک برنامه پشتیبان (مبدل محلی) آماده کنید.
نتیجهگیری
عدم سازگاری پروتکلها مشکلی قابل حل است. در بیشتر موارد، یک مبدل محلی مانند Privoxy یا Gost کافی است. برای پروژههای بلندمدت، بهتر است پروکسی را انتخاب کنید که از ابتدا از پروتکل مورد نیاز پشتیبانی کند.
برای وظایفی که نیاز به انعطافپذیری در انتخاب پروتکل دارند، پروکسیهای مسکونی با دسترسی چند پروتکلی مناسب هستند — جزئیات بیشتر در proxycove.com.