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

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

اعتبارسنجی پیکربندی XRay، مقادیر پیش‌فرض و مستندات API

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

این سند نحوه اعتبارسنجی و پردازش فایل‌های پیکربندی XRay توسط PasarGuard را توضیح می‌دهد. این سند برای کمک به مبتدیان در درک فرآیند اعتبارسنجی، مقادیر پیش‌فرض و محدودیت‌های API طراحی شده است.

فهرست مطالب

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

نمای کلی

کلاس XRayConfig مسئول موارد زیر است:

  • اعتبارسنجی فایل‌های JSON پیکربندی XRay
  • استخراج مقادیر پیش‌فرض از پیکربندی
  • پردازش تنظیمات ورودی و خروجی
  • مدیریت پیکربندی‌های خاص مانند fallback و TLS/Reality

وقتی یک پیکربندی هسته را از طریق API ایجاد یا تغییر می‌دهید، PasarGuard به طور خودکار پیکربندی XRay شما را با استفاده از این کلاس اعتبارسنجی می‌کند.


اعتبارسنجی پیکربندی

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

پیکربندی XRay شما باید شامل موارد زیر باشد:

  1. inbounds - آرایه‌ای از پیکربندی‌های ورودی

    • نمی‌تواند خالی یا مفقود باشد
    • هر inbound باید یک tag منحصر به فرد داشته باشد
    • هر inbound باید یک فیلد protocol داشته باشد
  2. outbounds - آرایه‌ای از پیکربندی‌های خروجی

    • نمی‌تواند خالی یا مفقود باشد
    • هر outbound باید یک tag منحصر به فرد داشته باشد

قوانین تگ‌های ورودی

تگ‌های ورودی قوانین سخت‌گیرانه‌ای دارند:

  • باید منحصر به فرد باشند - هیچ دو inbound نمی‌توانند تگ یکسانی داشته باشند
  • باید وجود داشته باشند - هر inbound نیاز به یک تگ دارد
  • نمی‌توانند شامل کاما (,) باشند - کاراکتر , مجاز نیست
  • نمی‌توانند شامل <=> باشند - این دنباله برای مدیریت fallback رزرو شده است
{
  "inbounds": [
    {
      "tag": "vless-ws-443",
      "port": 443,
      "protocol": "vless"
    },
    {
      "tag": "trojan-tls-8443",
      "port": 8443,
      "protocol": "trojan"
    },
    {
      "tag": "vmess-grpc",
      "port": 443,
      "protocol": "vmess"
    }
  ]
}
{
  "inbounds": [
    {
      "tag": "inbound,fallback",  // ❌ شامل کاما است
      "port": 443,
      "protocol": "vless"
    },
    {
      "tag": "inbound<=>fallback",  // ❌ شامل <=> است
      "port": 8443,
      "protocol": "trojan"
    }
  ]
}

الزامات پورت

اکثر inboundها باید یک فیلد port داشته باشند. تنها استثنا زمانی است که:

  • inbound به عنوان مقصد fallback استفاده می‌شود (ارجاع داده شده توسط تنظیمات fallback inbound دیگر)
  • inbound خودش یک آرایه fallbacks در تنظیمات دارد

الزام پورت

اکثر inboundها نیاز به فیلد port دارند. فقط inboundهای fallback (آنهایی که توسط inboundهای دیگر ارجاع داده می‌شوند یا خودشان آرایه fallbacks دارند) می‌توانند پورت را حذف کنند.

مثال:

{
  "tag": "main-inbound",
  "port": 443,  // ✅ برای اکثر inboundها الزامی است
  "protocol": "vless"
}

مقادیر پیش‌فرض

هنگام پردازش پیکربندی شما، PasarGuard مقادیر پیش‌فرض را برای تنظیمات مختلف استخراج و تنظیم می‌کند. در ادامه آنچه به طور خودکار تنظیم می‌شود آمده است:

تنظیمات پایه (همه Inboundها)

این مقادیر پیش‌فرض برای هر inbound اعمال می‌شود:

