Hysteria2 服务端部署:UDP、证书、认证与恢复验证

Hysteria2 服务端部署:UDP、证书、认证与恢复验证

Ryan Foster
2026年10月11日· 7 分钟阅读

Hysteria2 服务端部署需要可达的 UDP 路径、有效的 TLS 身份和独立认证秘密。本教程固定原生二进制版本,保留独立管理通道,并分别验证应用 TCP 与 UDP 后再验收服务。

关键要点

  • 应用 TCP 流量仍经由 Hysteria 的 UDP 传输。
  • 证书证明服务器身份,不等于允许客户端使用服务。
  • 收到网页响应不代表代理认证成功。
  • 错误秘密必须被拒绝,重启和恢复后也要复查。

何时适合进行 Hysteria2 服务端部署?

先读自建节点的责任与恢复规划。若目的是学习基于 QUIC 的部署,本流程提供边界明确的验收练习;若只是需要日常互联网出口,先比较VPS 自维护与托管服务,再接手证书与主机维护。

Hysteria2 协议概述介绍传输模型。客户端网络不能通过所需 UDP 时,应判断UDP 被阻断的影响,不能指望开放 TCP 修复。Shadowsocks Rust 部署则是密钥模型不同的独立实现选择。

**适用范围与证据:**专用 Ubuntu 24.04 LTS x86-64 服务器、独立 Linux 客户端、Hysteria v2.13.0、公网 IPv4,以及事先签发且仍有效的自有域名证书。作者未完成端到端部署实测。下文命令与预期条件来自官方资料,是读者操作说明,不是测量结果。其他架构须选择对应发行文件,不能运行下列二进制。[1][2]

步骤 1:保留管理通道并安装可信二进制

确认新建 SSH 连接及云平台控制台不依赖待建代理。私下记录端口、路由、DNS、防火墙规则归属、服务、证书路径及续期任务。预留服务端 UDP 8443、客户端 TCP 1080 和 UDP 19001。遇到冲突,或已有 hysteria-ops 用户、目录、服务单元就停止,不接管其他安装。

示例采用高端口 8443,专用服务用户不需要 root 或低端口能力。缺少 curl、ca-certificates、Python 3 时,从 Ubuntu 可信软件包安装。只下载选定官方发行文件,执行前核对该发行提供的完整性依据;无法确认项目归属或验证失败就停止。版本字符串不能单独证明来源。

umask 077
curl --fail --show-error --location \
  https://github.com/HyNetworks/hysteria/releases/download/app%2Fv2.13.0/hysteria-linux-amd64 \
  -o hysteria-v2.13.0
chmod 700 hysteria-v2.13.0
./hysteria-v2.13.0 version
sudo install -m 755 hysteria-v2.13.0 /usr/local/bin/hysteria-ops
sudo useradd --system --home /nonexistent --shell /usr/sbin/nologin hysteria-ops
sudo install -d -o root -g hysteria-ops -m 750 /etc/hysteria-ops

版本应对应 v2.13.0。保留可信二进制的受保护副本供恢复使用。下载失败不应改用未经审查的远程安装脚本,也不能悄悄换成 latest。

步骤 2:准备 Hysteria2 证书与认证

继续前先通过认可的签发方式取得真实域名的有效证书,检查 SAN、有效期、证书链和私钥匹配。客户端可能选中的 A/AAAA 必须指向预期可达路径。本例监听 IPv4,不要留下误导性的 AAAA,再把路径错误误判成密码问题。

本基线要求使用 ECDSA 或 RSA 服务器证书。v2.13.0 客户端默认模拟 Chrome 握手,声明的签名算法不包含 Ed25519,因此有效的 Ed25519 证书也可能导致握手失败。应取得兼容证书,不能关闭证书验证来绕过。[6]

将完整证书链及私钥放到以下路径,用 root 编辑器建立 /etc/hysteria-ops/config.yaml。把秘密替换为独立随机值并存入密码管理器,不放进命令参数、公开 URI 或日志。本例使用手动管理的 TLS 文件及密码认证,不同时配置 ACME 与静态证书。[3][4]

listen: 0.0.0.0:8443
tls:
  cert: /etc/hysteria-ops/fullchain.pem
  key: /etc/hysteria-ops/privkey.pem
auth:
  type: password
  password: "REPLACE_WITH_DISTINCT_RANDOM_SECRET"
disableUDP: false

TLS 私钥与认证秘密用途不同,不能拿管理员密码或证书私钥当客户端秘密。不要靠未说明的拥塞、混淆或带宽参数解决基础启动错误。本基线省略带宽调优,不承诺未经测量的速度。

