Skip to content

REALITY — sing-box

sing-box هر دو سمت REALITY را پیاده‌سازی می‌کند. ورودی (زیربلوک reality: درون بلوک تعبیه‌شدهٔ tls:) در طول دست‌دهی TLS، یک سایت شخص ثالث را جا می‌زند؛ خروجی (نیز تودرتو درون tls:) فقط نیمهٔ کلید عمومی و short ID را نگه می‌دارد.

reality ورودی

زیر tls.reality قرار دارد. tls.enabled ورودی و tls.reality.enabled هر دو باید true باشند.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
enabledboolfalsetrue | falseروشن کردن REALITY برای این ورودی. وقتی true باشد، دست‌دهی منظم TLS با دست‌دهی REALITY جایگزین می‌شود.
handshakeInboundRealityHandshakeOptions(required)InboundRealityHandshakeOptionsهدف استتار. اتصالات غیرمجاز (SNI اشتباه / short_id اشتباه) به‌صورت شفاف به این آدرس پراکسی می‌شوند، بنابراین ناظران ترافیک را در حال جریان به‌سوی یک سایت قانونی می‌بینند.
private_keystring(required)<base64 X25519 private key>کلید خصوصی X25519 سرور. با `sing-box generate reality-keypair` تولید کنید.
short_idbadoption.Listable[string][][<hex string>]فهرست shortهای ID مجاز (hex، طول زوج، ≤ 16 کاراکتر). یک ورودی `""` به کلاینت‌های بدون short ID اجازه می‌دهد.
max_time_differencebadoption.Duration0 (no limit)<duration>حداکثر انحراف ساعت قابل تحمل بین کلاینت و سرور. اتصالات خارج از این پنجره رد می‌شوند. مقدار ۰ بررسی را غیرفعال می‌کند.

منبع: option/tls.go:193-199 · ثابت‌شده در v1.13.11 (553cfa1)

handshake

زیربلوک handshake، ServerOptions (server، server_port) و DialerOptions را برای بالادست استتار تعبیه می‌کند:

json
"handshake": {
  "server": "www.cloudflare.com",
  "server_port": 443,
  "bind_interface": "eth0"
}

reality خروجی

زیر tls.reality در بلوک tls: تعبیه‌شدهٔ خروجی قرار دارد.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
enabledboolfalsetrue | falseروشن کردن REALITY برای این خروجی.
public_keystring(required)<base64 X25519 public key>کلید عمومی X25519 سرور. با `private_key` سرور جفت شده است.
short_idstring""<hex string>Short ID اعلان‌شده به سرور. باید با یکی از ورودی‌های `short_id` سرور تطبیق یابد (یا خالی اگر سرور اجازه دهد).

منبع: option/tls.go:234-238 · ثابت‌شده در v1.13.11 (553cfa1)

تولید کلید

sh
$ sing-box generate reality-keypair
PrivateKey: <base64-private-key>
PublicKey:  <base64-public-key>

کلید خصوصی به private_key سرور می‌رود؛ کلید عمومی به public_key کلاینت‌ها می‌رود. Short IDها رشته‌های hex دلخواهی هستند که برای هر کلاینت اختصاص می‌دهید.

مثال‌ها

سرور — VLESS روی REALITY در حال جا زدن www.cloudflare.com:

json
{
  "inbounds": [{
    "type": "vless",
    "tag": "vless-reality",
    "listen": "::",
    "listen_port": 443,
    "users": [{ "uuid": "...", "flow": "xtls-rprx-vision" }],
    "tls": {
      "enabled": true,
      "server_name": "www.cloudflare.com",
      "reality": {
        "enabled": true,
        "handshake": {
          "server": "www.cloudflare.com",
          "server_port": 443
        },
        "private_key": "<base64-private-key>",
        "short_id": ["", "0123456789abcdef"]
      }
    }
  }]
}

کلاینت:

json
{
  "outbounds": [{
    "type": "vless",
    "server": "your.server.example",
    "server_port": 443,
    "uuid": "...",
    "flow": "xtls-rprx-vision",
    "tls": {
      "enabled": true,
      "server_name": "www.cloudflare.com",
      "utls": { "enabled": true, "fingerprint": "chrome" },
      "reality": {
        "enabled": true,
        "public_key": "<base64-public-key>",
        "short_id": "0123456789abcdef"
      }
    }
  }]
}

نکات

  • handshake.server و handshake.server_port با هم هدف استتار را تشکیل می‌دهند — Xray به این dest می‌گوید. اتصالات غیرمجاز به‌صورت شفاف به این مقصد پراکسی می‌شوند، بنابراین الگوی روی سیم شبیه گفتگو با آن سایت به نظر می‌رسد.
  • خروجی عمداً حداقلی است — فقط public_key و short_id. هر چیز دیگر (SNI، ALPN، اثرانگشت) از بلوک tls پیرامون می‌آید.
  • tls.utls تقریباً همیشه هنگام استفاده از tls.reality در خروجی تنظیم می‌شود. بدون uTLS، ClientHello دارای اثرانگشت Go-stdlib است که با مرورگر تطبیق نمی‌یابد و استتار را شکست می‌دهد.
  • max_time_difference پنجرهٔ رد انحراف ساعت است. برای راه‌اندازی‌هایی که سرورها و کلاینت‌ها منبع NTP مشترک ندارند، آن را سخاوتمندانه پیکربندی کنید (مثلاً ۱ دقیقه).

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

  • Xray-core هر فیلد REALITY را در یک ساختار REALITYConfig منفرد نگه می‌دارد (هر دو فیلد سرور و کلاینت در یکجا). هدف استتار فیلد dest است. بنگرید به REALITY — Xray-core.
  • mihomo ساختارها را بر اساس ورودی/خروجی تقسیم می‌کند و از نام‌های فیلد kebab-case استفاده می‌کند (public-key، private-key، short-id، server-names). بنگرید به REALITY — mihomo.

منبع: option/tls.go:193-238 · v1.13.11 (553cfa1)

Core Tutorial اثر Argsment