پرش به محتویات

پروتکل PROXY

همهٔ قابلیت‌های هیدیفای

پروتکل PROXY یک سرآیند کوتاه در ابتدای اتصال TCP است که می‌گوید اتصال واقعاً از چه نشانی کلاینتی آمده است. sing-box اصلی آن را در نسخهٔ 1.6 حذف کرد. هیدیفای آن را در دو جا برمی‌گرداند: ورودی‌ها می‌توانند سرآیند را بخوانند (proxy_protocol در فیلدهای گوش دادن) و خروجی direct می‌تواند آن را بفرستد (proxy_protocol در "type": "direct").

چرا از آن استفاده کنیم

  • ورودی: سرور شما پشت یک load balancer، لبهٔ CDN یا رله‌ای مثل HAProxy یا nginx stream است. بدون سرآیند، همهٔ اتصال‌ها انگار از رله می‌آیند. با آن، لاگ‌ها، آمار و قاعده‌های مسیریابی روی source_ip_cidr نشانی واقعی کلاینت را می‌بینند.
  • خروجی direct: sing-box اتصال‌ها را به یک سرور پشتی می‌فرستد که منتظر سرآیند است، مثلاً nginx یا سرور پراکسی دیگری که پروتکل PROXY در آن روشن است، تا سرور پشتی نشانی کلاینت را ببیند.

چطور از فیلترینگ عبور می‌کند

عبور نمی‌دهد. فقط نشانی کلاینت را بین سرورهایی که خودتان اجرا می‌کنید جابه‌جا می‌کند.

چطور کار می‌کند

ورودی

  • وقتی proxy_protocol روشن است، ورودی در ابتدای هر اتصال TCP یک سرآیند نسخهٔ ۱ (متنی) یا نسخهٔ ۲ (دودویی) می‌خواند. مبدأ و مقصد درون سرآیند، نشانی‌های اتصال می‌شوند.
  • سرآیند باید ظرف ۱۰ ثانیه برسد. کلاینت کند بقیه را معطل نمی‌کند، چون سرآیندها هم‌زمان خوانده می‌شوند.
  • اتصالی که سرآیند معتبر ندارد بسته می‌شود. با proxy_protocol_accept_no_header، اتصالی که با سرآیند شروع نشود همان‌طور که هست با نشانی‌های واقعی‌اش استفاده می‌شود. کلاینتی که تا صحبت سرور چیزی نمی‌فرستد همچنان پس از ۱۰ ثانیه بسته می‌شود.
  • سرآیند با فرمان LOCAL (که health checkها می‌فرستند) نشانی‌های خود اتصال را نگه می‌دارد.
  • برای هر ورودی که روی TCP گوش می‌دهد کار می‌کند. روی UDP اثری ندارد.

خروجی direct

  • وقتی proxy_protocol برابر 1 یا 2 است، خروجی در ابتدای هر اتصال TCP تازه و پیش از هر داده‌ای، سرآیندی از همان نسخه می‌نویسد. روی UDP اثری ندارد.
  • مبدأ در سرآیند نشانی کلاینت اصلی است، همان‌طور که ورودی دیده است. مقصد نشانی‌ای است که خروجی به آن وصل شده است.
  • هر دو نشانی باید از یک خانواده باشند. اگر کلاینت IPv4 و مقصد IPv6 باشد یا برعکس، نشانی محلی خود خروجی به‌عنوان مبدأ به کار می‌رود. اگر هیچ جفتی جور نشود، سرآیند LOCAL فرستاده می‌شود تا سرور پشتی از نشانی‌های خود اتصال استفاده کند.
  • اگر سرآیند نوشته نشود، اتصال بسته و ناموفق می‌شود.

پیکربندی

ورودی پشت load balancer:

{
  "inbounds": [
    {
      "type": "vless",
      "tag": "vless-in",
      "listen": "::",
      "listen_port": 443,
      "proxy_protocol": true,
      "users": [{ "uuid": "<uuid>" }]
    }
  ]
}

خروجی direct که سرآیند را به سرور پشتی می‌فرستد:

{
  "outbounds": [
    {
      "type": "direct",
      "tag": "to-backend",
      "proxy_protocol": 2
    }
  ]
}
فیلد کجا نوع پیش‌فرض معنی
proxy_protocol فیلدهای گوش دادن ورودی bool false در هر اتصال TCP سرآیند پروتکل PROXY را بخوان و اتصال‌های بدون سرآیند را ببند.
proxy_protocol_accept_no_header فیلدهای گوش دادن ورودی bool false سرآیند را بخوان و اتصال‌هایی را هم که با سرآیند شروع نمی‌شوند بپذیر. به‌تنهایی خواندن را روشن می‌کند.
proxy_protocol خروجی direct int 0 0 چیزی نمی‌فرستد، 1 سرآیند نسخهٔ ۱ و 2 سرآیند نسخهٔ ۲ می‌فرستد. مقدارهای دیگر خطاست.

proxy_protocol را روی ورودی فقط وقتی روشن کنید که همهٔ کلاینت‌ها از رله‌ای که سرآیند را می‌فرستد به آن برسند. وگرنه هر کسی می‌تواند سرآیند بفرستد و هر نشانی مبدأی را ادعا کند.

همچنین ببینید


اخرین بروزرسانی: 26 فوریهٔ 2026

نظرات