将以下本地服务单元保存为 /etc/systemd/system/hysteria-ops.service。这是本文明确创建的服务,不代表上游安装器的服务名称。

[Unit]
Description=Dedicated Hysteria2 reader deployment
After=network-online.target
Wants=network-online.target

[Service]
User=hysteria-ops
Group=hysteria-ops
ExecStart=/usr/local/bin/hysteria-ops server -c /etc/hysteria-ops/config.yaml
Restart=no
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict

[Install]
WantedBy=multi-user.target

步骤 3:配置 Hysteria2 UDP 防火墙策略

保留独立 SSH 规则。通过实际管理云端及主机防火墙的入口,起初只允许获授权测试客户端的来源访问 UDP 8443。不清空规则表、不关闭防火墙。存在 NAT 时,获授权映射必须是 UDP 并指向本机;TCP 8443 不能代替此监听端口。[3]

sudo chmod 640 /etc/hysteria-ops/config.yaml /etc/hysteria-ops/privkey.pem /etc/hysteria-ops/fullchain.pem
sudo chown root:hysteria-ops /etc/hysteria-ops/config.yaml /etc/hysteria-ops/privkey.pem /etc/hysteria-ops/fullchain.pem
sudo systemctl daemon-reload
sudo systemctl start hysteria-ops
sudo systemctl status hysteria-ops --no-pager
sudo ss -lunp

预期选定服务持续运行,IPv4 UDP 8443 有监听。这只能证明启动和绑定。若退出,读 journalctl -u hysteria-ops,分开排查 YAML、文件权限、证书及地址冲突,修正期间保持入口关闭。客户端忽略证书不能算 TLS 修复。

步骤 4:连接正确客户端并拒绝错误秘密

在独立且获授权的 Linux 客户端,按前述可信流程取得同版本对应二进制。在私有目录建立 client.yaml,替换两个域名示例及秘密。UDP 练习需要你控制且获授权的回显响应端 udp-check.example.net:9001,并能从服务器访问。该示例域名不是公共测试服务;没有响应端就把 UDP 验收保留为未验证。[5][6]

server: hy.example.com:8443
auth: "REPLACE_WITH_DISTINCT_RANDOM_SECRET"
tls:
  sni: hy.example.com
  insecure: false
socks5:
  listen: 127.0.0.1:1080
udpForwarding:
  - listen: 127.0.0.1:19001
    remote: udp-check.example.net:9001

两个本地监听都必须只绑定回环。UDP 转发项把报文经 Hysteria 送到受控响应端,不修改全系统路由,也不开放局域网通用代理。在独立终端启动客户端,输出保持私密。

chmod 600 client.yaml
./hysteria-v2.13.0 client -c client.yaml

测试浏览器显式使用 SOCKS5 127.0.0.1:1080,支持时启用代理端域名解析。然后检查可见出口 IP,与服务器已知出口比对。要确认浏览器实际请求,不能只看“已连接”提示。

停止该进程,私下复制配置,只改 auth 为故意错误的值,再用副本启动。地址和证书不变时,新的代理请求必须被拒绝。有些错误在发起流量时才出现,本地端口能监听不等于认证成功。若请求仍通过,关闭入口,检查直连回退、另一配置档及服务端认证设置。

步骤 5:分别验证 TCP、UDP、DNS 与断连

切回正确秘密配置。浏览器 HTTPS 请求是应用 TCP 检查,虽然 Hysteria 底层用 UDP。以下读者命令另行通过本地转发发送一个 UDP 报文,预期由自有响应端返回相同内容;本文不提供假定的实际输出。

python3 - <<'CHECK'
import socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
    sock.settimeout(3)
    sock.sendto(b"reader-check", ("127.0.0.1", 19001))
    data, _ = sock.recvfrom(1024)
    assert data == b"reader-check", "Unexpected UDP reply"
CHECK
层次读者应取得的证据失败时处理
应用 TCP新的代理 HTTPS 请求及预期出口分开查浏览器选择、认证、服务器出口和目标
应用 UDP回显内容与发送报文相同查本地转发、disableUDP、响应端与回程
DNS解析路径符合浏览器或应用策略分清本地与远端解析,不凭 IP 推断
IPv6每条适用路径均明确纳入或排除IPv4 验收不等于整台设备覆盖
断连显式代理按配置报错或回退所需失败策略未独立确认前停止敏感操作

普通 TCP 端口检查、网页或 HTTP3 响应不能证明 Hysteria 客户端认证成功。代理拒绝访问时,错误网页仍可能响应。错误秘密检查必须独立于可达性及应用 TCP/UDP 检查。本地 SOCKS 不提供整机隧道或断网保护。[3][5]

