پیکربندی هسته
اعتبارسنجی پیکربندی XRay، مقادیر پیشفرض و مستندات API
مستندات پیکربندی XRay
این سند نحوه اعتبارسنجی و پردازش فایلهای پیکربندی XRay توسط PasarGuard را توضیح میدهد. این سند برای کمک به مبتدیان در درک فرآیند اعتبارسنجی، مقادیر پیشفرض و محدودیتهای API طراحی شده است.
فهرست مطالب
- نمای کلی
- اعتبارسنجی پیکربندی
- مقادیر پیشفرض
- پروتکلهای پشتیبانی شده
- انواع شبکه
- تنظیمات امنیتی
- مشاهده IPهای متصل
- محدودیتها و قیود API
- خطاهای رایج اعتبارسنجی
نمای کلی
کلاس XRayConfig مسئول موارد زیر است:
- اعتبارسنجی فایلهای JSON پیکربندی XRay
- استخراج مقادیر پیشفرض از پیکربندی
- پردازش تنظیمات ورودی و خروجی
- مدیریت پیکربندیهای خاص مانند fallback و TLS/Reality
وقتی یک پیکربندی هسته را از طریق API ایجاد یا تغییر میدهید، PasarGuard به طور خودکار پیکربندی XRay شما را با استفاده از این کلاس اعتبارسنجی میکند.
اعتبارسنجی پیکربندی
فیلدهای الزامی
پیکربندی XRay شما باید شامل موارد زیر باشد:
-
inbounds- آرایهای از پیکربندیهای ورودی- نمیتواند خالی یا مفقود باشد
- هر inbound باید یک
tagمنحصر به فرد داشته باشد - هر inbound باید یک فیلد
protocolداشته باشد
-
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_fallback | false | آیا این یک inbound fallback است |
fallbacks | [] | پیکربندیهای fallback (آرایه خالی) |
port | None | شماره پورت (باید در پیکربندی ارائه شود) |
مقادیر پیشفرض خاص پروتکل
مقادیر پیشفرض پروتکل 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 این پروتکلها را پردازش و اعتبارسنجی میکند:
- Vmess
- Vless
- Trojan
- Shadowsocks
پروتکلهای دیگر در پیکربندی شما (مانند socks، http) در طول پردازش نادیده گرفته میشوند اما باعث خطا نمیشوند.
انواع شبکه
انواع شبکه/انتقال زیر پشتیبانی میشوند:
| نوع شبکه | توضیحات | مدیریت خاص |
|---|---|---|
tcp | انتقال TCP | نوع شبکه پیشفرض |
raw | TCP خام | همان مدیریت TCP |
ws | WebSocket | path و host باید رشته باشند |
grpc | gRPC | از serviceName به عنوان path استفاده میکند |
gun | gUN | همان gRPC |
quic | QUIC | از key به عنوان path استفاده میکند |
httpupgrade | HTTP Upgrade | مدیریت استاندارد path/host |
splithttp | Split HTTP | شامل تنظیم mode است |
xhttp | XHTTP | شامل تنظیم mode است |
kcp | KCP | از seed به عنوان path استفاده میکند |
http | HTTP/1.1 | HTTP استاندارد |
h2 | HTTP/2 | HTTP استاندارد |
h3 | HTTP/3 | HTTP استاندارد |
قوانین خاص شبکه
شبکههای 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- کلید خصوصی برای X25519shortIds- آرایهای با حداقل یک شناسه کوتاه (میتواند رشته خالی""باشد)serverNames- آرایهای از نامهای سرور برای SNI
فیلدهای اختیاری:
SpiderX- پیکربندی SpiderXmldsa65Verify- تنظیم تأیید 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 و راهاندازی مجدد نود شما:
- نیاز به اولین اتصال: ردیابی IP پس از برقراری اولین اتصال کاربر شروع به کار میکند
- دسترسی به آمار: پس از فعالسازی و بعد از اولین اتصال، میتوانید آخرین 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 معتبر باشد |
قوانین خاص
-
محافظت هسته پیشفرض
- پیکربندی هسته با
id = 1نمیتواند حذف شود - این پیکربندی پیشفرض/سیستمی هسته است
- پیکربندی هسته با
-
طول رشته تگ
- وقتی
exclude_inbound_tagsوfallbacks_inbound_tagsبه یک رشته جدا شده با کاما ترکیب میشوند، طول کل نباید از 2048 کاراکتر تجاوز کند - مثال: اگر 100 تگ با 20 کاراکتر هر کدام داشته باشید، این 2000 کاراکتر است (به علاوه 99 کاما = 2099) که از محدودیت تجاوز میکند
- وقتی
-
اعتبارسنجی پیکربندی
- دیکشنری
configنمیتواند خالی{}باشد - باید تمام قوانین اعتبارسنجی XRay را پاس کند (inbounds، outbounds، تگها و غیره)
- دیکشنری
محافظت هسته پیشفرض
پیکربندی هسته با id = 1 نمیتواند حذف شود. این پیکربندی پیشفرض/سیستمی هسته است.
نقاط پایانی API
نقاط پایانی زیر برای مدیریت پیکربندی هسته در دسترس هستند:
POST /api/core- ایجاد پیکربندی هسته جدیدGET /api/core/{core_id}- دریافت پیکربندی هسته با IDPUT /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": []
}خطا: "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 مستندات رسمی مراجعه کنید.