فیلدمقدار پیش‌فرضتوضیحات
network"tcp"نوع شبکه انتقال
tls"none"نوع امنیت/رمزگذاری
sni[]لیست Server Name Indication (آرایه خالی)
host[]لیست هدر Host (آرایه خالی)
path""رشته مسیر (خالی)
header_type""نوع هدر (رشته خالی)
is_fallbackfalseآیا این یک inbound fallback است
fallbacks[]پیکربندی‌های fallback (آرایه خالی)
portNoneشماره پورت (باید در پیکربندی ارائه شود)

مقادیر پیش‌فرض خاص پروتکل

مقادیر پیش‌فرض پروتکل VLESS:

  • flow: "" (رشته خالی) - تنظیم کنترل جریان
  • encryption: "none" - روش رمزگذاری
  • decryption: "none" - روش رمزگشایی

اگر decryption برابر "none" نباشد، پس encryption نیز باید ارائه شود.

مقادیر پیش‌فرض پروتکل Shadowsocks:

  • method: "" - روش رمزگذاری (باید مشخص شود)
  • is_2022: false - آیا از روش‌های 2022-blake3 استفاده می‌شود
  • password: باید یک رشته base64 معتبر باشد (برای روش‌های 2022-blake3)

محدودیت‌های Shadowsocks

  • ❌ روش 2022-blake3-chacha20-poly1305 پشتیبانی نمی‌شود
  • ✅ فقط روش‌های 2022-blake3-aes-*-gcm پشتیبانی می‌شوند

مقادیر پیش‌فرض امنیت Reality:

فیلدمقدار پیش‌فرضتوضیحات
fp"chrome"نوع Fingerprint
tls"reality"نوع امنیت
sniاز serverNames در realitySettingsنام‌های سرور
pbkمحاسبه شده از privateKeyکلید عمومی (به طور خودکار تولید می‌شود)
sidsاز shortIds در realitySettingsشناسه‌های کوتاه (الزامی)
spx""تنظیم SpiderX (اختیاری)
mldsa65Verifyاز realitySettingsتأیید MLDSA65

تنظیمات الزامی Reality:

  • privateKey - باید ارائه شود
  • shortIds - حداقل یک شناسه کوتاه باید تعریف شود
  • serverNames - برای SNI استفاده می‌شود

پروتکل‌های پشتیبانی شده

PasarGuard این پروتکل‌ها را پردازش و اعتبارسنجی می‌کند:

  1. Vmess
  2. Vless
  3. Trojan
  4. Shadowsocks

پروتکل‌های دیگر در پیکربندی شما (مانند socks، http) در طول پردازش نادیده گرفته می‌شوند اما باعث خطا نمی‌شوند.


انواع شبکه

انواع شبکه/انتقال زیر پشتیبانی می‌شوند:

نوع شبکهتوضیحاتمدیریت خاص
tcpانتقال TCPنوع شبکه پیش‌فرض
rawTCP خامهمان مدیریت TCP
wsWebSocketpath و host باید رشته باشند
grpcgRPCاز serviceName به عنوان path استفاده می‌کند
gungUNهمان gRPC
quicQUICاز key به عنوان path استفاده می‌کند
httpupgradeHTTP Upgradeمدیریت استاندارد path/host
splithttpSplit HTTPشامل تنظیم mode است
xhttpXHTTPشامل تنظیم mode است
kcpKCPاز seed به عنوان path استفاده می‌کند
httpHTTP/1.1HTTP استاندارد
h2HTTP/2HTTP استاندارد
h3HTTP/3HTTP استاندارد

قوانین خاص شبکه

شبکه‌های TCP/Raw:

  • path و host در هدرها باید آرایه باشند (نه رشته)
  • اگر path یک آرایه باشد، فقط اولین عنصر استفاده می‌شود
  • host می‌تواند یک آرایه از مقادیر host باشد

مثال:

{
  "streamSettings": {
    "network": "tcp",
    "tcpSettings": {
      "header": {
        "type": "http",
        "request": {
          "path": ["/path"],  // ✅ آرایه
          "headers": {
            "Host": ["example.com"]  // ✅ آرایه
          }
        }
      }
    }
  }
}

WebSocket (WS):

  • path و host باید رشته باشند (نه آرایه)
  • host به طور داخلی به یک آرایه تک عنصری تبدیل می‌شود

مثال:

