دروازهٔ پروکسی چرخشی: یک نقطهٔ پایانی محلی SOCKS5 یا HTTP برای کل استخر پروکسی شما
همهٔ ابزارها را به یک نقطهٔ پایانی محلی SOCKS5 یا HTTP اشاره دهید و بگذارید یک سرویس دروازهٔ کوچک برای هر اتصال یک پروکسی بالادستی انتخاب کند — همراه با پیکربندی، نشستهای چسبنده، بررسی سلامت، DNS و بررسی نشت.
دروازهٔ پروکسی چرخشی: یک نقطهٔ پایانی محلی SOCKS5 یا HTTP برای کل استخر پروکسی شما
پروکسیهای چرخشی داخل کد شما تا زمانی که ابزار دوم از راه برسد خوب کار میکنند. حالا یک خزنده با میانافزار دارید، یک مرورگر که دستی هدایت میکنید، یک بررسیکنندهٔ رتبه در CLI با یک فیلد پروکسی واحد، و یک کار cron که شخص دیگری نوشته — هرکدام به روش خودش میچرخد، یا اصلاً نمیچرخد.
یک دروازهٔ پروکسی چرخشی آن تکرار را حذف میکند. یک سرویس کوچک را بهصورت محلی (یا روی یک VPS) اجرا میکنید، همهچیز را به 127.0.0.1:8080 اشاره میدهید، و دروازه برای هر اتصال یک پروکسی بالادستی انتخاب میکند. این راهنما پوشش میدهد که آن سرویس چیست، چه زمانی ارزش آن پرش اضافی را دارد، چگونه یکی با پیکربندیای که واقعاً میتوانید بخوانید بسازید، و چگونه چرخش، حل DNS و رفتار نشت را قبل از اعتماد به آن در کار تولیدی اثبات کنید.
دروازهٔ پروکسی چرخشی در واقع چیست
این یک متعادلکنندهٔ بار برای پروکسیها است. مسیر درخواست به این شکل است:
- کلاینت — مرورگر،
curl، Scrapy، Selenium، یک اپ دسکتاپ - دروازه — یک شنوندهٔ محلی HTTP یا SOCKS5 روی ماشین شما
- انتخاب — دروازه یکی از بالادستها را از استخر شما انتخاب میکند
- گرهٔ خروجی — پروکسی بالادستی درخواست خروجی را انجام میدهد
- سایت هدف — IP گرهٔ خروجی را میبیند، نه IP شما را
دروازه باعث نمیشود پروکسی سریعتر، خصوصیتر یا قابلاعتمادتر شود. این انتخاب، اعتبارنامهها و سلامت را متمرکز میکند، که مسئلهای متفاوت از آنی است که چرخش سمت کلاینت حل میکند.
چه زمانی دروازه از چرخش داخل کد شما بهتر است
از دروازه استفاده کنید وقتی:
- چندین ابزار به پروکسی نیاز دارند و فقط برخی از آنها از چرخش بهصورت بومی پشتیبانی میکنند
- میخواهید یک مکان برای بهروزرسانی اعتبارنامهها داشته باشید وقتی ارائهدهنده رمز عبور یا پورت شما را میچرخاند
- به نشستهای چسبنده برای جریانهای واردشده و چرخش بهازای هر درخواست برای خزش، در کنار هم نیاز دارید
- میخواهید یک نقطهٔ واحد برای اجرای بررسی سلامت، تشخیص مسدودسازی و امتیازدهی بالادستی داشته باشید
- میخواهید رفتار DNS یکسان در کلاینتها داشته باشید نه عجایب هر کتابخانه
- ممکن است بعداً بار کاری را از لپتاپ به VPS یا اجراکنندهٔ CI منتقل کنید
از دروازه صرفنظر کنید وقتی:
- دقیقاً یک کلاینت دارید و از قبل میانافزار خوبی دارد (مثلاً میانافزار پروکسی چرخشی Scrapy)
- چرخش به قوانین کسبوکار بهازای هر درخواست بستگی دارد — هدف جغرافیایی، حساب، سطح قیمت
- به تأخیر و آمار شکست بهازای هر درخواست برای همان بالادستی استفادهشده نیاز دارید، و دروازه شما آن را ارائه نمیدهد
پرش اضافی کمی تأخیر هزینه دارد. برای بیشتر خودکارسازیها این در مقایسه با زمان پاسخ خود گرهٔ خروجی یک خطای گردکردن است.
قبل از هر چیز پروتکل شنونده را انتخاب کنید
| شنونده | پشتیبانی کلاینت | احراز هویت | رفتار DNS | مراقب چه چیزی باشید |
|---|---|---|---|---|
| HTTP (CONNECT) | تقریباً جهانی، از جمله اپهایی که فقط فیلد «HTTP proxy» دارند | احراز هویت پایه بهطور گسترده پشتیبانی میشود | به کانکتور بالادستی بستگی دارد | درخواستهای HTTP ساده در دروازه قابل خواندن هستند؛ برخی ابزارها URLهای مطلق میفرستند |
| SOCKS5 | مرورگرها با فلگهای اینجا و آنجا، curl، بیشتر خزندهها و ابزارهای CLI |
نام کاربری/رمز عبور (RFC 1929) | نام میزبان میتواند برای حل از راه دور به بالادستی ارسال شود | دیالوگهای پروکسی سیستم در iOS و Android گزینهٔ SOCKS5 ندارند |
اگر مطمئن نیستید، هر دو شنونده را روی همان استخر روی دو پورت اجرا کنید. چیزی جز یک بلوک پیکربندی اضافی از دست نمیرود.
یک جزئیات DNS بیشتر از آنچه انتظار میرود مهم است. اگر دروازه نام میزبان هدف را خودش حل کند، نتایج دقیق از نظر جغرافیایی بازتابدهندهٔ resolver دروازه هستند، نه موقعیت گرهٔ خروجی. ارسال نام میزبان به پاییندست — رفتار سبک socks5h — حل را در گرهٔ خروجی نگه میدارد، که همان چیزی است که برای دادههای حساس به موقعیت میخواهید.
ساختن یکی با gost
gost یک باینری تک Go است که HTTP، SOCKS5 صحبت میکند و میتواند زنجیرهای کند یا لیستی از گرههای بالادستی را متعادل کند. نسخه مهم است: خط v3 از یک فایل پیکربندی YAML استفاده میکند، در حالی که انتشارهای قدیمیتر به فلگهای خط فرمان تکیه داشتند. اول تأیید کنید چه دارید.
curl -s https://api.github.com/repos/go-gost/gost/releases/latest | grep tag_name
gost -V
در اینجا یک راهاندازی چرخش حداقلی با دو خروجی SOCKS5 بالادستی آمده است که هم بهعنوان شنوندهٔ HTTP و هم SOCKS5 در معرض دید قرار میگیرد:
services:
- name: pool-http
addr: ":8080"
handler:
type: http
chain: pool
listener:
type: tcp
- name: pool-socks
addr: ":1080"
handler:
type: socks5
chain: pool
listener:
type: tcp
chains:
- name: pool
hops:
- name: hop-0
selector:
strategy: round
nodes:
- name: exit-a
addr: 203.0.113.10:1080
connector:
type: socks5
metadata:
username: user
password: pass
- name: exit-b
addr: 203.0.113.11:1080
connector:
type: socks5
metadata:
username: user
password: pass
آن را در پیشزمینه اجرا کنید تا زمانی که تست میکنید:
gost -C /etc/gost/gateway.yaml
استراتژیهای انتخاب بین بیلدها متفاوت هستند — round گرهها را به ترتیب دور میزند، و برخی نسخهها انتخاب تصادفی یا مبتنی بر هش را اضافه میکنند. مستندات انتخابگر را برای انتشار دقیق خود بررسی کنید نه اینکه فرض کنید یک نام استراتژی وجود دارد؛ اگر ویژگی موردنیاز شما وجود ندارد، ترفند پورت بهازای هر استراتژی در بخش بعدی معمولاً به هر حال شما را به آنجا میرساند.
برای هر چیز طولانیمدت، یک فایل unit از پنجرهٔ ترمینال بهتر است:
[Unit]
Description=Rotating proxy gateway
After=network-online.target
[Service]
ExecStart=/usr/local/bin/gost -C /etc/gost/gateway.yaml
Restart=on-failure
User=gost
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
نشستهای چسبنده بدون یک ویژگی خاص
بسیاری از کارها خلاف چرخش را میخواهند: یک جریان تسویه حساب، یک داشبورد احراز هویتشده، یا یک فرم چندمرحلهای به همان IP خروجی برای چند دقیقه نیاز دارد. بهجای دنبال کردن یک فلگ نشست چسبنده، دو شنونده را روی دو زنجیره اجرا کنید — یکی متعادل، یکی پینشده.
services:
- name: pool-http
addr: ":8080"
handler:
type: http
chain: pool
listener:
type: tcp
- name: pinned-http
addr: ":8081"
handler:
type: http
chain: pinned
listener:
type: tcp
chains:
- name: pool
hops:
- name: hop-0
selector:
strategy: round
nodes:
- name: exit-a
addr: 203.0.113.10:1080
connector:
type: socks5
- name: exit-b
addr: 203.0.113.11:1080
connector:
type: socks5
- name: pinned
hops:
- name: hop-0
nodes:
- name: exit-a
addr: 203.0.113.10:1080
connector:
type: socks5
پورت 8080 برای خزش میچرخد، پورت 8081 برای کار نشست روی یک خروجی میماند. برای پین کردن یک خروجی متفاوت، یک آدرس را تغییر دهید و دوباره بارگذاری کنید. همین الگو برای رهگیری رتبه به شما دروازههای بهازای هر کشور میدهد: یک پورت برای هر کشور هدف، هرکدام پینشده به خروجیهای همان کشور.
بررسی چرخش، DNS و نشتها
هرگز فرض نکنید که دروازه همان کاری را میکند که پیکربندی میگوید. دو دقیقه بررسی، یک هفته دادهٔ گیجکننده را ذخیره میکند.
با یک حلقهٔ shell روی شنوندهٔ HTTP شروع کنید:
for i in 1 2 3 4 5; do
curl -s --max-time 15 --proxy http://127.0.0.1:8080 https://api.ipify.org?format=json
echo
done
پنج اجرا باید بیش از یک IP خروجی نشان دهند. اگر هر خط یکسان است، انتخابگر شما نمیچرخد، یا فقط یک گرهٔ سالم دارید.
سپس همان چیز را از کتابخانههای کلاینتی که واقعاً استفاده میکنید تأیید کنید:
import requests
GATEWAY = "http://127.0.0.1:8080"
proxies = {"http": GATEWAY, "https": GATEWAY}
for i in range(5):
r = requests.get(
"https://www.cloudflare.com/cdn-cgi/trace",
proxies=proxies,
timeout=20,
)
trace = dict(line.split("=", 1) for line in r.text.strip().splitlines())
print(i, trace.get("ip"), trace.get("loc"))
فیلد loc به شما میگوید Cloudflare کشور مبدأ درخواست را کجا دیده است — برای گرفتن دروازهای مفید است که بیصدا DNS را محلی حل میکند و ترافیک را در منطقهٔ اشتباه فرود میآورد.
برای شنوندههای SOCKS5، دو شکل نام میزبان را عمداً مقایسه کنید:
curl -s --proxy socks5h://127.0.0.1:1080 https://api.ipify.org
curl -s --proxy socks5://127.0.0.1:1080 https://api.ipify.org
هر دو باید به اینترنت برسند؛ تفاوت این است که آیا نام میزبان یا آدرس حلشده به گرهٔ خروجی سفر میکند. برای کار حساس به موقعیت جغرافیایی، حل از راه دور همان چیزی است که میخواهید، و باید سرتاسری پشتیبانی شود — هم دروازه و هم بالادستی.
یک چکلیست کوتاه نشت:
- هیچ پاسخی هرگز نباید IP واقعی اختصاصدادهشده توسط ISP شما را نشان دهد
- اجراهای مکرر باید تنوع نشان دهند (یا یک ثابت عمدی، برای پورتهای پینشده)
- فیلدهای جغرافیایی باید با استخری که پیکربندی کردهاید مطابقت داشته باشند، نه موقعیت خودتان
- تستهای مبتنی بر مرورگر به بررسی جداگانهٔ WebRTC و DNS نیاز دارند — یک دروازه نمیتواند نشتهای WebRTC را برطرف کند
- بالادستهای احراز هویتشده باید با صدای بلند شکست بخورند، نه اینکه بیصدا به اتصال مستقیم بازگردند
عملیات آن: سختسازی، بررسی سلامت، و صداقت درباره محدودیتها
یک دروازهٔ کارآمد آسان است. یک دروازهٔ امن چند تصمیم اضافی میطلبد:
- بهصورت پیشفرض به
127.0.0.1متصل شود. یک پروکسی بدون احراز هویت روی0.0.0.0همان لحظهای که فایروال شما لغزش کند یک رلهٔ باز است. - اگر بیلد شما از احراز هویت شنونده پشتیبانی میکند، آن را روشن کنید. اگر نه، از طریق یک تونل SSH به دروازه برسید نه اینکه پورت را در معرض دید قرار دهید.
- اعتبارنامهها را در یک فایل با مجوزهای محدود نگه دارید، نه پراکنده در اسکریپتها.
- چرخش لاگ اضافه کنید، و قبل از ثبت URLهای کامل اگر ترافیک به هر چیز حساسی دست میزند دو بار فکر کنید.
- به یاد داشته باشید دروازه ظرفیت اضافه نمیکند. محدودیتهای همزمانی استخر بالادستی شما هنوز سقف است.
یک بررسی سلامت ساده از یک بررسی هوشمندانه بهتر است. این اسکریپت بالادستهای مرده را علامتگذاری میکند تا بتوانید آنها را از پیکربندی حذف کنید:
#!/usr/bin/env bash
while read -r host port; do
if curl -s --max-time 8 --proxy "socks5h://${host}:${port}" https://api.ipify.org >/dev/null; then
echo "ok ${host}:${port}"
else
echo "dead ${host}:${port}"
fi
done < upstreams.txt
آن را طبق یک زمانبندی اجرا کنید، ورودیهای مرده را فیلتر کنید، و دوباره بارگذاری کنید. همین یک عادت بیشتر صبحهای «چرا خزندهٔ من ناگهان مسدود شد» را جلوگیری میکند.
در نهایت، در محدوده بمانید: فقط از پروکسیهایی استفاده کنید که مجاز به استفاده از آنها هستید، و به شرایط هر سایت هدف، دستورالعملهای robots و محدودیتهای نرخ احترام بگذارید. یک دروازه ارسال ترافیک را آسانتر میکند — ترافیک ناخواسته را قابل قبول نمیکند.
این چگونه با ابزارهایی که از قبل اجرا میکنید جور میشود
اگر یک کتابخانه از قبل خوب میچرخد، آن را نگه دارید. دروازه مکمل میانافزار بهازای هر درخواست در requests پایتون، Scrapy یا Selenium است نه جایگزین آن؛ ابزارهایی را پوشش میدهد که اصلاً داستان چرخشی ندارند، و به بارهای کاری سبک رهگیر رتبه یک خروجی پینشده بهازای هر کشور میدهد. اگر بهطور خاص در حال سنجش چرخش سمت کلاینت در برابر دروازه برای خزش هستید، راهنمای پروکسیهای چرخشی ما برای خزش وب الگوهای میانافزار را پوشش میدهد، و راهنمای گامبهگام پروکسیهای چرخشی Selenium محدودیتهای راهاندازی مرورگر را پوشش میدهد که در وهلهٔ اول یک دروازه را جذاب میکند.
نسخهٔ کوتاه
- یک دروازهٔ پروکسی چرخشی یک متعادلکنندهٔ بار محلی برای پروکسیها است: یک نقطهٔ پایانی، بسیاری بالادستی
- هم یک شنوندهٔ HTTP و هم یک شنوندهٔ SOCKS5 اجرا کنید؛ یک پورت دوم پینشده به یک گره برای کار چسبنده اجرا کنید
- وقتی موقعیت مهم است، حل DNS را در گرهٔ خروجی نگه دارید
- قبل از اعتماد به راهاندازی، با یک حلقه روی
api.ipify.orgوcdn-cgi/traceبررسی کنید - به localhost متصل شوید، اگر میتوانید احراز هویت کنید، و یک بررسی سلامت زمانبندی کنید تا خروجیهای مرده از استخر خارج شوند