پاسارگارد
پنل

پیکربندی هاست

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

مستندات پیکربندی هاست

این سند نحوه پردازش و مدیریت هاست‌های پروکسی توسط PasarGuard را توضیح می‌دهد. این سند برای کمک به مبتدیان در درک نحوه کار پیکربندی هاست‌ها، مقادیری که مقادیر پیش‌فرض inbound را بازنویسی می‌کنند و نحوه نمایش هاست‌ها به کاربران در اشتراک‌ها طراحی شده است.

فهرست مطالب

  1. نمای کلی
  2. مبانی پیکربندی هاست
  3. اولویت بازنویسی مقادیر
  4. فیلدهای هاست و رفتار آنها
  5. متغیرهای فرمت برای نمایش کاربر
  6. تنظیمات انتقال
  7. وضعیت هاست و فیلترینگ
  8. محدودیت‌ها و قیود API
  9. سناریوهای رایج

نمای کلی

هاست‌ها در PasarGuard پیکربندی‌های سرور پروکسی هستند که:

  • بازنویسی مقادیر پیش‌فرض از پیکربندی‌های inbound XRay می‌کنند
  • ارائه آدرس‌های سرور، پورت‌ها و تنظیمات انتقال
  • نمایش نام‌های سفارشی (remarks) به کاربران در اشتراک‌ها
  • فیلتر اینکه کدام کاربران می‌توانند کدام هاست‌ها را بر اساس وضعیت ببینند

فرآیند تولید اشتراک

وقتی کاربر درخواست اشتراک می‌دهد، PasarGuard:

  1. بررسی inboundهای قابل دسترسی کاربر - فقط هاست‌هایی که inbound_tag آنها از طریق گروه‌های کاربر قابل دسترسی است پردازش می‌شوند
  2. بارگذاری تمام هاست‌های فعال که با وضعیت کاربر مطابقت دارند
  3. ادغام تنظیمات هاست با مقادیر پیش‌فرض inbound (مقادیر هاست اولویت دارند)
  4. فرمت کردن remarks و آدرس‌های هاست با استفاده از متغیرهای خاص کاربر
  5. انتخاب تصادفی مقادیر از لیست‌ها (SNI، host، address، port) برای هر درخواست
  6. تولید پیکربندی اشتراک

الزامات نمایش هاست

یک هاست فقط در اشتراک کاربر ظاهر می‌شود اگر:

  • inbound_tag هاست به حداقل یکی از گروه‌های کاربر اختصاص داده شده باشد
  • گروه‌های کاربر غیرفعال نباشند
  • هاست غیرفعال نباشد (is_disabled: false)
  • فیلتر status هاست (در صورت تنظیم) شامل وضعیت کاربر باشد

مبانی پیکربندی هاست

فیلدهای الزامی

هر هاست باید داشته باشد:

فیلدنوعتوضیحات
remarkstringنام نمایشی که به کاربران نشان داده می‌شود (از متغیرهای فرمت پشتیبانی می‌کند)
inbound_tagstringباید با یک تگ از یکی از پیکربندی‌های هسته XRay شما مطابقت داشته باشد. مهم: این inbound باید به گروه‌های کاربر اختصاص داده شود تا کاربران این هاست را ببینند
priorityintegerترتیب ظاهر شدن هاست‌ها در اشتراک‌ها (عدد کمتر = اولویت بالاتر)

فیلدهای اختیاری

هاست‌ها می‌توانند مقادیر پیش‌فرض inbound را برای موارد زیر بازنویسی کنند:

  • تنظیمات شبکه: address, port, sni, host, path
  • تنظیمات امنیتی: security, alpn, fingerprint, allowinsecure
  • تنظیمات انتقال: پیکربندی‌های خاص شبکه (WebSocket، gRPC و غیره)
  • ویژگی‌های پیشرفته: تنظیمات Mux، fragment، noise
  • گزینه‌های نمایش: status (کدام وضعیت‌های کاربر می‌توانند این هاست را ببینند)

اولویت بازنویسی مقادیر

