查看 2026-05-29 15 分钟 进阶 6 步

Hysteria2 配置教程:服务端搭建 + 客户端连接 2026实操

Hysteria2 基于 QUIC 协议,跨境延迟 200ms+ 时实测吞吐量比 VLESS TCP 方案高 2-4 倍。但大部分教程只给一条 bash 命令,不讲 obfs 混淆密码、自签证书的 TLS insecure、认证密码和端口跳跃这四个参数必须和服务端逐字对齐——本文用完整 YAML 服务端配置 + sing-box / NekoBox 客户端 JSON,拆开每个字段填错了会看到什么错误。

拿到一台 Debian/Ubuntu VPS 之后,SSH 登录,放行 UDP 端口、写一份 30 行的 config.yamlsystemctl 启动,三条命令 Hysteria2 就起来了。但如果 obfs 密码和 auth 密码填反、防火墙只放行了 TCP 没放行 UDP、客户端 TLS insecure 没开——这三个坑中任何一个都会让你在「连接超时」和「TLS 握手失败」之间反复横跳。

Hysteria2 当前稳定版本 v2.9.2,sing-box 需 ≥1.8.0,NekoBox 需 ≥3.26。

Hysteria2 比 VLESS / Trojan 快在哪?

Hysteria2 的底层是 QUIC(和 HTTP/3 同一套传输协议),跑在 UDP 上。传统代理协议——Shadowsocks、VMess、VLESS、Trojan——全部跑在 TCP 上。两者的吞吐量差异不是「快 20%」这种量级,在跨境高延迟链路上是倍数级别的差距。根因在于传输层处理丢包的方式完全不同:

TCP 协议(VLESS / Trojan / VMess)QUIC 协议(Hysteria2)
丢包恢复丢一个包,整条流暂停等重传多路复用,丢的包只影响它所在的那条子流
握手开销TCP + TLS 需 2-3 个 RTT0-RTT 恢复连接,已连过的节点几乎零延迟重建
拥塞控制内核级,改 BBR 需 root 权限用户态,Hysteria2 内置 Brutal 算法,按你设的带宽上限自适应
深度包检测 (DPI)TCP 头部特征固定,容易被识别Salamander 混淆把 QUIC 包字节流随机化,DPI 难以匹配

结论:延迟越高、丢包越多,QUIC 对 TCP 的优势越显著。 在跨境延迟 150ms+ 且偶发 2-5% 丢包的大陆用户网络中,Hysteria2 的吞吐量通常是同 VPS 上 VLESS Reality 的 2-4 倍。社区多个独立测试(可搜 GitHub Discussions / V2EX 晒图)的结果规律一致:延迟低于 80ms 时差距缩小到 30-50%;延迟突破 200ms 后 TCP 协议带宽急剧下降而 QUIC 基本维持。

代价只有一个:防火墙必须专门放行 UDP。 做惯了 TCP 协议部署的人经常在这一点踩坑——ufw allow 443 默认只放行 TCP,必须写成 ufw allow 443/udp

UDP 端口怎么放行,才不会两层防火墙拦一道?

Hysteria2 走 QUIC/UDP,TCP 端口放行对它完全无效。SSH 登录后第一件事不是装软件,是确认 UDP 能通。

# 安装防火墙工具
apt update && apt install ufw curl -y

# 放行 SSH(保住不掉线),再放行 UDP
ufw allow 22/tcp
ufw allow 443/udp

# 如果用端口跳跃,放行整个范围
ufw allow 20000:50000/udp

# 确认规则无误,再启用
ufw enable
ufw status verbose

云服务商安全组也要同步放行。 AWS Security Group / 阿里云安全组 / GCP 防火墙规则——网页控制台里添加入站规则时注意选 UDP 而不是 TCP。这是新手最高频的踩坑点:ufw 里写了 443/udp 但安全组规则里只有 443/tcp,UDP 包到不了 VPS。

验证 UDP 可达性,从本地电脑跑:

nc -zu <VPS_IP> 443

返回 succeeded 说明 UDP 包能到。超时就是安全组或 ufw 还有一层没放行。

自签证书没域名怎么生成?生成完客户端要改什么?

不用域名就走自签,有效期 10 年不过期。代价是客户端必须开 TLS insecure。

# 下载 Hysteria2 v2.9.2 二进制
curl -Lo /usr/local/bin/hysteria \
  https://github.com/apernet/hysteria/releases/download/app/v2.9.2/hysteria-linux-amd64
chmod +x /usr/local/bin/hysteria

# 验证版本
hysteria version
# 应输出: v2.9.2

# 创建配置目录
mkdir -p /etc/hysteria/

