Hysteria 2(也常写作 Hysteria2)是一种运行在 QUIC 之上的代理协议,QUIC 是 HTTP/3 背后基于 UDP 的传输协议。它专为丢包网络上的速度而设计:不会一丢包就减速,而是可以按你设定的带宽发送。对不知道密码的人来说,Hysteria 2 服务器可以看起来就像一个普通的 HTTP/3 网站。

本文介绍它的工作原理、各个选项的作用,以及它的局限。

简要历史

原版 Hysteria 是 Apernet 开发者的一个开源项目,目标是在质量差、距离远的线路上实现快速代理。2023 年发布的 Hysteria 2 是一次重新设计,而不是简单的更新:它通过 HTTP/3 进行认证,因此服务器可以伪装成 Web 服务器;它也与原版协议不兼容。

除了官方的服务端和客户端,sing-box、Mihomo 和 Xray 也支持 Hysteria 2。

Hysteria 2 的工作原理

大多数代理协议,比如 Trojan 和 VLESS,都运行在 TCP 上。Hysteria 2 则运行在 QUIC 上,QUIC 跑在 UDP 之上,并内置了 TLS 1.3。

一次连接的过程如下:

  1. 客户端向服务器的 UDP 端口发起 QUIC 连接。TLS 握手使用 h3(HTTP/3)协议名,和浏览器一样。
  2. 客户端发送一个带有你的密码的 HTTP/3 请求。
  3. 密码正确,服务器就接受这个客户端;密码错误,服务器就表现为一个普通的 Web 服务器,也就是它的伪装(masquerade)。
  4. 你设备上的每个 TCP 连接都会成为这条 QUIC 连接中的一个 QUIC 流。
  5. UDP 数据包以 QUIC 数据报的形式在同一条连接中传输。

由于许多连接共享同一条 QUIC 连接,新建一个连接不需要重新握手。

Brutal:按设定速率发送

TCP 和大多数 QUIC 实现会把丢包视为拥塞的信号,于是减速。在又长又嘈杂的线路上,这会让速度远低于线路实际能承载的水平。

Hysteria 的 Brutal 拥塞控制采用不同的做法。客户端告诉服务器自己能以多快的速度接收,服务器即使遇到丢包也按这个速率发送,并重传丢失的部分。这就是 Hysteria 2 能在 TCP 类协议吃力的地方保持速度的原因。

代价是:这个速率必须接近你真实的带宽。设得太高,丢的包会比多发的还多,连接反而变慢。Brutal 也不会为网络中的其他流量让路。没有设置带宽时,Hysteria 2 会改用 BBR,一种会自行调整速率的标准拥塞控制算法。

Salamander:混淆

普通的 Hysteria 2 流量就是 QUIC,而 QUIC 很容易识别。Salamander 用一个共享密码打乱每个数据包,让连接看起来不再像 QUIC。有些服务器提供 Gecko,它还会拆分并填充最初的几个数据包,让它们的大小不会暴露连接。

这里有一个取舍:开启混淆后,服务器说的就不再是普通 QUIC,因此无法同时伪装成一个普通的 HTTP/3 网站。两种伪装只能二选一。

端口跳跃

有些网络会在一段时间后对单个 UDP 端口限速或封锁。使用端口跳跃时,服务器监听一段 UDP 端口范围,如 20000-30000,客户端每隔一段时间换到另一个端口,默认每 30 秒一次。

伪装网站

服务器在不认识客户端时,可以提供一个网站、反向代理一个网站,或者返回一个简单页面。这样一来,探测它就像访问一个普通网站。伪装是服务器端的设置,你的设备上不需要做任何改动。

证书与证书固定

Hysteria 2 始终使用 TLS,所以服务器需要证书。许多服务器使用自签名证书,而不是为域名申请公开证书。这时你的客户端有两个选择:

  • 固定证书(pinSHA256):只信任这一张证书,不信任其他任何证书。这是安全的做法。
  • 跳过证书验证(insecure=1):信任任何证书。这样一来,你与服务器之间的任何人都可能读取你的流量。请避免这样做。

优点和缺点

