Skip to content

Hysteria2 — Xray-core ​

Xray-core از Hysteria v2 پشتیبانی می‌کند اما پیکربندی را در چند بلوک تقسیم می‌کند: settings سطح پروتکل (نسخه، آدرس/پورت، کاربران)، streamSettings.hysteriaSettings سطح ترابرد (احراز هویت، مهلت بیکاری UDP، استتار)، و streamSettings.finalmask برای کنترل ازدحام، پهنای باند و پرش پورت. settings و hysteriaSettings هر دو باید پر شوند تا خروجی قابل استفاده باشد.

خروجی — لایهٔ پروتکل ​

settings برای یک خروجی با "protocol": "hysteria":

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
versionint32(required)2باید دقیقاً 2 باشد. هر مقدار دیگری در زمان راه‌اندازی رد می‌شود (infra/conf/hysteria.go:19-21).
address*Address(required)<host>نام میزبان یا IP سرور.
portuint16(required)<port>پورت UDP سرور.

منبع: infra/conf/hysteria.go:13-17 · ثابت‌شده در v26.9.9 (52a412d)

Hysteria v1 پشتیبانی نمی‌شود

فیلد version باید برابر 2 باشد. HysteriaClientConfig.Build (infra/conf/hysteria.go:19-21) برای هر چیز دیگری errors.New("version != 2") را برمی‌گرداند.

ورودی — لایهٔ پروتکل ​

settings برای یک ورودی با "protocol": "hysteria":

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
versionint32(required)2باید 2 باشد.
users[]*HysteriaUserConfig[][HysteriaUserConfig]کاربران پذیرفته‌شده. users و clients کلیدهای هم‌ارز با شکل یکسان هستند.
clients[]*HysteriaUserConfig[][HysteriaUserConfig]کاربران پذیرفته‌شده (کلید جایگزین؛ همان شکل users).

منبع: infra/conf/hysteria.go:39-43 · ثابت‌شده در v26.9.9 (52a412d)

clients[] ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
authstring(required)<string>رشتهٔ احراز هویت.
leveluint320<uint32>سطح policy برای این کاربر.
emailstring(unset)<string>برچسب در آمار/لاگ.

منبع: infra/conf/hysteria.go:33-37 · ثابت‌شده در v26.9.9 (52a412d)

لایهٔ ترابرد — hysteriaSettings ​

زیر streamSettings.hysteriaSettings تنظیم می‌شود. شامل احراز هویت، مهلت بیکاری UDP و استتار ورودی است؛ کنترل ازدحام، پهنای باند و پرش پورت در finalmask قرار دارند (پایین‌تر).

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
versionint32(required)2نسخهٔ پروتکل Hysteria. باید با version در settings تطبیق داشته باشد.
authstring(required on outbound)<string>رشتهٔ auth خروجی. در ورودی این فیلد به اعتبارسنج ارسال می‌شود اما auth به ازای کاربر در settings.clients[].auth قرار دارد.
udpIdleTimeoutint6460<2..600 seconds>ثانیه‌های بیکاری جریان UDP پیش از بسته شدن جریان QUIC. باید بین 2 و 600 (شامل) باشد (infra/conf/transport_method.go:764-766).
masqueradeMasquerade(unset)Masqueradeفقط ورودی: استتار پاسخ HTTP برای ترافیک احراز نشده.

منبع: infra/conf/transport_method.go:752-757 · ثابت‌شده در v26.9.9 (52a412d)

masquerade ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
typestring(required)file | proxy | stringانتخاب می‌کند کدام زیربلوک اعمال شود.
dirstring(file only)<dir path>دایرکتوری ارائه‌شده وقتی type: file.
urlstring(proxy only)<URL>URL بالادست وقتی type: proxy.
rewriteHostboolfalsetrue | falseبازنویسی سرآیند Host هنگام پراکسی (type: proxy).
xForwardedboolfalsetrue | falseافزودن سرآیندهای X-Forwarded-For / X-Forwarded-Host / X-Forwarded-Proto به درخواست‌های پراکسی‌شده (type: proxy).
insecureboolfalsetrue | falseرد کردن راستی‌آزمایی TLS روی upstream وقتی type: proxy.
contentstring(string only)<text>بدنه‌ای که وقتی type: string بازگردانده می‌شود.
headersmap[string]string{}{<header>: <value>}سرآیندهای پاسخ اضافی وقتی type: string.
statusCodeint32200<int>کد وضعیت بازگردانده‌شده وقتی type: string.

منبع: infra/conf/transport_method.go:737-750 · ثابت‌شده در v26.9.9 (52a412d)