# 生成自签证书(不需要域名)
openssl req -newkey rsa:2048 -nodes \
  -keyout /etc/hysteria/server.key \
  -x509 -days 3650 \
  -out /etc/hysteria/server.crt \
  -subj "/CN=<你的_VPS_IP>"

config.yaml 每个字段填错了会看到什么错误?

下面这份配置覆盖了 Hysteria2 的六个核心参数。你只需要替换两个密码(各生成一个 16 位随机字符串,用 openssl rand -base64 12):

# /etc/hysteria/config.yaml
# Hysteria2 v2.9.2 服务端配置
# 自签证书 + salamander 混淆 + 端口跳跃 + 伪装

listen: :443
# 启用端口跳跃(二选一,不要同时写):
# listen: :20000-50000

tls:
  cert: /etc/hysteria/server.crt
  key: /etc/hysteria/server.key

auth:
  type: password
  password: "your-auth-password-here"   # ← 客户端 password 字段填这个

obfs:
  type: salamander
  salamander:
    password: "your-obfs-password-here"  # ← 客户端 obfs.password 填这个

masquerade:
  type: proxy
  proxy:
    url: https://news.ycombinator.com/
    rewriteHost: true

bandwidth:
  up: 100 mbps
  down: 500 mbps

字段逐行解释:

  • listen:443 监听单端口。:20000-50000 启用端口跳跃——客户端随机选一个端口连,分散流量。端口跳跃需要防火墙放行整个 UDP 范围 + iptables TPROXY 模块,不是所有 VPS 内核都支持,新手先跑通 :443 再折腾。
  • tls:证书文件路径。如果用 ACME(需要域名),删掉 tls: 块换成 acme: { domains: [...], email: "..." }tls:acme: 不能同时出现。
  • auth.password:客户端连接时验证身份的密码。客户端 password 字段对应这里。
  • obfs.salamander.password:Salamander 混淆算法把 QUIC 数据包打成看似随机的字节流。这个密码和 auth.password 是两个独立字段——填反了客户端连上也没数据。
  • masquerade:非 Hysteria2 请求(扫端口、探测)会被反向代理到 Hacker News。外人看到的是一篇 HN 帖子,不是代理服务。
  • bandwidth:每连接速率上限。up 是 VPS 发往客户端,down 是客户端发往 VPS——注意方向别填反。

systemd 起不来怎么排错?日志该看哪一行?

不看日志的排查都是玄学。启动后立刻看日志:

# 创建 systemd 服务文件
cat > /etc/systemd/system/hysteria-server.service << 'EOF'
[Unit]
Description=Hysteria2 Server
After=network.target

[Service]
Type=simple
User=nobody
ExecStart=/usr/local/bin/hysteria server -c /etc/hysteria/config.yaml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
EOF

# 启动
systemctl daemon-reload
systemctl enable hysteria-server
systemctl start hysteria-server

# 确认运行状态
systemctl status hysteria-server

启动后立刻看日志:

journalctl -u hysteria-server -f

正常启动会看到 server up and running。如果出现红色报错,三种最常见的情况:

# 1. 证书文件路径错误
tls: failed to load certificate: open /etc/hysteria/server.crt: no such file or directory
→ 检查 ls -la /etc/hysteria/server.*

# 2. YAML 缩进用了 Tab(YAML 只认空格)
yaml: found character that cannot start any token
→ 检查 config.yaml 缩进是否全是空格

# 3. 端口被占用
listen tcp :443: bind: address already in use
→ lsof -i :443 查看占用进程,停掉或换端口

确认 UDP 端口正在监听:

ss -uln | grep 443

输出里有 UNCONN 状态的 443 端口,服务端就绪。

sing-box 和 NekoBox 四个参数怎么和服务端对齐才不会连上没网?

服务端跑起来后,把 VPS IP(或域名)、端口、auth 密码、obfs 密码 四个核心参数搬进客户端。下面给 sing-box 和 NekoBox 两种方式——两边的配置要和服务端逐字对齐。

sing-box JSON 配置

outbounds 数组里添加,文件路径通常是 ~/sing-box/config.json~/.config/sing-box/config.json

{
  "type": "hysteria2",
  "tag": "hy2-node",
  "server": "1.2.3.4",
  "server_port": 443,
  "password": "your-auth-password-here",
  "obfs": {
    "type": "salamander",
    "password": "your-obfs-password-here"
  },
  "tls": {
    "enabled": true,
    "insecure": true,
    "server_name": "1.2.3.4"
  },
  "up_mbps": 100,
  "down_mbps": 500
}

关键对照关系:

