REALITY — sing-box
sing-box هر دو سمت REALITY را پیادهسازی میکند. ورودی (زیربلوک reality: درون بلوک تعبیهشدهٔ tls:) در طول دستدهی TLS، یک سایت شخص ثالث را جا میزند؛ خروجی (نیز تودرتو درون tls:) فقط نیمهٔ کلید عمومی و short ID را نگه میدارد.
reality ورودی
زیر tls.reality قرار دارد. tls.enabled ورودی و tls.reality.enabled هر دو باید true باشند.
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
enabled | bool | false | true | false | روشن کردن REALITY برای این ورودی. وقتی true باشد، دستدهی منظم TLS با دستدهی REALITY جایگزین میشود. |
handshake | InboundRealityHandshakeOptions | (required) | InboundRealityHandshakeOptions | هدف استتار. اتصالات غیرمجاز (SNI اشتباه / short_id اشتباه) بهصورت شفاف به این آدرس پراکسی میشوند، بنابراین ناظران ترافیک را در حال جریان بهسوی یک سایت قانونی میبینند. |
private_key | string | (required) | <base64 X25519 private key> | کلید خصوصی X25519 سرور. با `sing-box generate reality-keypair` تولید کنید. |
short_id | badoption.Listable[string] | [] | [<hex string>] | فهرست shortهای ID مجاز (hex، طول زوج، ≤ 16 کاراکتر). یک ورودی `""` به کلاینتهای بدون short ID اجازه میدهد. |
max_time_difference | badoption.Duration | 0 (no limit) | <duration> | حداکثر انحراف ساعت قابل تحمل بین کلاینت و سرور. اتصالات خارج از این پنجره رد میشوند. مقدار ۰ بررسی را غیرفعال میکند. |
منبع: option/tls.go:193-199 · ثابتشده در v1.13.11 (553cfa1)
handshake
زیربلوک handshake، ServerOptions (server، server_port) و DialerOptions را برای بالادست استتار تعبیه میکند:
"handshake": {
"server": "www.cloudflare.com",
"server_port": 443,
"bind_interface": "eth0"
}reality خروجی
زیر tls.reality در بلوک tls: تعبیهشدهٔ خروجی قرار دارد.
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
enabled | bool | false | true | false | روشن کردن REALITY برای این خروجی. |
public_key | string | (required) | <base64 X25519 public key> | کلید عمومی X25519 سرور. با `private_key` سرور جفت شده است. |
short_id | string | "" | <hex string> | Short ID اعلانشده به سرور. باید با یکی از ورودیهای `short_id` سرور تطبیق یابد (یا خالی اگر سرور اجازه دهد). |
منبع: option/tls.go:234-238 · ثابتشده در v1.13.11 (553cfa1)
تولید کلید
$ 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:
{
"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"]
}
}
}]
}کلاینت:
{
"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)
