Skip to content

Hysteria2 — mihomo

mihomo در هر دو سمت از Hysteria2 پشتیبانی می‌کند. خروجی فیلدهای صریح port-hopping و مجموعهٔ گسترده‌ای از کلیدهای کنترل جریان quic-go را در خود دارد. جدول کاربران ورودی یک نگاشت تخت است — یک جفت نام کاربری/گذرواژه برای هر ورودی.

خروجی

ورودی تحت proxies: با type: hysteria2. BasicOption را جاسازی می‌کند (فیلدهای مشترک خروجی: interface-name، routing-mark، …).

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
namestring(required)<string>نام یکتای پراکسی.
serverstring(required)<host>میزبان یا IP سرور بالادست.
portint(unset)<port>پورت تکی سرور. در صورت تنظیم `ports`، حذف شود.
portsstring(unset)<port-list>فهرست port-hopping. ترکیب جداشده با کاما از پورت‌های تکی و بازه‌ها را می‌پذیرد، مثلاً `"20000,20002-20100"`. در کنار `hop-interval` معنادار است.
hop-intervalstring30<seconds string> | <duration>زمان بین port-hop ها. رشتهٔ عددی ساده (`"30"`) به‌عنوان ثانیه تفسیر می‌شود؛ duration سبک Go (`"30s"`) نیز پذیرفته می‌شود. حداقل ۵ است (`adapter/outbound/hysteria2.go:25`).
upstring(unset)<bandwidth>پهنای باند آپلینک. رشته با واحد، مثلاً `"100 Mbps"`، `"500 kbps"`، `"1 Gbps"`.
downstring(unset)<bandwidth>پهنای باند دانلینک، با همان قالب.
passwordstring(unset)<string>گذرواژهٔ احراز هویت کاربر. فقط در صورتی اختیاری است که سرور به همتاهای ناشناس اجازه دهد.
obfsstring(disabled)salamanderنوع مبهم‌سازی. در حال حاضر فقط `salamander` معنادار است.
obfs-passwordstring(unset)<string>گذرواژهٔ مبهم‌سازی، جدا از گذرواژهٔ کاربر.
obfs-min-packet-sizeint0<bytes>حداقل اندازهٔ پدینگ تصادفی برای مبهم‌سازی Salamander. فقط با `obfs: salamander` معنادار است.
obfs-max-packet-sizeint0<bytes>حداکثر اندازهٔ پدینگ تصادفی برای مبهم‌سازی Salamander.
snistring(server)<SNI>Server Name Indication در TLS. پیش‌فرض `server` است.
ech-optsECHOptions(disabled)ECHOptionsپیکربندی Encrypted Client Hello.
skip-cert-verifyboolfalsetrue | falseغیرفعال‌سازی راستی‌آزمایی TLS (فقط آزمایش).
name-cert-verifystring(unset)<hostname>گواهی سرور را به‌جای SNI در برابر این نام میزبان راستی‌آزمایی می‌کند.
fingerprintstring(unset)<SHA256 hex>تثبیت اثرانگشت گواهی TLS سرور.
certificatestring(unset)<PEM file path>گواهی کلاینت (mTLS).
private-keystring(unset)<key file path>کلید خصوصی برای `certificate`.
alpn[]string[h3]h3فهرست ALPN. Hysteria2 معمولاً از `h3` استفاده می‌کند.
cwndint0<int>بازنویسی پنجرهٔ ازدحام اولیهٔ QUIC.
bbr-profilestring(unset)default | aggressiveپروفایل تنظیم برای گونهٔ Brutal/BBR همراه.
udp-mtuint1200<bytes>MTU برای قطعه‌بندی بارهای UDP درون دیتاگرام QUIC.
realm-optsHysteria2RealmOption(disabled)Hysteria2RealmOptionاتصال از طریق یک *realm* در Hysteria2 — یک سرور چنداجاره‌ای که از طریق یک نقطه‌انتهایی کنترلی به آن می‌رسید. به جدول realm-opts پایین مراجعه کنید.
initial-stream-receive-windowuint640 (quic-go default)<bytes>پنجرهٔ کنترل جریان اولیه به ازای هر جریان.
max-stream-receive-windowuint640 (quic-go default)<bytes>حداکثر پنجرهٔ کنترل جریان به ازای هر جریان.
initial-connection-receive-windowuint640 (quic-go default)<bytes>پنجرهٔ کنترل جریان اولیه برای کل اتصال.
max-connection-receive-windowuint640 (quic-go default)<bytes>حداکثر پنجرهٔ کنترل جریان برای کل اتصال.

منبع: adapter/outbound/hysteria2.go:39-72 · ثابت‌شده در v1.19.29 (e26714a)

ورودی