هنگام تولید اشتراک‌ها، PasarGuard مقادیر را به این ترتیب ادغام می‌کند:

ترتیب اولویت (بالاترین به پایین‌ترین)

  1. پیکربندی هاست - مقادیر تنظیم شده روی هاست همه چیز را بازنویسی می‌کنند
  2. مقادیر پیش‌فرض Inbound - مقادیر از پیکربندی inbound XRay
  3. مقادیر پیش‌فرض سیستم - مقادیر fallback داخلی

نحوه کار بازنویسی‌ها

مقدار نهایی = مقدار هاست (در صورت تنظیم) یا مقدار Inbound (در صورت وجود) یا مقدار پیش‌فرض سیستم

مقدار هاست inbound را بازنویسی می‌کند:

  • Inbound دارای sni: ["example.com"] است
  • هاست دارای sni: ["host1.com", "host2.com"] است
  • نتیجه: sni: ["host1.com", "host2.com"] (مقدار هاست برنده می‌شود)

مقدار Inbound استفاده می‌شود وقتی هاست تنظیم نشده:

  • Inbound دارای port: 443 است
  • هاست دارای port: null است (تنظیم نشده)
  • نتیجه: port: 443 (مقدار inbound استفاده می‌شود)

فیلدهای هاست و رفتار آنها

فیلدهای شبکه پایه

address (مجموعه رشته‌ها)

  • هدف: آدرس‌های IP سرور یا نام‌های دامنه
  • بازنویسی: مقدار هاست مقدار inbound را به طور کامل جایگزین می‌کند
  • نمایش: به صورت تصادفی برای هر درخواست اشتراک انتخاب می‌شود
  • متغیرهای فرمت: از {SERVER_IP}, {SERVER_IPV6}, {USERNAME} و غیره پشتیبانی می‌کند
  • محدودیت: طول ترکیبی رشته حداکثر 256 کاراکتر
  • Wildcards: از * پشتیبانی می‌کند که با salt تصادفی برای هر درخواست جایگزین می‌شود

مثال:

{
  "address": ["1.2.3.4", "server.example.com", "{SERVER_IP}"]
}

port (عدد صحیح)

  • هدف: شماره پورت سرور
  • بازنویسی: پورت هاست پورت inbound را جایگزین می‌کند
  • ویژه: اگر تنظیم نشده باشد، از پورت inbound استفاده می‌کند (می‌تواند یک عدد صحیح یا رشته جدا شده با کاما مانند "8080,8443" باشد)
  • نمایش: اگر inbound دارای چندین پورت باشد، یکی به صورت تصادفی برای هر درخواست انتخاب می‌شود

مثال:

{
  "port": 443  // پورت inbound را بازنویسی می‌کند
}
// یا
{
  "port": null  // از پورت inbound استفاده می‌کند (می‌تواند چندتایی باشد)
}

sni (مجموعه رشته‌ها)

  • هدف: Server Name Indication برای TLS
  • بازنویسی: مقدار هاست لیست SNI inbound را جایگزین می‌کند
  • نمایش: به صورت تصادفی برای هر درخواست اشتراک انتخاب می‌شود
  • محدودیت: طول ترکیبی رشته حداکثر 1000 کاراکتر
  • Wildcards: از * پشتیبانی می‌کند که با salt تصادفی جایگزین می‌شود

مثال:

{
  "sni": ["example.com", "*.example.com", "cdn.example.com"]
}

host (مجموعه رشته‌ها)

  • هدف: هدر host برای انتقال‌های HTTP/WebSocket
  • بازنویسی: مقدار هاست لیست host inbound را جایگزین می‌کند
  • نمایش: به صورت تصادفی برای هر درخواست اشتراک انتخاب می‌شود
  • محدودیت: طول ترکیبی رشته حداکثر 1000 کاراکتر
  • Wildcards: از * پشتیبانی می‌کند که با salt تصادفی جایگزین می‌شود

مثال:

{
  "host": ["example.com", "www.example.com"]
}

