Skip to content
مقاله / 3 دقیقه مطالعه

دروازهٔ پروکسی چرخشی: یک نقطهٔ پایانی محلی SOCKS5 یا HTTP برای کل استخر پروکسی شما

همهٔ ابزارها را به یک نقطهٔ پایانی محلی SOCKS5 یا HTTP اشاره دهید و بگذارید یک سرویس دروازهٔ کوچک برای هر اتصال یک پروکسی بالادستی انتخاب کند — همراه با پیکربندی، نشست‌های چسبنده، بررسی سلامت، DNS و بررسی نشت.

دروازهٔ پروکسی چرخشی: یک نقطهٔ پایانی محلی SOCKS5 یا HTTP برای کل استخر پروکسی شما

پروکسی‌های چرخشی داخل کد شما تا زمانی که ابزار دوم از راه برسد خوب کار می‌کنند. حالا یک خزنده با میان‌افزار دارید، یک مرورگر که دستی هدایت می‌کنید، یک بررسی‌کنندهٔ رتبه در CLI با یک فیلد پروکسی واحد، و یک کار cron که شخص دیگری نوشته — هرکدام به روش خودش می‌چرخد، یا اصلاً نمی‌چرخد.

یک دروازهٔ پروکسی چرخشی آن تکرار را حذف می‌کند. یک سرویس کوچک را به‌صورت محلی (یا روی یک VPS) اجرا می‌کنید، همه‌چیز را به 127.0.0.1:8080 اشاره می‌دهید، و دروازه برای هر اتصال یک پروکسی بالادستی انتخاب می‌کند. این راهنما پوشش می‌دهد که آن سرویس چیست، چه زمانی ارزش آن پرش اضافی را دارد، چگونه یکی با پیکربندی‌ای که واقعاً می‌توانید بخوانید بسازید، و چگونه چرخش، حل DNS و رفتار نشت را قبل از اعتماد به آن در کار تولیدی اثبات کنید.

دروازهٔ پروکسی چرخشی در واقع چیست

این یک متعادل‌کنندهٔ بار برای پروکسی‌ها است. مسیر درخواست به این شکل است:

  1. کلاینت — مرورگر، curl، Scrapy، Selenium، یک اپ دسکتاپ
  2. دروازه — یک شنوندهٔ محلی HTTP یا SOCKS5 روی ماشین شما
  3. انتخاب — دروازه یکی از بالادست‌ها را از استخر شما انتخاب می‌کند
  4. گرهٔ خروجی — پروکسی بالادستی درخواست خروجی را انجام می‌دهد
  5. سایت هدف — 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 متصل شوید، اگر می‌توانید احراز هویت کنید، و یک بررسی سلامت زمان‌بندی کنید تا خروجی‌های مرده از استخر خارج شوند