فیلد type زیربلوک فعال را سوییچ می‌کند: file از dir استفاده می‌کند، proxy از url/rewriteHost/xForwarded/insecure، و string از content/headers/statusCode.

کنترل ازدحام و پهنای باند — finalmask.quicParams ​

زیر streamSettings.finalmask.quicParams تنظیم می‌شود (بلوک پارامترهای QUIC که با دیگر ترابردهای مبتنی بر QUIC مشترک است). فیلدهای مرتبط با Hysteria:

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
congestionstring(empty)brutal | force-brutal | bbr | renoکنترل ازدحام برای Hysteria. خالی / brutal: وقتی brutalUp و نرخ دریافت اعلام‌شدهٔ همتا هر دو معلوم باشند، Brutal با کمینهٔ آن دو؛ وگرنه BBR. force-brutal: همیشه Brutal با brutalUp (به brutalUp نیاز دارد). bbr: همیشه BBR. reno: Reno ساده.
bbrProfilestringstandardconservative | standard | aggressiveنمایهٔ تنظیم BBR؛ هر زمان BBR انتخاب شود به کار می‌رود. مقادیر ناشناخته هنگام ساخت پیکربندی خطا می‌دهند.
brutalUpBandwidth(unset)<bandwidth>نرخ ارسال این سمت برای Brutal، به‌صورت رشتهٔ دارای واحد (بخش «نحو پهنای باند» را ببینید). در صورت تنظیم باید دست‌کم 65536 بایت بر ثانیه (512 kbps) باشد.
brutalDownBandwidth(unset)<bandwidth>نرخ دریافتی که این سمت هنگام دست‌دهی Hysteria به همتا اعلام می‌کند؛ همتا نرخ ارسال Brutal خود را به آن محدود می‌کند. نحو و کمینهٔ آن مانند brutalUp است.
brutalDisableLossCompensationboolfalsetrue | falseمانع می‌شود Brutal برای جبران اتلاف بستهٔ اندازه‌گیری‌شده نرخ ارسال را بالا ببرد — در این حالت دقیقاً با نرخ پیکربندی‌شده ارسال می‌کند.

منبع: infra/conf/transport_finalmask.go:993-1011 · ثابت‌شده در v26.9.9 (52a412d)

پرش پورت — udphop در finalmask.udp ​

پرش پورت یک ماسک UDP سمت کلاینت است: یک مدخل با "type": "udphop" به streamSettings.finalmask.udp بیفزایید و گزینه‌های زیر را در settings آن قرار دهید. این مدخل باید نخستین مدخل finalmask.udp باشد و فقط برای خروجی است — ورودی آن را با udphop: client only رد می‌کند. سرور همچنان روی یک پورت گوش می‌دهد؛ بازهٔ پرش را به همان پورت هدایت کنید (مثلاً با قاعدهٔ DNAT / REDIRECT در iptables).

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
sockopt*SocketConfig(unset)SocketConfigگزینه‌های سوکت برای سوکت‌های محلی تازه‌ای که intervalLocal در هر پرش باز می‌کند.
modestring(required)intervalLocal | intervalRemote | perConnRemote | <comma-separated combination>در هر پرش چه چیزی تغییر کند (بدون حساسیت به بزرگی و کوچکی حروف، جداشده با ویرگول). intervalLocal در هر بازه یک سوکت UDP محلی تازه (پورت مبدأ جدید) باز می‌کند؛ intervalRemote در هر بازه پورت / IP مقصد جدیدی از remotePorts / remoteIPs برمی‌گزیند؛ perConnRemote برای هر اتصال فقط یک‌بار مقصدی تصادفی برمی‌گزیند. مقدار خالی یا ناشناخته هنگام ساخت پیکربندی خطا می‌دهد. پاسخ‌ها فقط روی سوکت‌هایی خوانده می‌شوند که یک پرش intervalLocal باز کرده است، پس آن را بگنجانید (مثلاً "intervalLocal,intervalRemote").
intervalInt32Range(required)<seconds> | "<min>-<max>"ثانیه‌های بین دو پرش؛ بازه هر بار یک مقدار تصادفی برمی‌گزیند. هر دو سر باید دست‌کم 5 باشند — وگرنه اتصال هنگام برقراری با invalid interval شکست می‌خورد.
remotePortsPortList(keep original port)<port / range list>پورت‌های مقصد برای پرش، مثلاً "20000-50000" یا [443, "8000-9000"]. توسط intervalRemote / perConnRemote استفاده می‌شود.
remoteIPs[]string(keep original IP)<IP or CIDR> | …آدرس‌های مقصد برای پرش. CIDR یک آدرس تصادفی درون پیشوند برمی‌گزیند. توسط intervalRemote / perConnRemote استفاده می‌شود.