path (رشته)

  • هدف: مسیر برای انتقال‌های WebSocket، gRPC، HTTP
  • بازنویسی: مسیر هاست مسیر inbound را در صورت تنظیم جایگزین می‌کند
  • متغیرهای فرمت: از {PROTOCOL}, {TRANSPORT}, {USERNAME} و غیره پشتیبانی می‌کند
  • پیش‌فرض: از مسیر inbound استفاده می‌کند اگر مسیر هاست تنظیم نشده باشد

مثال:

{
  "path": "/{PROTOCOL}-{TRANSPORT}/path"
}

تنظیمات امنیتی

security (Enum: ProxyHostSecurity)

  • هدف: نوع امنیت TLS/Reality
  • گزینه‌ها:
    • inbound_default - استفاده از امنیت از پیکربندی inbound
    • none - بدون رمزگذاری
    • tls - رمزگذاری TLS
    • reality - پروتکل Reality
  • بازنویسی: امنیت هاست امنیت inbound را جایگزین می‌کند (مگر اینکه به inbound_default تنظیم شده باشد)

مثال:

{
  "security": "tls"  // امنیت inbound را بازنویسی می‌کند
}
// یا
{
  "security": "inbound_default"  // از امنیت inbound استفاده می‌کند
}

alpn (لیست ProxyHostALPN)

  • هدف: Application-Layer Protocol Negotiation
  • گزینه‌ها: h3, h2, http/1.1
  • بازنویسی: لیست ALPN هاست ALPN inbound را جایگزین می‌کند
  • ویژه: به طور خودکار بر اساس اولویت مرتب می‌شود (h3 → h2 → http/1.1)
  • پیش‌فرض: از ALPN inbound استفاده می‌کند اگر تنظیم نشده باشد

مثال:

{
  "alpn": ["h3", "h2", "http/1.1"]
}

fingerprint (Enum: ProxyHostFingerprint)

  • هدف: نوع fingerprint TLS
  • بازنویسی: fingerprint هاست fingerprint inbound را جایگزین می‌کند (مگر اینکه به none تنظیم شده باشد)
  • پیش‌فرض: از fingerprint inbound استفاده می‌کند (معمولاً chrome برای Reality)

مثال:

{
  "fingerprint": "chrome"  // fingerprint inbound را بازنویسی می‌کند
}
// یا
{
  "fingerprint": "none"  // از fingerprint inbound استفاده می‌کند
}

allowinsecure (Boolean)

  • هدف: اجازه اتصالات TLS ناامن
  • بازنویسی: مقدار هاست مقدار inbound را در صورت تنظیم جایگزین می‌کند
  • پیش‌فرض: از مقدار inbound استفاده می‌کند (معمولاً false)

مثال:

{
  "allowinsecure": false  // تنظیم inbound را بازنویسی می‌کند
}

ech_config_list (String)

  • هدف: پیکربندی Encrypted Client Hello (ECH)
  • بازنویسی: مقدار هاست مقدار inbound را در صورت تنظیم جایگزین می‌کند
  • پیش‌فرض: از مقدار inbound استفاده می‌کند اگر تنظیم نشده باشد

ویژگی‌های پیشرفته

use_sni_as_host (Boolean)

  • هدف: استفاده از مقدار SNI به عنوان هدر host
  • رفتار: وقتی true باشد، مقدار SNI انتخاب شده هدر host را جایگزین می‌کند
  • پیش‌فرض: false

random_user_agent (Boolean)

  • هدف: تولید هدرهای User-Agent تصادفی
  • رفتار: وقتی true باشد، User-Agent تصادفی به هدرهای HTTP اضافه می‌شود
  • پیش‌فرض: false

http_headers (Dictionary)

  • هدف: هدرهای HTTP سفارشی
  • فرمت: {"Header-Name": "value"}
  • بازنویسی: هدرهای هاست به پیکربندی انتقال اضافه می‌شوند

مثال:

{
  "http_headers": {
    "X-Forwarded-For": "1.2.3.4",
    "Custom-Header": "value"
  }
}

