Skip to content

REALITY — Xray-core

REALITY جایگزین توسعه‌یافتهٔ Xray برای TLS با گواهی عمومی است: سرور در طول دست‌دهی TLS از یک وب‌سایت واقعی شخص ثالث جعل هویت می‌کند، برای کلاینت‌های غیرمجاز به یک پراکسی شفاف رجوع می‌کند و کلاینت‌های مجاز را به یک نشست پراکسی واقعی ارتقا می‌دهد. خود دست‌دهی از اتصال به سایت جعل‌هویت‌شده قابل تشخیص نیست.

پیکربندی

در streamSettings.realitySettings تنظیم کنید زمانی که streamSettings.security مقدار "reality" باشد. همان ساختار هم فیلدهای سرور (ورودی) و هم کلاینت (خروجی) را نگه می‌دارد؛ فقط نیمی از گزینه‌ها در هر سمت مرتبط است.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
masterKeyLogstring(unset)<file path>تخلیهٔ کلید به سبک SSLKEYLOGFILE برای عیب‌یابی. در تولید فعال نکنید.
showboolfalsetrue | falseچاپ اطلاعات مفصل دست‌دهی REALITY در گزارش خطا برای هر اتصال. فقط تشخیصی — خروجی زیادی تولید می‌کند.
targetjson.RawMessage(use dest)<host:port>ورودی — نام مستعار برای `dest`. یکی را تنظیم کنید، نه هر دو را.
destjson.RawMessage(required)<host:port>ورودی — هدف دست‌دهی استتار. وقتی کلاینت یک همتای مشروع REALITY نباشد، TLS Client Hello به این آدرس پراکسی می‌شود؛ این سایت 'واقعی' است که ناظران خواهند دید.
typestring(auto)tcp | unixورودی — پروتکل بک‌اند برای `dest`. از شکل `dest` استنباط می‌شود.
xveruint6400 | 1 | 2ورودی — نسخهٔ پروتکل PROXY برای پیش‌افزودن هنگام ارجاع به `dest`.
serverNames[]string(required)[<hostname>]ورودی — نام‌های TLS SNI که ورودی می‌پذیرد. اتصال‌هایی با SNI متفاوت به `dest` ارجاع داده می‌شوند (مسیر استتار).
privateKeystring(required)<base64 X25519 private key>ورودی — کلید خصوصی X25519. با `xray x25519` تولید کنید.
minClientVerstring(unset)<semver>ورودی — حداقل نسخهٔ Xray که یک کلاینت مجاز است اعلام کند. کلاینت‌های قدیمی‌تر رد می‌شوند.
maxClientVerstring(unset)<semver>ورودی — حداکثر نسخهٔ Xray که یک کلاینت مجاز است اعلام کند.
maxTimeDiffuint64(unset)<milliseconds>ورودی — حداکثر اختلاف ساعت قابل تحمل بین کلاینت و سرور، به میلی‌ثانیه. فراتر از این دست‌دهی را رد می‌کند.
shortIds[]string(required)[<hex string>]ورودی — فهرست شناسه‌های کوتاه مجاز (هگز، طول زوج، حداکثر 16 کاراکتر). ورودی خالی `""` به کلاینت‌هایی که شناسهٔ کوتاه اعلام نمی‌کنند اجازه می‌دهد. معمولاً به هر کاربر مجاز یک شناسهٔ کوتاه یکتا داده می‌شود.
mldsa65Seedstring(unset)<base64 seed>ورودی — بذر امضای پساکوانتومی ML-DSA-65. با `mldsa65Verify` روی کلاینت‌ها همراه کنید.
limitFallbackUploadLimitFallback(unset)LimitFallbackورودی — محدود کردن نرخ جهت آپلود پس از اینکه یک کلاینت مجاز به پراکسی واقعی منتقل شد. برای جداناشدنی کردن REALITY از یک سایت مشروع کند استفاده می‌شود.
limitFallbackDownloadLimitFallback(unset)LimitFallbackورودی — همان برای جهت دانلود.
fingerprintstringchromechrome | firefox | safari | edge | 360 | qq | ios | android | random | randomizedخروجی — اثرانگشت کلاینت‌هلوی uTLS. شکل ClientHello روی سیم را هدایت می‌کند.
serverNamestring(required)<hostname>خروجی — SNI ارسالی در ClientHello. باید با یکی از `serverNames` سرور تطبیق داشته باشد.
passwordstring(required)<string>خروجی — رمز عبور REALITY (کلید عمومی X25519 به‌علاوهٔ یک برچسب احراز هویت). با `xray reality` تولید کنید.
publicKeystring(unset)<base64 X25519 public key>خروجی — جایگزینی برای `password`؛ کلید عمومی X25519 سرور به‌طور مستقیم.
shortIdstring""<hex string>خروجی — شناسهٔ کوتاه اعلام‌شده به سرور. باید در فهرست `shortIds` سرور باشد. رشتهٔ خالی فقط زمانی مجاز است که سرور `""` را فهرست کند.
mldsa65Verifystring(unset)<base64 verify key>خروجی — کلید تأیید ML-DSA-65 که با `mldsa65Seed` سرور تطبیق می‌کند.
spiderXstring(unset)/<path>خروجی — اشارهٔ عنکبوت‌مانند به سبک مسیر که رفتار مرور مشروع را در طول دست‌دهی استتار تقلید می‌کند.

