开启 3 天免费试用
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。


Hysteria2 服务端部署需要可达的 UDP 路径、有效的 TLS 身份和独立认证秘密。本教程固定原生二进制版本,保留独立管理通道,并分别验证应用 TCP 与 UDP 后再验收服务。
关键要点
- 应用 TCP 流量仍经由 Hysteria 的 UDP 传输。
- 证书证明服务器身份,不等于允许客户端使用服务。
- 收到网页响应不代表代理认证成功。
- 错误秘密必须被拒绝,重启和恢复后也要复查。
先读自建节点的责任与恢复规划。若目的是学习基于 QUIC 的部署,本流程提供边界明确的验收练习;若只是需要日常互联网出口,先比较VPS 自维护与托管服务,再接手证书与主机维护。
Hysteria2 协议概述介绍传输模型。客户端网络不能通过所需 UDP 时,应判断UDP 被阻断的影响,不能指望开放 TCP 修复。Shadowsocks Rust 部署则是密钥模型不同的独立实现选择。
**适用范围与证据:**专用 Ubuntu 24.04 LTS x86-64 服务器、独立 Linux 客户端、Hysteria v2.13.0、公网 IPv4,以及事先签发且仍有效的自有域名证书。作者未完成端到端部署实测。下文命令与预期条件来自官方资料,是读者操作说明,不是测量结果。其他架构须选择对应发行文件,不能运行下列二进制。[1][2]
确认新建 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。
继续前先通过认可的签发方式取得真实域名的有效证书,检查 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
保留独立 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 修复。
在独立且获授权的 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 为故意错误的值,再用副本启动。地址和证书不变时,新的代理请求必须被拒绝。有些错误在发起流量时才出现,本地端口能监听不等于认证成功。若请求仍通过,关闭入口,检查直连回退、另一配置档及服务端认证设置。
切回正确秘密配置。浏览器 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]
在获准维护窗口重启专用服务,重复正确与错误秘密、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,也仍监听 UDP。应排查获授权的 UDP 路径,不能改成无关的 TCP 规则。
证书向客户端证明服务器身份,独立密码才授权客户端访问。两项都必须通过,而且不能复用同一个秘密。
不要复制未经测量的速度。本基线省略带宽调优,取得自己获授权网络的相关证据后才添加官方支持参数。
成功的 HTTPS 请求覆盖不同应用路径。UDP 要用客户端支持的独立模式及受控响应端检查,并单独记录结果。
示例共享一个密码,轮换会影响全部使用者。单独撤销需要另外设计受支持的认证模型,设备标签不能实现隔离。
HTTP 响应与已认证代理请求是不同协议行为。必须实际验证正确凭据请求成功、错误凭据请求遭到拒绝。
本文未报告作者端到端实测。表格规定读者应取得的证据,实际服务器、客户端、网络、日期与结果要在授权环境记录。
来源:
Sources checked 2026 年 10 月 11 日。
延伸阅读:
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。