{
  "streamSettings": {
    "network": "ws",
    "wsSettings": {
      "path": "/path",  // ✅ رشته
      "host": "example.com"  // ✅ رشته
    }
  }
}

gRPC:

  • path از serviceName استخراج می‌شود
  • host از authority استخراج می‌شود

مثال:

{
  "streamSettings": {
    "network": "grpc",
    "grpcSettings": {
      "serviceName": "my-service",  // به عنوان path استفاده می‌شود
      "authority": "example.com"     // به عنوان host استفاده می‌شود
    }
  }
}

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

None (بدون امنیت)

  • نوع امنیت پیش‌فرض
  • بدون رمزگذاری یا TLS
  • برای اتصالات ساده یا زمانی که رمزگذاری در سطح برنامه مدیریت می‌شود استفاده می‌شود

امنیت TLS

هنگام استفاده از امنیت TLS:

مدیریت گواهینامه:

  • گواهینامه‌ها می‌توانند از طریق موارد زیر ارائه شوند:
    • certificateFile - مسیر فایل گواهینامه (نیاز به keyFile دارد)
    • certificate - محتوای مستقیم گواهینامه (رشته یا آرایه)
  • اگر از certificateFile استفاده می‌کنید، باید keyFile را نیز ارائه دهید
  • SNI (Server Name Indication) به طور خودکار از گواهینامه‌ها استخراج می‌شود

الزامات گواهینامه

اگر از certificateFile استفاده می‌کنید، باید keyFile را نیز ارائه دهید. هر دو فایل الزامی هستند.

مثال:

{
  "streamSettings": {
    "security": "tls",
    "tlsSettings": {
      "certificates": [{
        "certificateFile": "/path/to/cert.pem",
        "keyFile": "/path/to/key.pem"
      }]
    }
  }
}

امنیت Reality

هنگام استفاده از امنیت Reality:

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

  • privateKey - کلید خصوصی برای X25519
  • shortIds - آرایه‌ای با حداقل یک شناسه کوتاه (می‌تواند رشته خالی "" باشد)
  • serverNames - آرایه‌ای از نام‌های سرور برای SNI

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

  • SpiderX - پیکربندی SpiderX
  • mldsa65Verify - تنظیم تأیید MLDSA65

تنظیمات الزامی Reality

  • privateKey - باید ارائه شود
  • shortIds - حداقل یک شناسه کوتاه باید تعریف شود (می‌تواند رشته خالی باشد)
  • serverNames - برای SNI استفاده می‌شود

مثال:

{
  "streamSettings": {
    "security": "reality",
    "realitySettings": {
      "serverNames": ["example.com"],
      "privateKey": "your-private-key-here",
      "shortIds": [""]
    }
  }
}

مشاهده IPهای متصل

شما می‌توانید ردیابی آمار آنلاین کاربران را فعال کنید تا آخرین آدرس‌های IP متصل به هسته خود را مشاهده کنید. این ویژگی به شما امکان می‌دهد که IPهای در حال حاضر متصل به هسته XRay خود را نظارت کنید.

فعال‌سازی آمار آنلاین کاربران

برای فعال‌سازی این ویژگی، باید یک بخش policy به ریشه فایل JSON پیکربندی XRay خود اضافه کنید. پیکربندی زیر را اضافه کنید:

{
  "policy": {
    "levels": {
      "0": {
        "statsUserOnline": true
      }
    }
  },
  "inbounds": [
    // ... پیکربندی‌های inbound شما
  ],
  "outbounds": [
    // ... پیکربندی‌های outbound شما
  ]
}

پیکربندی Policy

بخش policy باید در سطح ریشه فایل JSON پیکربندی شما، در کنار inbounds و outbounds اضافه شود. تنظیم statsUserOnline: true ردیابی آمار اتصال کاربران را فعال می‌کند.

مشاهده IPهای متصل

پس از فعال‌سازی policy statsUserOnline و راه‌اندازی مجدد نود شما:

  1. نیاز به اولین اتصال: ردیابی IP پس از برقراری اولین اتصال کاربر شروع به کار می‌کند
  2. دسترسی به آمار: پس از فعال‌سازی و بعد از اولین اتصال، می‌توانید آخرین IPهای متصل را از طریق رابط آمار پنل خود مشاهده کنید