is_disabled (Boolean)

  • هدف: غیرفعال کردن موقت هاست بدون حذف
  • رفتار: هاست‌های غیرفعال از اشتراک‌ها حذف می‌شوند
  • پیش‌فرض: false

status (مجموعه UserStatus)

  • هدف: فیلتر اینکه کدام وضعیت‌های کاربر می‌توانند این هاست را ببینند
  • گزینه‌ها: active, expired, limited, disabled, on_hold
  • رفتار: اگر تنظیم شده باشد، فقط کاربران با وضعیت مطابق این هاست را می‌بینند
  • پیش‌فرض: null (همه کاربران می‌توانند آن را ببینند)

مثال:

{
  "status": ["active", "on_hold"]  // فقط کاربران active و on_hold این را می‌بینند
}

متغیرهای فرمت برای نمایش کاربر

فیلدهای remark و address هاست از متغیرهای فرمت پشتیبانی می‌کنند که با مقادیر خاص کاربر هنگام تولید اشتراک‌ها جایگزین می‌شوند.

متغیرهای فرمت موجود

متغیرتوضیحاتمثال
{SERVER_IP}آدرس IPv4 عمومی سرور1.2.3.4
{SERVER_IPV6}آدرس IPv6 عمومی سرور2001:db8::1
{USERNAME}نام کاربری کاربرjohn_doe
{PROTOCOL}نام پروتکل (vmess، vless و غیره)vless
{TRANSPORT}نوع انتقال (tcp، ws، grpc و غیره)ws
{DATA_USAGE}استفاده داده کاربر (فرمت شده)1.5 GB
{DATA_LIMIT}محدودیت داده کاربر (فرمت شده)100 GB یا
{DATA_LEFT}داده باقیمانده (فرمت شده)98.5 GB یا
{DAYS_LEFT}روزهای باقیمانده تا انقضا30 یا
{EXPIRE_DATE}تاریخ انقضا (میلادی)2024-12-31
{JALALI_EXPIRE_DATE}تاریخ انقضا (جلالی)1403-10-11
{TIME_LEFT}زمان باقیمانده تا انقضا (فرمت شده)30 days یا
{STATUS_EMOJI}ایموجی وضعیت کاربر, ⌛️, 🪫, , 🔌
{USAGE_PERCENTAGE}درصد استفاده داده15.5 یا
{ADMIN_USERNAME}ادمینی که کاربر را ایجاد کردهadmin

مثال‌های متغیر فرمت

مثال‌های Remark:

{
  "remark": "{PROTOCOL}-{TRANSPORT} Server {STATUS_EMOJI}"
}
// نتیجه: "vless-ws Server ✅" (برای کاربر active)
{
  "remark": "{USERNAME} - {DATA_LEFT} left"
}
// نتیجه: "john_doe - 98.5 GB left"
{
  "remark": "Server {SERVER_IP} - Expires {EXPIRE_DATE}"
}
// نتیجه: "Server 1.2.3.4 - Expires 2024-12-31"

مثال‌های Address:

{
  "address": ["{SERVER_IP}", "cdn-{USERNAME}.example.com"]
}
// نتیجه در انتخاب تصادفی: "1.2.3.4" یا "cdn-john_doe.example.com"

متغیرهای مفقود:

اگر یک متغیر فرمت در دسترس نباشد (مثلاً کاربر انقضا ندارد)، با موارد زیر جایگزین می‌شود:

  • برای فیلدهای تاریخ/زمان/محدودیت
  • - برای تاریخ‌ها وقتی کاربر on_hold است
  • <missing> برای سایر متغیرهای مفقود

تنظیمات انتقال

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

تنظیمات WebSocket

{
  "transport_settings": {
    "websocket_settings": {
      "heartbeatPeriod": 30  // فاصله heartbeat به ثانیه
    }
  }
}

تنظیمات gRPC

