Skip to content

Hysteria realm — sing-box ​

‏hysteria-realm یک سرویس میعادگاه برای عبور از NAT در Hysteria2 است. یک سرور Hysteria2 پشت NAT آدرس‌های عمومی خود را با STUN کشف می‌کند و آن‌ها را با یک شناسهٔ realm در این سرویس ثبت می‌کند؛ کلاینت‌ها این آدرس‌ها را از realm می‌پرسند، دو طرف سوراخ UDP می‌زنند و سپس اتصال QUIC مستقیماً برقرار می‌شود. realm فقط سیگنال‌دهی صفحهٔ کنترل را حمل می‌کند — ترافیک پراکسی هرگز از آن عبور نمی‌کند.

گزینه‌ها ​

type: "hysteria-realm" زیر services[]:

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
users[]HysteriaRealmUser(required)[HysteriaRealmUser]حساب‌هایی که اجازهٔ استفاده از realm را دارند. دست‌کم یکی لازم است؛ وگرنه راه‌اندازی شکست می‌خورد.

منبع: option/hysteria2.go:235-240 · ثابت‌شده در v1.14.2 (af6e64c)

این سرویس همچنین ListenOptions (ورودی‌ها را ببینید)، یک بلوک tls ورودی (TLS را ببینید) و فیلدهای HTTP/2 زیر را جاسازی می‌کند. با tls، ‏HTTP/2 روی TLS ارائه می‌شود (h2 خودکار به فهرست ALPN افزوده می‌شود)؛ بدون آن، HTTP متن‌آشکار — ‏HTTP/1.1، و HTTP/2 متن‌آشکار هم پذیرفته می‌شود.

users[] ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
namestring(required)<string>نام حساب، برای گزارش‌ها و به‌عنوان کلید سهمیهٔ realm به ازای کاربر.
tokenstring(required)<string>توکن Bearer که ورودی‌ها و خروجی‌های Hysteria2 به‌صورت Authorization: Bearer <token> ارائه می‌کنند (همان realm.token آن‌ها).
max_realmsint0<int>تعداد اسلات‌های realm که این حساب می‌تواند هم‌زمان در اختیار داشته باشد. 0 یعنی نامحدود؛ فراتر از حد، ثبت‌نام با HTTP 429 رد می‌شود.

منبع: option/hysteria2.go:229-233 · ثابت‌شده در v1.14.2 (af6e64c)

فیلدهای HTTP/2 ​

این فیلدها سرور HTTP/2 سرویس را تنظیم می‌کنند و فقط وقتی کلاینت‌ها HTTP/2 صحبت می‌کنند اهمیت دارند.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
idle_timeoutbadoption.Duration(Go default)<duration>بستن اتصال‌های HTTP/2 که این مدت بیکار بمانند.
keep_alive_periodbadoption.Duration(disabled)<duration>ارسال PING در HTTP/2 وقتی این مدت چیزی خوانده نشده، برای تشخیص اتصال‌های مرده.
stream_receive_window*byteformats.MemoryBytes(Go default)<size>بافر بارگذاری هر جریان (پنجرهٔ کنترل جریان)، به‌صورت اندازهٔ حافظه.
connection_receive_window*byteformats.MemoryBytes(Go default)<size>بافر بارگذاری هر اتصال، به‌صورت اندازهٔ حافظه.
max_concurrent_streamsint(Go default)<int>بیشینهٔ جریان‌های هم‌زمان HTTP/2 در هر اتصال.

منبع: option/http.go:14-20 · ثابت‌شده در v1.14.2 (af6e64c)

Hysteria2 چگونه از realm استفاده می‌کند ​

  • سمت سرور: روی ورودی Hysteria2 ‏realm را تنظیم کنید، با server_url که به این سرویس اشاره می‌کند، یک token از users[]، یک realm_id و stun_servers. ورودی آدرس‌هایی را که با STUN کشف کرده زیر آن شناسه ثبت می‌کند و ثبت‌نام را با ضربان‌های heartbeat زنده نگه می‌دارد.
  • سمت کلاینت: روی خروجی Hysteria2 ‏realm را (به‌جای server) تنظیم کنید، با همان server_url، یک token معتبر و همان realm_id. خروجی آدرس‌ها را جست‌وجو می‌کند، سوراخ‌زنی می‌کند و سپس دست‌دهی عادی QUIC را انجام می‌دهد.
  • جزئیات فیلدها (ip_version، port_mapping، http_client، stun_domain_resolver) در صفحهٔ Hysteria2 آمده است.

مثال حداقلی ​

سرویس realm، روی میزبانی با آدرس عمومی پایدار:

json
{
  "services": [
    {
      "type": "hysteria-realm",
      "tag": "realm",
      "listen": "::",
      "listen_port": 8443,
      "tls": {
        "enabled": true,
        "certificate_path": "/etc/ssl/realm.pem",
        "key_path": "/etc/ssl/realm.key"
      },
      "users": [
        { "name": "home", "token": "<token>", "max_realms": 2 }
      ]
    }
  ]
}

بلوک realm متناظر روی ورودی Hysteria2 پشت NAT (خروجی از همان server_url، token و realm_id استفاده می‌کند):

json
"realm": {
  "server_url": "https://realm.example.com:8443",
  "token": "<token>",
  "realm_id": "home-server",
  "stun_servers": ["stun.l.google.com:19302"]
}

نکات ​

  • به برچسب ساخت with_quic نیاز دارد؛ بدون آن، این نوع وجود دارد اما هنگام راه‌اندازی شکست می‌خورد.
  • users نباید خالی باشد و هر مدخل باید هم name و هم token داشته باشد.
  • یک شناسهٔ realm در هر لحظه فقط در اختیار یک ثبت‌نام است: سرور دومی که همان شناسه را ثبت کند HTTP 409 ‏(realm_taken) دریافت می‌کند.
  • API زیر /v1/<realm_id> قرار دارد — اگر یک پراکسی معکوس جلوی آن می‌گذارید، این مسیر را دست‌نخورده نگه دارید.
  • فقط realm باید از اینترنت در دسترس باشد؛ سرور Hysteria2 پشت NAT به هدایت پورت نیازی ندارد.

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

  • mihomo یک شنوندهٔ میعادگاه معادل دارد، Hysteria2 realm، با یک token مشترک به‌همراه سقف‌های max-realms / max-realms-per-ip به‌جای توکن‌های به ازای کاربر.
  • Xray-core سرور realm ندارد؛ ماسک UDP از نوع realm در finalmask آن همتای سمت نقطه‌انتهایی است. Hysteria2 — Xray-core را ببینید.

منبع: option/hysteria2.go:229-240 · v1.14.2 (af6e64c)

Core Tutorial اثر Argsment