ورودی تحت listeners: با type: hysteria2. BaseOption را جاسازی می‌کند (listen، port).

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
usersmap[string]string{}{<username>: <password>}جدول کاربران — نگاشت نام کاربری به گذرواژه. خالی به همتاهای ناشناس اجازه می‌دهد.
obfsstring(disabled)salamanderنوع مبهم‌سازی Salamander.
obfs-passwordstring(unset)<string>گذرواژهٔ مبهم‌سازی.
obfs-min-packet-sizeint0<bytes>حداقل اندازهٔ پدینگ تصادفی برای مبهم‌سازی Salamander. فقط با `obfs: salamander` معنادار است.
obfs-max-packet-sizeint0<bytes>حداکثر اندازهٔ پدینگ تصادفی برای مبهم‌سازی Salamander.
certificatestring(required)<PEM file path>گواهی TLS سرور. برای ورودی الزامی است.
private-keystring(required)<key file path>کلید خصوصی TLS.
client-auth-typestring(none)no-client-cert | request-client-cert | require-any-client-cert | verify-client-cert-if-given | require-and-verify-client-certحالت احراز هویت متقابل TLS کلاینت.
client-auth-certstring(unset)<PEM file path>بستهٔ CA پذیرفته‌شده به‌عنوان ریشهٔ کلاینت.
ech-keystring(unset)<ECH config>مواد Encrypted Client Hello.
max-idle-timeint0<seconds>زمان بیکاری در سمت شنونده. مقدار ۰ پیش‌فرض QUIC را حفظ می‌کند.
alpn[]string[h3]h3فهرست ALPN ارائه‌شده در دست‌دهی TLS.
upstring(unset)<bandwidth>پهنای باند آپلینک (رشته با واحد).
downstring(unset)<bandwidth>پهنای باند دانلینک.
ignore-client-bandwidthboolfalsetrue | falseنادیده‌گرفتن اعلام پهنای باند کلاینت و اعمال تنظیمات سرور.
masqueradestring(unset)<URL>هدف ماسکراد — یک رشته URL (`file:///path` یا `https://upstream/`).
cwndint0<int>پنجرهٔ ازدحام اولیهٔ QUIC.
bbr-profilestring(unset)default | aggressiveپروفایل تنظیم Brutal/BBR.
udp-mtuint1200<bytes>MTU قطعه‌بندی دیتاگرام UDP.
mux-optionMuxOption(disabled)MuxOptionتنظیمات چندسوسازی سبک sing.
realm-optsHysteria2RealmOption(disabled)Hysteria2RealmOptionاتصال از طریق یک *realm* در Hysteria2 — یک سرور چنداجاره‌ای که از طریق یک نقطه‌انتهایی کنترلی به آن می‌رسید. به جدول realm-opts پایین مراجعه کنید.
initial-stream-receive-windowuint640 (quic-go default)<bytes>پنجرهٔ کنترل جریان اولیه به ازای هر جریان.
max-stream-receive-windowuint640 (quic-go default)<bytes>حداکثر پنجرهٔ کنترل جریان به ازای هر جریان.
initial-connection-receive-windowuint640 (quic-go default)<bytes>پنجرهٔ جریان اولیهٔ اتصال.
max-connection-receive-windowuint640 (quic-go default)<bytes>حداکثر پنجرهٔ جریان اتصال.

منبع: listener/inbound/hysteria2.go:12-42 · ثابت‌شده در v1.19.29 (e26714a)

realm-opts

هر دو بلوک realm-opts در خروجی و ورودی، شکل یکسانی دارند. روی یک خروجی، آن‌ها یک پراکسی را به یک realm در Hysteria2 — یک مستأجر میزبانی‌شده روی یک سرور چند-realm — از طریق یک نقطه‌انتهایی کنترلی هدایت می‌کنند که جزئیات واقعی اتصال را بازمی‌گرداند. حالت realm یک قابلیت جدیدتر و پیشرفته است؛ آن را غیرفعال نگه دارید مگر اینکه به یک سرور realm متصل می‌شوید.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
enableboolfalsetrue | falseفعال‌سازی حالت realm برای این پراکسی.
server-urlstring(unset)<URL>URL سرور کنترل realm که برای دریافت جزئیات اتصال realm استفاده می‌شود.
tokenstring(unset)<string>توکن احراز هویت ارائه‌شده به سرور کنترل realm.
realm-idstring(unset)<string>شناسهٔ realm برای پیوستن.
stun-servers[]string(unset)<host:port list>سرورهای STUN استفاده‌شده برای عبور از NAT در realm.
snistring(unset)<SNI>SNI در TLS برای اتصال به سرور کنترل.
skip-cert-verifyboolfalsetrue | falseرد کردن راستی‌آزمایی TLS به‌سمت سرور کنترل (فقط آزمایش).
name-cert-verifystring(unset)<hostname>گواهی سرور را به‌جای SNI در برابر این نام میزبان راستی‌آزمایی می‌کند.
fingerprintstring(unset)<SHA256 hex>تثبیت اثرانگشت گواهی TLS سرور کنترل.
certificatestring(unset)<PEM file path>گواهی کلاینت (mTLS) به‌سمت سرور کنترل.
private-keystring(unset)<key file path>کلید خصوصی برای `certificate`.
alpn[]string(unset)<string list>ALPN برای اتصال به سرور کنترل.