{
  "transport_settings": {
    "grpc_settings": {
      "multi_mode": true,  // فعال‌سازی multi-mode
      "idle_timeout": 60,  // timeout بیکار به ثانیه
      "health_check_timeout": 20,  // timeout بررسی سلامت
      "permit_without_stream": false,  // نیاز به stream
      "initial_windows_size": 1048576  // اندازه اولیه پنجره
    }
  }
}

تنظیمات KCP

{
  "transport_settings": {
    "kcp_settings": {
      "header": "wechat-video",  // نوع هدر
      "mtu": 1350,  // Maximum Transmission Unit
      "tti": 20,  // Transmission Time Interval
      "uplink_capacity": 5,  // ظرفیت uplink
      "downlink_capacity": 20,  // ظرفیت downlink
      "congestion": false,  // کنترل ازدحام
      "read_buffer_size": 2,  // اندازه بافر خواندن
      "write_buffer_size": 2  // اندازه بافر نوشتن
    }
  }
}

تنظیمات TCP

{
  "transport_settings": {
    "tcp_settings": {
      "header": "http",  // نوع هدر: "none" یا "http"
      "request": {
        "method": "GET",
        "version": "1.1",
        "headers": {
          "Host": ["example.com"]
        }
      },
      "response": {
        "status": "200",
        "reason": "OK",
        "version": "1.1"
      }
    }
  }
}

تنظیمات XHTTP/SplitHTTP

{
  "transport_settings": {
    "xhttp_settings": {
      "mode": "auto",  // auto, packet-up, stream-up, stream-one
      "no_grpc_header": false,  // غیرفعال کردن هدر gRPC
      "x_padding_bytes": "1-100",  // محدوده بایت‌های padding
      "sc_max_each_post_bytes": 1048576,  // حداکثر بایت post
      "sc_min_posts_interval_ms": 100,  // حداقل فاصله بین postها
      "xmux": {
        "maxConcurrency": 8,
        "maxConnections": 8,
        "cMaxReuseTimes": 1,
        "hMaxReusableSecs": 300,
        "hMaxRequestTimes": 8,
        "hKeepAlivePeriod": 15
      },
      "download_settings": 2  // ID هاست دیگر برای دانلود
    }
  }
}

تنظیمات دانلود

download_settings به ID هاست دیگری برای عملکرد دانلود XHTTP ارجاع می‌دهد. هاست ارجاع داده شده نمی‌تواند هاست دانلود خودش را داشته باشد (بدون تودرتویی).

تنظیمات Mux

{
  "mux_settings": {
    "xray": {
      "enabled": true,
      "concurrency": 8,
      "xudpConcurrency": 8,
      "xudpProxyUDP443": "reject"  // reject, allow, skip
    },
    "sing_box": {
      "enable": true,
      "protocol": "smux",  // smux, yamux, h2mux
      "max_connections": 8,
      "max_streams": 8,
      "min_streams": 1,
      "padding": false,
      "brutal": {
        "enable": true,
        "up_mbps": 100,
        "down_mbps": 100
      }
    },
    "clash": {
      // همانند sing_box به علاوه:
      "statistic": false,
      "only_tcp": false
    }
  }
}

تنظیمات Fragment

{
  "fragment_settings": {
    "xray": {
      "packets": "tlshello",  // یا محدوده مانند "1-10"
      "length": "100-200",  // محدوده طول fragment
      "interval": "10-20"  // محدوده فاصله
    },
    "sing_box": {
      "fragment": true,
      "fragment_fallback_delay": "100ms",
      "record_fragment": false
    }
  }
}

تنظیمات Noise

{
  "noise_settings": {
    "xray": [
      {
        "type": "rand",  // rand, str, base64, hex
        "packet": "base64-encoded-data",
        "delay": "10-20",  // محدوده تاخیر
        "apply_to": "ip"  // ip, ipv4, ipv6
      }
    ]
  }
}

وضعیت هاست و فیلترینگ

نحوه کار فیلترینگ هاست