منبع: infra/conf/transport_finalmask.go:911-917 · ثابت‌شده در v26.9.9 (52a412d)

نحو پهنای باند ​

brutalUp و brutalDown توسط کمک‌کار در infra/conf/transport_method.go:696-735 تجزیه می‌شوند. پسوندهای پذیرفته‌شده:

پسوندضریب
(خالی), b, bps1
k, kb, kbps1024
m, mb, mbps1 048 576
g, gb, gbps1 073 741 824
t, tb, tbps1 099 511 627 776

بخش عددی به‌صورت float64 تجزیه می‌شود و نتیجه بر 8 تقسیم می‌گردد (بایت در ثانیه چیزی است که protobuf حمل می‌کند، اما نام واحد منبع bps است).

مثال‌ها ​

خروجی:

json
{
  "outbounds": [
    {
      "tag": "hy2-out",
      "protocol": "hysteria",
      "settings": {
        "version": 2,
        "address": "example.com",
        "port": 443
      },
      "streamSettings": {
        "network": "hysteria",
        "security": "tls",
        "tlsSettings": { "serverName": "example.com" },
        "hysteriaSettings": {
          "version": 2,
          "auth": "<password>",
          "udpIdleTimeout": 120
        },
        "finalmask": {
          "quicParams": {
            "brutalUp": "100mbps",
            "brutalDown": "300mbps"
          },
          "udp": [
            {
              "type": "udphop",
              "settings": {
                "mode": "intervalLocal,intervalRemote",
                "remotePorts": "20000-50000",
                "interval": "5-30"
              }
            }
          ]
        }
      }
    }
  ]
}

ورودی با دو کاربر و یک استتار از نوع HTTP-file:

json
{
  "inbounds": [
    {
      "tag": "hy2-in",
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "hysteria",
      "settings": {
        "version": 2,
        "clients": [
          { "auth": "<alice>", "email": "alice" },
          { "auth": "<bob>",   "email": "bob"   }
        ]
      },
      "streamSettings": {
        "network": "hysteria",
        "security": "tls",
        "tlsSettings": { "certificates": [{ "certificateFile": "/etc/ssl/cert.pem", "keyFile": "/etc/ssl/key.pem" }] },
        "hysteriaSettings": {
          "version": 2,
          "masquerade": {
            "type": "file",
            "dir": "/var/www"
          }
        }
      }
    }
  ]
}

نکات ​

  • یک اشتباه رایج: تنظیم auth فقط داخل settings (انگار که فیلد نام‌کاربری/گذرواژه است). Xray auth خروجی را از streamSettings.hysteriaSettings.auth می‌خواند. کاربران ورودی از settings.clients[].auth (به ازای کاربر) استفاده می‌کنند و auth سطح ترابرد را برای تطبیق نادیده می‌گیرند.
  • congestion, up, down و udphop فیلدهای hysteriaSettings نیستند. Xray کلیدهای ناشناخته را رد نمی‌کند، بنابراین مقادیری که آنجا قرار گیرند بی‌صدا نادیده گرفته می‌شوند. آن‌ها را با finalmask.quicParams.congestion / brutalUp / brutalDown و یک مدخل udphop در finalmask.udp تنظیم کنید.
  • Xray-core فقط Hysteria 2 را پیاده‌سازی می‌کند: version باید 2 باشد و هر مقدار دیگری خرابی قطعی است.
  • udpIdleTimeout < 2 یا > 600 خطای راه‌اندازی را تحریک می‌کند (infra/conf/transport_method.go:764-766).

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

  • sing-box از یک بلوک واحد و بسیار مسطح‌تر استفاده می‌کند — بدون تقسیم ترابرد. پهنای باند به‌صورت int ساده Mbps است (بدون رشتهٔ واحد) و استتار از یک شکل چندریختی (URL رشته‌ای یا شیء نوع‌دار) پشتیبانی می‌کند. به Hysteria2 — sing-box مراجعه کنید.
  • mihomo نیز تک‌بلوکی است، با پرش پورت که توسط ports (نحو بازه) به‌علاوهٔ hop-interval کنترل می‌شود. mihomo رشته‌های با پسوند واحد را برای up/down می‌پذیرد، مانند brutalUp/brutalDown در Xray. به Hysteria2 — mihomo مراجعه کنید.

منبع: infra/conf/hysteria.go:13-43 · v26.9.9 (52a412d)

Core Tutorial اثر Argsment