منبع: adapter/outbound/hysteria2.go:74-89 · ثابت‌شده در v1.19.29 (e26714a)

مثال‌ها

خروجی — پورت تکی، obfs salamander، 100/300 Mbps:

yaml
proxies:
  - name: hy2-plain
    type: hysteria2
    server: example.com
    port: 443
    password: <password>
    obfs: salamander
    obfs-password: <obfs>
    sni: example.com
    up: 100 Mbps
    down: 300 Mbps
    alpn: [h3]

خروجی — port-hopping در بازهٔ 20000-20100:

yaml
proxies:
  - name: hy2-hop
    type: hysteria2
    server: example.com
    ports: 20000-20100
    hop-interval: 30s
    password: <password>
    obfs: salamander
    obfs-password: <obfs>
    sni: example.com
    up: 200 Mbps
    down: 1 Gbps
    alpn: [h3]

خروجی که از طریق یک realm و یک سرور کنترل متصل می‌شود:

yaml
proxies:
  - name: hy2-realm
    type: hysteria2
    server: example.com
    port: 443
    password: <password>
    sni: example.com
    alpn: [h3]
    realm-opts:
      enable: true
      server-url: https://realm.example.com/control
      token: <realm-token>
      realm-id: team-a
      stun-servers:
        - stun.example.com:3478

ورودی با دو کاربر و ماسکراد فایل HTTP:

yaml
listeners:
  - name: hy2-in
    type: hysteria2
    listen: 0.0.0.0
    port: 443
    users:
      alice: <alice-password>
      bob: <bob-password>
    obfs: salamander
    obfs-password: <obfs>
    certificate: /etc/mihomo/server.crt
    private-key: /etc/mihomo/server.key
    up: 500 Mbps
    down: 1 Gbps
    masquerade: file:///var/www
    alpn: [h3]

نکات

  • ports ترکیبی از پورت‌های تکی و بازه‌های جداشده با کاما را می‌پذیرد، مثلاً "20000,20002-20100,30000". port و ports با هم ناسازگارند — یکی را انتخاب کنید. هنگامی که ports تنظیم شود، mihomo هر hop-interval یک عضو تازه به‌صورت تصادفی برمی‌گزیند.
  • حداقل hop-interval ۵ ثانیه است (adapter/outbound/hysteria2.go:25) — مقادیر کمتر از ۵ به بالا کلمپ می‌شوند.
  • مقادیر پهنای باند پسوند واحد می‌پذیرند (b، kbps، Mbps، Gbps، Tbps) با فاصله بین عدد و واحد — "100 Mbps". این رشته‌ها توسط کمکی tools.StringToBps در mihomo تجزیه می‌شوند.
  • obfs-min-packet-size و obfs-max-packet-size فقط با obfs: salamander اعمال می‌شوند. آن‌ها کران‌های پدینگ تصادفی را برای مبهم‌ساز Salamander تنظیم می‌کنند؛ با هر obfs دیگر (یا بدون آن) نادیده گرفته می‌شوند.
  • users در ورودی mihomo یک نگاشت YAML است، نه فهرست شیء. کلید نام کاربری و مقدار گذرواژه است، مثلاً users: { alice: pw1, bob: pw2 }. برای اجازه دادن به کلاینت‌های ناشناس، نگاشت را خالی بگذارید.
  • چهار فیلد *-receive-window کلیدهای مستقیم برای پشتهٔ quic-go همراه هستند. بیشتر کاربران باید آن‌ها را روی 0 (پیش‌فرض) بگذارند. برای بهبود توان عبور روی پیوندهای با BDP بالا، پنجره‌های سطح اتصال را افزایش دهید.

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

  • Xray-core پیکربندی را میان settings (version/clients) و streamSettings.hysteriaSettings (auth/bandwidth/masquerade) تقسیم می‌کند. به Hysteria2 — Xray-core مراجعه کنید.
  • sing-box پیکربندی را در یک بلوک نگه می‌دارد ولی برای پهنای باند از عدد صحیح ساده Mbps (بدون پسوند واحد) استفاده می‌کند و مقدار چندریختی masquerade (URL رشته یا شیء تایپ‌شده) را ارائه می‌دهد. به Hysteria2 — sing-box مراجعه کنید.
  • mihomo همچنین می‌تواند realmها را میزبانی کند — به شنوندهٔ realm در Hysteria2 مراجعه کنید.

منبع: adapter/outbound/hysteria2.go:39-89 · v1.19.29 (e26714a)

Core Tutorial اثر Argsment