هنگام تولید اشتراک، هاست‌ها به این ترتیب فیلتر می‌شوند:

  1. بررسی دسترسی Inbound: inbound_tag هاست باید از طریق گروه‌های کاربر قابل دسترسی باشد

    • کاربران به گروه‌ها تعلق دارند
    • گروه‌ها تگ‌های inbound به آنها اختصاص داده شده‌اند
    • فقط هاست‌هایی که inbound_tag آنها در inboundهای قابل دسترسی کاربر (از تمام گروه‌هایشان) است پردازش می‌شوند
    • گروه‌های غیرفعال از این بررسی حذف می‌شوند
    • این اولین و مهم‌ترین فیلتر است - اگر کاربر از طریق گروه‌هایش به inbound دسترسی نداشته باشد، هاست هرگز در اشتراک او ظاهر نمی‌شود
  2. بررسی غیرفعال: هاست‌هایی با is_disabled: true حذف می‌شوند

  3. بررسی وضعیت: اگر هاست status تنظیم شده باشد، وضعیت کاربر باید با یکی از مقادیر در مجموعه مطابقت داشته باشد

  4. مرتب‌سازی اولویت: هاست‌های باقیمانده بر اساس priority (صعودی) مرتب می‌شوند

درک دسترسی Inbound از طریق گروه‌ها

نحوه کار:

  • کاربران به گروه‌ها اختصاص داده می‌شوند
  • گروه‌ها تگ‌های inbound به آنها اختصاص داده شده‌اند (رابطه چند به چند)
  • هنگام تولید اشتراک، PasarGuard تمام تگ‌های inbound را از تمام گروه‌های کاربر جمع‌آوری می‌کند (به جز گروه‌های غیرفعال)
  • فقط هاست‌هایی که inbound_tag آنها با یکی از این inboundهای قابل دسترسی مطابقت دارد، شامل می‌شوند

مثال:

کاربر "john" متعلق به:
  - گروه "Premium" (inbound_tags: ["vless-443", "trojan-8443"])
  - گروه "Standard" (inbound_tags: ["vmess-8080"])

هاست‌ها:
  - هاست A (inbound_tag: "vless-443") ✅ ظاهر می‌شود (در گروه Premium)
  - هاست B (inbound_tag: "trojan-8443") ✅ ظاهر می‌شود (در گروه Premium)
  - هاست C (inbound_tag: "vmess-8080") ✅ ظاهر می‌شود (در گروه Standard)
  - هاست D (inbound_tag: "shadowsocks-9090") ❌ ظاهر نمی‌شود (در هیچ گروهی نیست)

بدون گروه = بدون هاست

اگر کاربر هیچ گروهی نداشته باشد، یا تمام گروه‌هایش غیرفعال باشند، هیچ هاستی در اشتراک خود نخواهد دید.

مثال‌های فیلترینگ وضعیت

هاست قابل مشاهده برای همه کاربران:

{
  "status": null  // یا مجموعه خالی
}

هاست قابل مشاهده فقط برای کاربران active:

{
  "status": ["active"]
}

هاست قابل مشاهده برای کاربران active و on_hold:

{
  "status": ["active", "on_hold"]
}

مرتب‌سازی اولویت

هاست‌ها بر اساس فیلد priority (عدد کمتر = اولویت بالاتر) مرتب می‌شوند:

{
  "priority": 1  // ابتدا در اشتراک ظاهر می‌شود
}
{
  "priority": 100  // بعداً در اشتراک ظاهر می‌شود
}

محدودیت‌ها و قیود API

محدودیت‌های فیلد

فیلدمحدودیتتوضیحات
remarkباید رشته فرمت معتبر باشداز متغیرهای فرمت پشتیبانی می‌کند
addressطول ترکیبی رشته حداکثر 256 کاراکترمجموعه رشته‌های آدرس
sniطول ترکیبی رشته حداکثر 1000 کاراکترمجموعه رشته‌های SNI
hostطول ترکیبی رشته حداکثر 1000 کاراکترمجموعه رشته‌های host
inbound_tagباید در پیکربندی‌های هسته وجود داشته باشددر برابر پیکربندی‌های XRay اعتبارسنجی می‌شود