优点:

  • 在丢包线路上保持速度,得益于 Brutal 和 QUIC。
  • 连接快。 许多连接共享同一条 QUIC 连接。
  • 原生承载 UDP,使用 QUIC 数据报。
  • 伪装方式灵活。 伪装网站、Salamander 或 Gecko 混淆,以及端口跳跃。
  • 可以安全地使用自签名证书,方法是证书固定。

缺点:

  • 依赖 UDP。 有些网络,比如办公室 Wi-Fi 或部分移动运营商,会封锁或限速 UDP。这时 Hysteria 2 会很慢,甚至完全连不上。
  • Brutal 需要合适的数值。 带宽设错会让情况更糟,而且 Brutal 对其他流量并不公平。
  • 不能套 CDN。 你需要直连服务器。
  • 更难检测,但不是无法检测。 非常规端口上的 QUIC,或者看起来不像任何已知协议的流量,仍然可能引人注意。

Hysteria 2 与其他协议对比

Hysteria 2 VLESS + REALITY Trojan Shadowsocks
运行于 UDP(QUIC) TCP TCP TCP 和 UDP
加密 QUIC 中的 TLS 1.3 REALITY(TLS 1.3) TLS 自有加密
适合丢包线路 是 一般 一般 一般
UDP 被封锁时能否使用 否 能 能 仅 TCP
需要证书 是,自签名也可以 否 是 否
面对探测时的应答 伪装网站(如有配置) 所借用的网站 回落网站(如有配置) 断开连接

想把所有协议放在一起比较,请看代理协议对比。如果你刚接触 Shadowsocks,请阅读 Shadowsocks 是什么?

Hysteria 2 链接长什么样

服务器通常以 hysteria2:// 链接分享,或者使用 hy2://,这是同一种链接的简写:

hysteria2://secret@hy2.example.com:443/?sni=hy2.example.com#Basic
  • secret 是密码。
  • hy2.example.com:443 是服务器和 UDP 端口。
  • sni 是 TLS 服务器名称。
  • #Basic 是这台服务器在 App 中显示的名称。

选项以参数的形式添加。使用 Salamander 混淆、密码为 hidden:

hysteria2://secret@hy2.example.com:443/?obfs=salamander&obfs-password=hidden#Salamander

在 20000 到 30000 之间端口跳跃,写在端口部分:

hysteria2://secret@hy2.example.com:443,20000-30000/?sni=hy2.example.com#Hopping

自签名证书,通过 SHA-256 固定:

hysteria2://secret@203.0.113.7:443/?sni=hy2.example.com&pinSHA256=abababababababababababababababababababababababababababababababab#Pinned

所有参数都列在 Hysteria 2 参考中。

在 iPhone 上使用 Hysteria 2

Potatso 是一款适用于 iPhone 和 iPad 的免费代理客户端,支持 Hysteria 2 的 Salamander 和 Gecko 混淆、端口跳跃、下载带宽和证书固定,并已在官方服务端、sing-box、Mihomo 和 Xray 上测试。按照 iPhone 使用 Hysteria2 教程导入你的链接并连接。

常见问题

Hysteria 2 是用来做什么的?
Hysteria 2 是一种代理协议,用于在会丢包的网络上保持良好的速度,比如跨境长距离线路或拥挤的移动网络。它运行在 QUIC(HTTP/3 背后基于 UDP 的协议)之上,可以同时承载 TCP 和 UDP 流量。
Hysteria 2 比 VLESS 或 Trojan 快吗?
在丢包严重或距离较远的线路上可能更快,因为它在丢包时仍按设定的速率发送。在干净的网络上差别往往不大;在限速或封锁 UDP 的网络上,它可能更慢,甚至完全连不上。
Hysteria 2 里的 Salamander 是什么?
Salamander 是 Hysteria 2 的可选混淆。它用一个共享密码打乱每个数据包,让连接看起来不再像 QUIC。客户端和服务器必须使用相同的混淆密码。
Hysteria 2 需要域名和证书吗?
需要 TLS 证书,但可以是自签名证书。使用自签名证书时,请在客户端用它的 SHA-256 固定证书,而不是关闭证书验证。
Hysteria 2 和 Hysteria 是一回事吗?
不是。Hysteria 2 是对原版 Hysteria 协议的重新设计,与它不兼容。Hysteria 2 客户端需要连接 Hysteria 2 服务器。

其他语言版本: English · 繁體中文 · 日本語 · Русский