نیاز به راه‌اندازی مجدد

پس از اضافه کردن پیکربندی policy، باید هسته خود را راه‌اندازی مجدد کنید تا تغییرات اعمال شوند.

مثال کامل

در اینجا یک مثال کامل از پیکربندی با بخش policy فعال شده آورده شده است:

{
  "policy": {
    "levels": {
      "0": {
        "statsUserOnline": true
      }
    }
  },
  "inbounds": [
    {
      "tag": "vless-ws-443",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": []
      },
      "streamSettings": {
        "network": "ws",
        "wsSettings": {
          "path": "/path"
        }
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom"
    }
  ]
}

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

هنگام ایجاد یا تغییر پیکربندی‌های هسته از طریق API، این محدودیت‌ها اعمال می‌شوند:

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

فیلدمحدودیتتوضیحات
nameحداکثر 256 کاراکترنام پیکربندی هسته
exclude_inbound_tagsطول رشته ترکیبی حداکثر 2048 کاراکترتگ‌هایی که از پردازش حذف می‌شوند
fallbacks_inbound_tagsطول رشته ترکیبی حداکثر 2048 کاراکترتگ‌هایی که برای مدیریت fallback استفاده می‌شوند
configنمی‌تواند خالی باشدباید شامل پیکربندی XRay معتبر باشد

قوانین خاص

  1. محافظت هسته پیش‌فرض

    • پیکربندی هسته با id = 1 نمی‌تواند حذف شود
    • این پیکربندی پیش‌فرض/سیستمی هسته است
  2. طول رشته تگ

    • وقتی exclude_inbound_tags و fallbacks_inbound_tags به یک رشته جدا شده با کاما ترکیب می‌شوند، طول کل نباید از 2048 کاراکتر تجاوز کند
    • مثال: اگر 100 تگ با 20 کاراکتر هر کدام داشته باشید، این 2000 کاراکتر است (به علاوه 99 کاما = 2099) که از محدودیت تجاوز می‌کند
  3. اعتبارسنجی پیکربندی

    • دیکشنری config نمی‌تواند خالی {} باشد
    • باید تمام قوانین اعتبارسنجی XRay را پاس کند (inbounds، outbounds، تگ‌ها و غیره)

محافظت هسته پیش‌فرض

پیکربندی هسته با id = 1 نمی‌تواند حذف شود. این پیکربندی پیش‌فرض/سیستمی هسته است.

نقاط پایانی API

نقاط پایانی زیر برای مدیریت پیکربندی هسته در دسترس هستند:

  • POST /api/core - ایجاد پیکربندی هسته جدید
  • GET /api/core/{core_id} - دریافت پیکربندی هسته با ID
  • PUT /api/core/{core_id} - تغییر پیکربندی هسته موجود
  • DELETE /api/core/{core_id} - حذف پیکربندی هسته (به جز id=1)
  • GET /api/cores - لیست تمام پیکربندی‌های هسته
  • POST /api/core/{core_id}/restart - راه‌اندازی مجدد نودهای استفاده‌کننده از این هسته

احراز هویت

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


خطاهای رایج اعتبارسنجی

در ادامه خطاهای رایجی که ممکن است با آن‌ها مواجه شوید و نحوه رفع آن‌ها آمده است:

خطا: "config doesn't have inbounds"

مشکل: پیکربندی شما آرایه inbounds را ندارد.

راه‌حل:

{
  "inbounds": [
    {
      "tag": "my-inbound",
      "port": 443,
      "protocol": "vless"
    }
  ],
  "outbounds": []
}

خطا: "all inbounds must have a unique tag"

مشکل: دو یا چند inbound دارای مقدار تگ یکسان هستند.

راه‌حل: اطمینان حاصل کنید که هر inbound یک تگ منحصر به فرد دارد:

{
  "inbounds": [
    {"tag": "inbound-1", "port": 443, "protocol": "vless"},
    {"tag": "inbound-2", "port": 8443, "protocol": "trojan"}  // ✅ تگ متفاوت
  ]
}

خطا: "character «,» is not allowed in inbound tag"

مشکل: تگ inbound شما شامل کاما یا <=> است.