قوانین اعتبارسنجی

  1. اعتبارسنجی تگ Inbound

    • inbound_tag باید در حداقل یک پیکربندی هسته XRay وجود داشته باشد
    • هنگام ایجاد یا تغییر هاست‌ها اعتبارسنجی می‌شود
  2. اعتبارسنجی تنظیمات دانلود

    • اگر xhttp_settings.download_settings تنظیم شده باشد، باید به ID هاست معتبر ارجاع دهد
    • هاست ارجاع داده شده نمی‌تواند همان هاست فعلی باشد
    • هاست ارجاع داده شده نمی‌تواند هاست دانلود خودش را داشته باشد (بدون تودرتویی)
  3. اعتبارسنجی متغیر فرمت

    • remark باید یک رشته فرمت معتبر باشد
    • متغیرهای فرمت نامعتبر باعث خطا می‌شوند
  4. اعتبارسنجی ALPN

    • لیست ALPN به طور خودکار deduplicate می‌شود
    • لیست ALPN به طور خودکار بر اساس اولویت مرتب می‌شود (h3 → h2 → http/1.1)

نقاط پایانی API

  • GET /api/host/{host_id} - دریافت هاست بر اساس ID
  • GET /api/hosts - لیست تمام هاست‌ها (با صفحه‌بندی)
  • POST /api/host/ - ایجاد هاست جدید
  • PUT /api/host/{host_id} - تغییر هاست موجود
  • DELETE /api/host/{host_id} - حذف هاست
  • PUT /api/hosts - تغییر دسته‌ای هاست‌ها

احراز هویت

تمام نقاط پایانی نیاز به دسترسی ادمین sudo دارند.


سناریوهای رایج

سناریو 1: بازنویسی پورت Inbound

مشکل: Inbound از پورت 443 استفاده می‌کند، اما می‌خواهید این هاست از پورت 8443 استفاده کند.

راه‌حل:

{
  "inbound_tag": "my-inbound",
  "port": 8443,  // پورت inbound را بازنویسی می‌کند
  "remark": "Custom Port Server"
}

سناریو 2: چند مقدار SNI

مشکل: می‌خواهید به صورت تصادفی از چند مقدار SNI برای هر درخواست انتخاب کنید.

راه‌حل:

{
  "sni": ["example.com", "cdn.example.com", "www.example.com"]
}
// هر درخواست اشتراک به صورت تصادفی یکی را انتخاب می‌کند

سناریو 3: نام‌های سرور خاص کاربر

مشکل: می‌خواهید هر کاربر نام کاربری خود را در آدرس سرور ببیند.

راه‌حل:

{
  "address": ["{USERNAME}.example.com", "{SERVER_IP}"],
  "remark": "Server for {USERNAME}"
}

سناریو 4: نمایش هاست بر اساس وضعیت

مشکل: می‌خواهید یک سرور premium فقط برای کاربران active قابل مشاهده باشد.

راه‌حل:

{
  "remark": "Premium Server",
  "status": ["active"],  // فقط کاربران active این را می‌بینند
  "priority": 1  // اولویت بالا
}

نیاز به دسترسی گروه

inbound_tag هاست نیز باید به گروه‌های کاربر اختصاص داده شود. فیلتر status فقط روی هاست‌هایی کار می‌کند که از قبل از طریق گروه‌ها قابل دسترسی هستند.

سناریو 4b: دسترسی هاست بر اساس گروه

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

راه‌حل:

  1. یک گروه ایجاد کنید (مثلاً "VIP Group")
  2. inbound_tag هاست را به آن گروه اختصاص دهید
  3. فقط کاربرانی را به آن گروه اختصاص دهید که باید هاست را ببینند
// پیکربندی هاست
{
  "inbound_tag": "vless-premium-443",
  "remark": "VIP Server"
}

// پیکربندی گروه (از طریق API)
{
  "name": "VIP Group",
  "inbound_tags": ["vless-premium-443"]  // باید با inbound_tag هاست مطابقت داشته باشد
}