服务端 config.yaml客户端 sing-box JSON填错了什么现象
auth.passwordpassword连上 5 秒后断开,服务端日志 authentication failed
obfs.salamander.passwordobfs.password连接显示已建立但无流量通过,curl 任何地址都 timeout
listen 端口server_portconnection refused 或完全无反应
自签证书 tls.certtls.insecure: trueTLS handshake failedcertificate signed by unknown authority
ACME 证书 acme.domainstls.insecure: false, server_name 填域名同上,证书不匹配

自签证书时 insecure: trueserver_name: "VPS_IP" 必须同时写对。用了 ACME 证书则 insecure: falseserver_name 填域名。

NekoBox 图形界面配置

NekoBox(Android v3.26+ / Windows v3.26+):新建配置 → 类型选 Hysteria2

地址: <VPS_IP>
端口: 443
密码: your-auth-password-here          ← auth.password

▼ TLS 设置
  ☑ 允许不安全连接 (Allow Insecure)    ← 自签证书必勾
  服务器名称: <VPS_IP>                ← 自签填 IP,ACME 填域名

▼ 混淆设置
  类型: Salamander
  密码: your-obfs-password-here        ← obfs.salamander.password

NekoBox 里两个密码输入框分属不同 Tab——「密码」是 auth.password,「混淆」Tab 里的「密码」是 obfs.password。很多人只填了第一个,第二个留空,结果连上了但 curl 不出任何数据。

v2rayNG 不支持手动添加 Hysteria2 节点

v2rayNG(Android)原生不支持手动新建 Hysteria2 节点,只能通过订阅导入。如果你的订阅链接里包含 hysteria2:// 协议的节点,订阅更新后会自动出现在列表里。

怎么确认客户端真的连上了

# 先在 VPS 上实时看日志
journalctl -u hysteria-server -f

# 然后客户端连接,日志应出现:
# [INFO] authenticated from <客户端IP>

如果日志一行新输出都没有,说明客户端的 UDP 包根本没到 VPS——回头查防火墙和安全组规则。

连接成功后,浏览器访问:

  • https://api.ipify.org → 返回 VPS 出口 IP,确认代理生效
  • https://fast.com → 测速,带宽应在 VPS 标注值的 70% 以上

连不上了先看哪里?日志报什么查什么?

不看日志的排查都是玄学。先在 VPS 上开一个实时日志窗口:

journalctl -u hysteria-server -f

然后对照下表——一次只改一个参数,改了立刻看日志确认生效:

客户端表现服务端日志最可能原因先查什么
连接超时,无任何反应完全无新日志UDP 端口没通ss -uln | grep <端口> 确认监听 → 检查安全组和 ufw 的 UDP 规则
connection refused完全无新日志服务端没启动或端口填错systemctl status hysteria-server → 确认状态和监听端口
TLS handshake failedtls: bad certificate自签证书 + 客户端没开 insecure客户端 TLS 设置:insecure 是否为 true,server_name 填的是否和证书 CN 一致
连上 5 秒后断开authentication failedauth 密码不对逐字符对比 config.yaml 的 auth.password 和客户端 password 字段
连上了但没网authenticated 正常但无数据obfs 密码不对——服务端用错误密钥解出乱码对比 obfs.salamander.password 和客户端 obfs 密码;确认和 auth 密码没搞混

同时改多个参数等于制造新问题。 最常见的组合错误是:obfs 密码和 auth 密码填反 + 自签证书没开 insecure。三个变量一起调,你永远不知道修好了哪一个。先关掉 obfs(在 config.yaml 里注释掉 obfs: 整个块),确认 auth 密码能过认证;认证通了再把 obfs 加回来,确认混淆密码能通。

端口跳跃:什么时候该用,什么时候不该用

端口跳跃是把 listen: :443 改成 listen: :20000-50000,服务端在 30001 个端口上同时监听。客户端每次连接随机挑一个端口。

用它换来的好处:单端口被 QoS 限速时,其他端口还能跑。流量不会集中在一个端口号上被统计。

用它付出的代价

  1. 防火墙要放行 30001 个 UDP 端口——阿里云安全组默认每安全组只支持 200 条规则,不够用
  2. 需要 iptables/nftables 的 TPROXY 模块——轻量 VPS 的定制内核可能没编译
  3. v2rayNG 和部分 iOS 客户端不支持端口跳跃,用了这些客户端的设备会被迫切回单端口

新手结论:512MB 内存的轻量 VPS,单端口 443 够用。 先跑通最简配置,稳定一周没问题再考虑加端口跳跃。不要一上来就追「最佳配置」——能稳定连通比参数好看重要十倍。

来源与时间

本文最后查看时间:2026-05-29。操作路径会随客户端版本变化,遇到按钮名称不一致时,优先按同义菜单和官方文档查看。

看更多教程:教程库 · 看客户端:客户端目录 · 看下载入口:下载中心