پیکربندی هاست
پیکربندی هاست پروکسی، بازنویسی مقادیر، متغیرهای فرمت و فیلترینگ
مستندات پیکربندی هاست
این سند نحوه پردازش و مدیریت هاستهای پروکسی توسط PasarGuard را توضیح میدهد. این سند برای کمک به مبتدیان در درک نحوه کار پیکربندی هاستها، مقادیری که مقادیر پیشفرض inbound را بازنویسی میکنند و نحوه نمایش هاستها به کاربران در اشتراکها طراحی شده است.
فهرست مطالب
- نمای کلی
- مبانی پیکربندی هاست
- اولویت بازنویسی مقادیر
- فیلدهای هاست و رفتار آنها
- متغیرهای فرمت برای نمایش کاربر
- تنظیمات انتقال
- وضعیت هاست و فیلترینگ
- محدودیتها و قیود API
- سناریوهای رایج
نمای کلی
هاستها در PasarGuard پیکربندیهای سرور پروکسی هستند که:
- بازنویسی مقادیر پیشفرض از پیکربندیهای inbound XRay میکنند
- ارائه آدرسهای سرور، پورتها و تنظیمات انتقال
- نمایش نامهای سفارشی (remarks) به کاربران در اشتراکها
- فیلتر اینکه کدام کاربران میتوانند کدام هاستها را بر اساس وضعیت ببینند
فرآیند تولید اشتراک
وقتی کاربر درخواست اشتراک میدهد، PasarGuard:
- بررسی inboundهای قابل دسترسی کاربر - فقط هاستهایی که
inbound_tagآنها از طریق گروههای کاربر قابل دسترسی است پردازش میشوند - بارگذاری تمام هاستهای فعال که با وضعیت کاربر مطابقت دارند
- ادغام تنظیمات هاست با مقادیر پیشفرض inbound (مقادیر هاست اولویت دارند)
- فرمت کردن remarks و آدرسهای هاست با استفاده از متغیرهای خاص کاربر
- انتخاب تصادفی مقادیر از لیستها (SNI، host، address، port) برای هر درخواست
- تولید پیکربندی اشتراک
الزامات نمایش هاست
یک هاست فقط در اشتراک کاربر ظاهر میشود اگر:
inbound_tagهاست به حداقل یکی از گروههای کاربر اختصاص داده شده باشد- گروههای کاربر غیرفعال نباشند
- هاست غیرفعال نباشد (
is_disabled: false) - فیلتر
statusهاست (در صورت تنظیم) شامل وضعیت کاربر باشد
مبانی پیکربندی هاست
فیلدهای الزامی
هر هاست باید داشته باشد:
| فیلد | نوع | توضیحات |
|---|---|---|
remark | string | نام نمایشی که به کاربران نشان داده میشود (از متغیرهای فرمت پشتیبانی میکند) |
inbound_tag | string | باید با یک تگ از یکی از پیکربندیهای هسته XRay شما مطابقت داشته باشد. مهم: این inbound باید به گروههای کاربر اختصاص داده شود تا کاربران این هاست را ببینند |
priority | integer | ترتیب ظاهر شدن هاستها در اشتراکها (عدد کمتر = اولویت بالاتر) |
فیلدهای اختیاری
هاستها میتوانند مقادیر پیشفرض inbound را برای موارد زیر بازنویسی کنند:
- تنظیمات شبکه:
address,port,sni,host,path - تنظیمات امنیتی:
security,alpn,fingerprint,allowinsecure - تنظیمات انتقال: پیکربندیهای خاص شبکه (WebSocket، gRPC و غیره)
- ویژگیهای پیشرفته: تنظیمات Mux، fragment، noise
- گزینههای نمایش:
status(کدام وضعیتهای کاربر میتوانند این هاست را ببینند)
اولویت بازنویسی مقادیر
هنگام تولید اشتراکها، PasarGuard مقادیر را به این ترتیب ادغام میکند:
ترتیب اولویت (بالاترین به پایینترین)
- پیکربندی هاست - مقادیر تنظیم شده روی هاست همه چیز را بازنویسی میکنند
- مقادیر پیشفرض Inbound - مقادیر از پیکربندی inbound XRay
- مقادیر پیشفرض سیستم - مقادیر 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- استفاده از امنیت از پیکربندی inboundnone- بدون رمزگذاریtls- رمزگذاری TLSreality- پروتکل 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
}
]
}
}وضعیت هاست و فیلترینگ
نحوه کار فیلترینگ هاست
هنگام تولید اشتراک، هاستها به این ترتیب فیلتر میشوند:
-
بررسی دسترسی Inbound:
inbound_tagهاست باید از طریق گروههای کاربر قابل دسترسی باشد- کاربران به گروهها تعلق دارند
- گروهها تگهای inbound به آنها اختصاص داده شدهاند
- فقط هاستهایی که
inbound_tagآنها در inboundهای قابل دسترسی کاربر (از تمام گروههایشان) است پردازش میشوند - گروههای غیرفعال از این بررسی حذف میشوند
- این اولین و مهمترین فیلتر است - اگر کاربر از طریق گروههایش به inbound دسترسی نداشته باشد، هاست هرگز در اشتراک او ظاهر نمیشود
-
بررسی غیرفعال: هاستهایی با
is_disabled: trueحذف میشوند -
بررسی وضعیت: اگر هاست
statusتنظیم شده باشد، وضعیت کاربر باید با یکی از مقادیر در مجموعه مطابقت داشته باشد -
مرتبسازی اولویت: هاستهای باقیمانده بر اساس
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 اعتبارسنجی میشود |
قوانین اعتبارسنجی
-
اعتبارسنجی تگ Inbound
inbound_tagباید در حداقل یک پیکربندی هسته XRay وجود داشته باشد- هنگام ایجاد یا تغییر هاستها اعتبارسنجی میشود
-
اعتبارسنجی تنظیمات دانلود
- اگر
xhttp_settings.download_settingsتنظیم شده باشد، باید به ID هاست معتبر ارجاع دهد - هاست ارجاع داده شده نمیتواند همان هاست فعلی باشد
- هاست ارجاع داده شده نمیتواند هاست دانلود خودش را داشته باشد (بدون تودرتویی)
- اگر
-
اعتبارسنجی متغیر فرمت
remarkباید یک رشته فرمت معتبر باشد- متغیرهای فرمت نامعتبر باعث خطا میشوند
-
اعتبارسنجی ALPN
- لیست ALPN به طور خودکار deduplicate میشود
- لیست ALPN به طور خودکار بر اساس اولویت مرتب میشود (h3 → h2 → http/1.1)
نقاط پایانی API
GET /api/host/{host_id}- دریافت هاست بر اساس IDGET /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: دسترسی هاست بر اساس گروه
مشکل: میخواهید یک هاست فقط برای کاربران در گروههای خاص قابل مشاهده باشد.
راهحل:
- یک گروه ایجاد کنید (مثلاً "VIP Group")
inbound_tagهاست را به آن گروه اختصاص دهید- فقط کاربرانی را به آن گروه اختصاص دهید که باید هاست را ببینند
// پیکربندی هاست
{
"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، به پیکربندی هسته مراجعه کنید.