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。
一次连接的过程如下:
- 客户端向服务器的 UDP 端口发起 QUIC 连接。TLS 握手使用
h3(HTTP/3)协议名,和浏览器一样。 - 客户端发送一个带有你的密码的 HTTP/3 请求。
- 密码正确,服务器就接受这个客户端;密码错误,服务器就表现为一个普通的 Web 服务器,也就是它的伪装(masquerade)。
- 你设备上的每个 TCP 连接都会成为这条 QUIC 连接中的一个 QUIC 流。
- 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 服务器。