کاربران در "VIP Group" این هاست را خواهند دید. کاربرانی که در این گروه نیستند آن را نخواهند دید، صرف نظر از سایر تنظیمات.

سناریو 5: بازنویسی نوع امنیت

مشکل: Inbound از TLS استفاده می‌کند، اما می‌خواهید این هاست از Reality استفاده کند.

راه‌حل:

{
  "security": "reality",  // امنیت inbound را بازنویسی می‌کند
  "sni": ["reality.example.com"]
}

سناریو 6: مسیر سفارشی با متغیرها

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

راه‌حل:

{
  "path": "/{PROTOCOL}/{TRANSPORT}/path"
}
// نتیجه: "/vless/ws/path"

سناریو 7: چند پورت از Inbound

مشکل: Inbound دارای پورت‌های "8080,8443,9090" است و می‌خواهید از همه آنها استفاده کنید.

راه‌حل:

{
  "port": null  // پورت را تنظیم نکنید، از پورت‌های چندتایی inbound استفاده می‌کند
}
// هر درخواست اشتراک به صورت تصادفی یک پورت را انتخاب می‌کند

سناریو 8: XHTTP با هاست دانلود

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

راه‌حل:

{
  "transport_settings": {
    "xhttp_settings": {
      "mode": "auto",
      "download_settings": 5  // ارجاع به ID هاست 5
    }
  }
}

سناریو 9: SNI Wildcard با Salt تصادفی

مشکل: می‌خواهید SNI دارای زیردامنه تصادفی برای هر درخواست باشد.

راه‌حل:

{
  "sni": ["*.example.com"]
}
// هر درخواست: "a1b2c3d4.example.com" (salt تصادفی جایگزین * می‌شود)

سناریو 10: مرتب‌سازی اولویت

مشکل: می‌خواهید هاست‌های خاص ابتدا در اشتراک‌ها ظاهر شوند.

راه‌حل:

// هاست با اولویت بالا
{
  "remark": "Primary Server",
  "priority": 1
}

// هاست با اولویت پایین‌تر
{
  "remark": "Backup Server",
  "priority": 100
}

خلاصه

بهترین روش‌ها

  • مقادیر هاست مقادیر پیش‌فرض inbound را بازنویسی می‌کنند - تنظیمات هاست اولویت دارند بر مقادیر پیش‌فرض inbound
  • دسترسی inbound از طریق گروه‌ها الزامی است - هاست‌ها فقط ظاهر می‌شوند اگر inbound_tag آنها به گروه‌های کاربر اختصاص داده شده باشد
  • استفاده از متغیرهای فرمت در remark و address برای نمایش خاص کاربر
  • مقادیر چندتایی به صورت تصادفی انتخاب می‌شوند - مقادیر SNI، host، address و port به صورت تصادفی برای هر درخواست اشتراک انتخاب می‌شوند
  • Wildcards (*) در SNI/host/address با salt تصادفی جایگزین می‌شوند
  • فیلتر status هاست تعیین می‌کند کدام کاربران می‌توانند هاست را ببینند (اما فقط اگر inbound از طریق گروه‌ها قابل دسترسی باشد)
  • priority هاست ترتیب در اشتراک‌ها را تعیین می‌کند
  • inbound_tag باید وجود داشته باشد در پیکربندی‌های هسته XRay شما و به گروه‌های کاربر اختصاص داده شود
  • تنظیمات انتقال مقادیر پیش‌فرض inbound را برای شبکه‌های خاص بازنویسی می‌کنند
  • هاست‌های غیرفعال (is_disabled: true) از اشتراک‌ها حذف می‌شوند
  • متغیرهای فرمت با مقادیر خاص کاربر هنگام تولید اشتراک‌ها جایگزین می‌شوند
  • کنترل دسترسی بر اساس گروه - کاربران فقط هاست‌هایی را می‌بینند که inboundهایشان در گروه‌های اختصاص داده شده آنهاست

برای اطلاعات بیشتر درباره پیکربندی XRay، به پیکربندی هسته مراجعه کنید.