منبع: infra/conf/transport_internet.go:780-805 · ثابت‌شده در v1.260327.0 (d2758a0)

تولید کلید

REALITY به یک جفت‌کلید X25519 نیاز دارد. با دستور پیوست‌شدهٔ Xray تولید کنید:

sh
$ xray x25519
Private key: <base64-private-key>
Public key:  <base64-public-key>
Password:    <base64-password>

Private key به privateKey سرور می‌رود. کلاینت‌ها از password (توصیه‌شده — کلید عمومی را با یک برچسب احراز هویت بسته‌بندی می‌کند) یا publicKey به‌طور مستقیم استفاده می‌کنند.

برای محافظت پساکوانتومی ML-DSA-65 (اختیاری):

sh
$ xray mldsa65
Seed:   <base64-seed>
Verify: <base64-verify-key>

مثال‌ها

سرور (VLESS + REALITY که www.cloudflare.com را جعل هویت می‌کند):

json
{
  "inbounds": [{
    "tag": "vless-reality",
    "listen": "0.0.0.0",
    "port": 443,
    "protocol": "vless",
    "settings": {
      "clients": [{ "id": "<UUID>", "flow": "xtls-rprx-vision" }],
      "decryption": "none"
    },
    "streamSettings": {
      "network": "tcp",
      "security": "reality",
      "realitySettings": {
        "show": false,
        "dest": "www.cloudflare.com:443",
        "xver": 0,
        "serverNames": ["www.cloudflare.com"],
        "privateKey": "<base64-private-key>",
        "shortIds": ["", "0123456789abcdef"]
      }
    }
  }]
}

کلاینت که با سرور بالا تطبیق می‌کند:

json
{
  "outbounds": [{
    "tag": "vless-reality",
    "protocol": "vless",
    "settings": {
      "address": "your.server.example",
      "port": 443,
      "id": "<UUID>",
      "flow": "xtls-rprx-vision",
      "encryption": "none"
    },
    "streamSettings": {
      "network": "tcp",
      "security": "reality",
      "realitySettings": {
        "fingerprint": "chrome",
        "serverName": "www.cloudflare.com",
        "password": "<base64-password>",
        "shortId": "0123456789abcdef"
      }
    }
  }]
}

نکات

  • dest همان هدف استتار است. یک سایت واقعی انتخاب کنید که گواهی TLS آن به‌طور عمومی مورد اعتماد باشد؛ ناظران ترافیک را برای کلاینت‌هایی که مجاز نیستند به این سایت در حال جریان می‌بینند. انتخاب‌های رایج: www.cloudflare.com، www.microsoft.com، dl.google.com.
  • serverNames باید حاوی SNI ای باشد که کلاینت‌ها از آن استفاده خواهند کرد. ترافیک سروری که با SNI فهرست‌نشده می‌رسد به‌طور بی‌صدا به dest ارجاع داده می‌شود — مسیر جایگزینی که REALITY را از سایت واقعی غیرقابل تشخیص می‌سازد.
  • shortIds تمایز per-user-or-group است. هر کلاینت مجاز یک ورودی از فهرست را استفاده می‌کند. "" (خالی) را اضافه کنید اگر می‌خواهید به کلاینت‌های بدون شناسهٔ کوتاه اجازه دهید؛ برای حالت سخت‌گیرانه آن را حذف کنید.
  • password بر publicKey توصیه می‌شود: کلید عمومی را با یک برچسب احراز هویت اضافی رمزگذاری می‌کند، بنابراین کلید عمومی به‌تنهایی دزدیده‌شده برای احراز هویت کافی نیست.
  • limitFallbackUpload / limitFallbackDownload توان عبوری کلاینت‌های مجاز را پس از ارتقای REALITY محدود می‌کنند. تنظیم این‌ها برای تطبیق با پهنای‌باند بالادست واقعی، شناسایی REALITY از طریق اثرانگشت پهنای‌باند را دشوارتر می‌سازد.
  • show: true گزارش‌های مفصل از هر دست‌دهی REALITY تولید می‌کند — فقط برای آزمایش استفاده کنید.

نکات بین‌هسته‌ای

  • sing-box شِمای را به‌طور تمیز به InboundRealityOptions و OutboundRealityOptions تقسیم می‌کند، به‌طوری که هدف استتار داخل یک زیربلوک handshake تو در تو قرار دارد. ببینید REALITY — sing-box.
  • mihomo نیز از دو ساختار استفاده می‌کند: RealityOptions خروجی (فقط public-key + short-id) و RealityConfig ورودی (سمت سرور با dest، private-key، server-names، short-id، …). ببینید REALITY — mihomo.

منبع: infra/conf/transport_internet.go:780-805 · v1.260327.0 (d2758a0)

Core Tutorial اثر Argsment