步骤 6:续期、撤销、恢复与停用

在获准维护窗口重启专用服务,重复正确与错误秘密、TCP 与 UDP 检查。验收后,如需要自动启动,才运行 systemctl enable hysteria-ops;先确认主机重启后配置及证书仍可读。

证书续期时,由现有签发维护方原子替换完整匹配的证书链与私钥,重新应用 root:hysteria-ops 及 640 权限,在获准窗口重启。用正常校验证书的客户端确认新身份。证书过期要修证书,不能设 insecure: true;部分更新失败应回退到上一组有效文件,或关闭服务。

需要立即撤销时,先关闭此监听入口,更换独立随机共享密码,再重启以终止现有会话,只把新值发给保留客户端。本例会撤销全部使用旧密码的客户端,不能按设备逐一撤销。再次重启后,确认保留客户端可用、旧秘密被拒绝。

停止服务后,将配置及 TLS 目录、固定二进制、服务单元和续期、防火墙记录备份至加密且受限的异机位置。较新的轮换和撤销清单另存。恢复应在同版本隔离替代机、入口关闭时进行:还原属主、权限及有效证书对,启动前先应用清单中的当前秘密。开放前重复正向、反向和重启检查,不能因为旧密码在归档里就重新启用。

以下生命周期命令分别用于验收重启、查看日志、退役停止及禁用;不要把整块连续粘贴当作可用性测试。

sudo systemctl restart hysteria-ops
sudo journalctl -u hysteria-ops --since "10 minutes ago" --no-pager
sudo systemctl stop hysteria-ops
sudo systemctl disable hysteria-ops

停用时只关闭本次部署的 UDP 规则,停止客户端,删除浏览器代理设置及本地转发监听并撤销秘密。决定保留期限后,只删除本文创建的服务单元、二进制、文件和用户,再重新加载 systemd。另行检查续期任务、DNS 及云资源,并确认新的 SSH 连接和原有服务正常。删软件不会停止云计费;恢复未确认就保持入口关闭并停止后续变更。

总结

  • 服务器身份、客户端认证与应用传输要分开验收。
  • 证书续期与密码轮换分别管理,重启后均重新验证。
  • 旧秘密被拒绝、保留客户端正常后,恢复才算完成。

常见问题

开放 TCP 8443 能解决 Hysteria UDP 被封吗?

不能。本例即使代理应用 TCP,也仍监听 UDP。应排查获授权的 UDP 路径,不能改成无关的 TCP 规则。

有效证书是否允许客户端接入?

证书向客户端证明服务器身份,独立密码才授权客户端访问。两项都必须通过,而且不能复用同一个秘密。

应该复制其他教程的大带宽值吗?

不要复制未经测量的速度。本基线省略带宽调优,取得自己获授权网络的相关证据后才添加官方支持参数。

浏览器验证能代替应用 UDP 检查吗?

成功的 HTTPS 请求覆盖不同应用路径。UDP 要用客户端支持的独立模式及受控响应端检查,并单独记录结果。

此密码配置能只撤销一台客户端吗?

示例共享一个密码,轮换会影响全部使用者。单独撤销需要另外设计受支持的认证模型,设备标签不能实现隔离。

为什么网页有响应但代理仍失败?

HTTP 响应与已认证代理请求是不同协议行为。必须实际验证正确凭据请求成功、错误凭据请求遭到拒绝。

作者是否执行过这些检查?

本文未报告作者端到端实测。表格规定读者应取得的证据,实际服务器、客户端、网络、日期与结果要在授权环境记录。

来源:

  1. Hysteria v2.13.0 — https://github.com/HyNetworks/hysteria/releases/tag/app/v2.13.0
  2. Hysteria 2 — Installation — https://v2.hysteria.network/docs/getting-started/Installation/
  3. Hysteria 2 — Server — https://v2.hysteria.network/docs/getting-started/Server/
  4. Hysteria 2 — Full Server Config — https://v2.hysteria.network/docs/advanced/Full-Server-Config/
  5. Hysteria 2 — Client — https://v2.hysteria.network/docs/getting-started/Client/
  6. Hysteria 2 — Full Client Config — https://v2.hysteria.network/docs/advanced/Full-Client-Config/

Sources checked 2026 年 10 月 11 日。


延伸阅读:

开启 3 天免费试用

注册即可免费体验全部高级功能。

*仅限新用户;每位用户只能获得一次试用。

Hysteria2 服务端部署:UDP、证书、认证与恢复验证 | AethoVPN