Hysteria2 — Xray-core
Xray-core از Hysteria v2 پشتیبانی میکند اما پیکربندی را در چند بلوک تقسیم میکند: settings سطح پروتکل (نسخه، آدرس/پورت، کاربران)، streamSettings.hysteriaSettings سطح ترابرد (احراز هویت، مهلت بیکاری UDP، استتار)، و streamSettings.finalmask برای کنترل ازدحام، پهنای باند و پرش پورت. settings و hysteriaSettings هر دو باید پر شوند تا خروجی قابل استفاده باشد.
خروجی — لایهٔ پروتکل
settings برای یک خروجی با "protocol": "hysteria":
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
version | int32 | (required) | 2 | باید دقیقاً 2 باشد. هر مقدار دیگری در زمان راهاندازی رد میشود (infra/conf/hysteria.go:19-21). |
address | *Address | (required) | <host> | نام میزبان یا IP سرور. |
port | uint16 | (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":
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
version | int32 | (required) | 2 | باید 2 باشد. |
users | []*HysteriaUserConfig | [] | [HysteriaUserConfig] | کاربران پذیرفتهشده. users و clients کلیدهای همارز با شکل یکسان هستند. |
clients | []*HysteriaUserConfig | [] | [HysteriaUserConfig] | کاربران پذیرفتهشده (کلید جایگزین؛ همان شکل users). |
منبع: infra/conf/hysteria.go:39-43 · ثابتشده در v26.9.9 (52a412d)
clients[]
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
auth | string | (required) | <string> | رشتهٔ احراز هویت. |
level | uint32 | 0 | <uint32> | سطح policy برای این کاربر. |
email | string | (unset) | <string> | برچسب در آمار/لاگ. |
منبع: infra/conf/hysteria.go:33-37 · ثابتشده در v26.9.9 (52a412d)
لایهٔ ترابرد — hysteriaSettings
زیر streamSettings.hysteriaSettings تنظیم میشود. شامل احراز هویت، مهلت بیکاری UDP و استتار ورودی است؛ کنترل ازدحام، پهنای باند و پرش پورت در finalmask قرار دارند (پایینتر).
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
version | int32 | (required) | 2 | نسخهٔ پروتکل Hysteria. باید با version در settings تطبیق داشته باشد. |
auth | string | (required on outbound) | <string> | رشتهٔ auth خروجی. در ورودی این فیلد به اعتبارسنج ارسال میشود اما auth به ازای کاربر در settings.clients[].auth قرار دارد. |
udpIdleTimeout | int64 | 60 | <2..600 seconds> | ثانیههای بیکاری جریان UDP پیش از بسته شدن جریان QUIC. باید بین 2 و 600 (شامل) باشد (infra/conf/transport_method.go:764-766). |
masquerade | Masquerade | (unset) | Masquerade | فقط ورودی: استتار پاسخ HTTP برای ترافیک احراز نشده. |
منبع: infra/conf/transport_method.go:752-757 · ثابتشده در v26.9.9 (52a412d)
masquerade
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
type | string | (required) | file | proxy | string | انتخاب میکند کدام زیربلوک اعمال شود. |
dir | string | (file only) | <dir path> | دایرکتوری ارائهشده وقتی type: file. |
url | string | (proxy only) | <URL> | URL بالادست وقتی type: proxy. |
rewriteHost | bool | false | true | false | بازنویسی سرآیند Host هنگام پراکسی (type: proxy). |
xForwarded | bool | false | true | false | افزودن سرآیندهای X-Forwarded-For / X-Forwarded-Host / X-Forwarded-Proto به درخواستهای پراکسیشده (type: proxy). |
insecure | bool | false | true | false | رد کردن راستیآزمایی TLS روی upstream وقتی type: proxy. |
content | string | (string only) | <text> | بدنهای که وقتی type: string بازگردانده میشود. |
headers | map[string]string | {} | {<header>: <value>} | سرآیندهای پاسخ اضافی وقتی type: string. |
statusCode | int32 | 200 | <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:
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
congestion | string | (empty) | brutal | force-brutal | bbr | reno | کنترل ازدحام برای Hysteria. خالی / brutal: وقتی brutalUp و نرخ دریافت اعلامشدهٔ همتا هر دو معلوم باشند، Brutal با کمینهٔ آن دو؛ وگرنه BBR. force-brutal: همیشه Brutal با brutalUp (به brutalUp نیاز دارد). bbr: همیشه BBR. reno: Reno ساده. |
bbrProfile | string | standard | conservative | standard | aggressive | نمایهٔ تنظیم BBR؛ هر زمان BBR انتخاب شود به کار میرود. مقادیر ناشناخته هنگام ساخت پیکربندی خطا میدهند. |
brutalUp | Bandwidth | (unset) | <bandwidth> | نرخ ارسال این سمت برای Brutal، بهصورت رشتهٔ دارای واحد (بخش «نحو پهنای باند» را ببینید). در صورت تنظیم باید دستکم 65536 بایت بر ثانیه (512 kbps) باشد. |
brutalDown | Bandwidth | (unset) | <bandwidth> | نرخ دریافتی که این سمت هنگام دستدهی Hysteria به همتا اعلام میکند؛ همتا نرخ ارسال Brutal خود را به آن محدود میکند. نحو و کمینهٔ آن مانند brutalUp است. |
brutalDisableLossCompensation | bool | false | true | 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 در هر پرش باز میکند. |
mode | string | (required) | intervalLocal | intervalRemote | perConnRemote | <comma-separated combination> | در هر پرش چه چیزی تغییر کند (بدون حساسیت به بزرگی و کوچکی حروف، جداشده با ویرگول). intervalLocal در هر بازه یک سوکت UDP محلی تازه (پورت مبدأ جدید) باز میکند؛ intervalRemote در هر بازه پورت / IP مقصد جدیدی از remotePorts / remoteIPs برمیگزیند؛ perConnRemote برای هر اتصال فقط یکبار مقصدی تصادفی برمیگزیند. مقدار خالی یا ناشناخته هنگام ساخت پیکربندی خطا میدهد. پاسخها فقط روی سوکتهایی خوانده میشوند که یک پرش intervalLocal باز کرده است، پس آن را بگنجانید (مثلاً "intervalLocal,intervalRemote"). |
interval | Int32Range | (required) | <seconds> | "<min>-<max>" | ثانیههای بین دو پرش؛ بازه هر بار یک مقدار تصادفی برمیگزیند. هر دو سر باید دستکم 5 باشند — وگرنه اتصال هنگام برقراری با invalid interval شکست میخورد. |
remotePorts | PortList | (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, bps | 1 |
k, kb, kbps | 1024 |
m, mb, mbps | 1 048 576 |
g, gb, gbps | 1 073 741 824 |
t, tb, tbps | 1 099 511 627 776 |
بخش عددی بهصورت float64 تجزیه میشود و نتیجه بر 8 تقسیم میگردد (بایت در ثانیه چیزی است که protobuf حمل میکند، اما نام واحد منبع bps است).
مثالها
خروجی:
{
"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:
{
"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)