راه‌حل: کاما و <=> را از تگ‌ها حذف کنید:

{
  "inbounds": [
    {
      "tag": "inbound,fallback",  // ❌ نامعتبر
      "port": 443,
      "protocol": "vless"
    },
    {
      "tag": "inbound-fallback",  // ✅ معتبر
      "port": 443,
      "protocol": "vless"
    }
  ]
}

خطا: "{tag} inbound doesn't have port"

مشکل: یک inbound فیلد الزامی port را ندارد.

راه‌حل: یک شماره پورت اضافه کنید:

{
  "tag": "my-inbound",
  "port": 443,  // ✅ این را اضافه کنید
  "protocol": "vless"
}

خطا: "only 2022-blake3-aes-*-gcm methods are supported"

مشکل: شما از یک روش Shadowsocks پشتیبانی نشده استفاده می‌کنید.

راه‌حل: از یک روش پشتیبانی شده استفاده کنید:

{
  "protocol": "shadowsocks",
  "settings": {
    "method": "2022-blake3-aes-128-gcm"  // ✅ پشتیبانی می‌شود
    // "method": "2022-blake3-chacha20-poly1305"  // ❌ پشتیبانی نمی‌شود
  }
}

خطا: "Shadowsocks password must be a valid base64 string"

مشکل: برای روش‌های 2022-blake3، رمز عبور باید base64 باشد.

راه‌حل: اطمینان حاصل کنید که رمز عبور base64 معتبر است:

{
  "settings": {
    "method": "2022-blake3-aes-128-gcm",
    "password": "base64-encoded-password-here"  // ✅ باید base64 باشد
  }
}

خطا: "You need to provide privateKey in realitySettings"

مشکل: پیکربندی Reality کلید خصوصی را ندارد.

راه‌حل:

{
  "streamSettings": {
    "security": "reality",
    "realitySettings": {
      "privateKey": "your-private-key-here",  // ✅ الزامی
      "shortIds": [""],
      "serverNames": ["example.com"]
    }
  }
}

خطا: "You need to define at least one shortID in realitySettings"

مشکل: تنظیمات Reality آرایه shortIds خالی یا مفقود دارد.

راه‌حل:

{
  "realitySettings": {
    "shortIds": [""],  // ✅ حداقل یک عنصر (می‌تواند رشته خالی باشد)
    // "shortIds": []  // ❌ آرایه خالی مجاز نیست
  }
}

خطا: "Settings of {tag} for path and host must be list, not str"

مشکل: برای شبکه‌های TCP/raw، path و host در هدرها باید آرایه باشند.

راه‌حل:

{
  "streamSettings": {
    "network": "tcp",
    "tcpSettings": {
      "header": {
        "type": "http",
        "request": {
          "path": ["/path"],  // ✅ آرایه، نه رشته
          "headers": {
            "Host": ["example.com"]  // ✅ آرایه، نه رشته
          }
        }
      }
    }
  }
}

خطا: "Settings for path and host must be str, not list"

مشکل: برای WebSocket، path و host باید رشته باشند.

راه‌حل:

{
  "streamSettings": {
    "network": "ws",
    "wsSettings": {
      "path": "/path",  // ✅ رشته، نه آرایه
      "host": "example.com"  // ✅ رشته، نه آرایه
    }
  }
}

خلاصه

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

  • ✅ همیشه آرایه‌های inbounds و outbounds را شامل شوید
  • ✅ اطمینان حاصل کنید که همه inboundها و outboundها تگ‌های منحصر به فرد دارند
  • ✅ از کاما و <=> در تگ‌های inbound اجتناب کنید
  • ✅ شماره‌های پورت را برای inboundها ارائه دهید (مگر اینکه از fallback استفاده کنید)
  • ✅ از پروتکل‌های پشتیبانی شده استفاده کنید: vmess، vless، trojan، shadowsocks
  • ✅ قوانین خاص شبکه را برای فرمت‌های path/host دنبال کنید
  • ✅ فیلدهای الزامی را برای امنیت TLS و Reality ارائه دهید
  • ✅ رشته‌های تگ را زیر 2048 کاراکتر نگه دارید
  • ✅ هسته پیش‌فرض (id=1) نمی‌تواند حذف شود

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