{{H1}}
Deployment & Operations Guide · Rocky Linux 9.5
Hysteria 2 主力节点与 Xray(VLESS + WebSocket / gRPC + Cloudflare CDN)备用节点的部署、运维、凭证轮换与故障排查记录。本版本已移除全部密钥、UUID、Token、真实域名与完整 IP,保留架构、流程与命令。
0脱敏说明与占位符对照
所有可用于访问节点的信息(密码、UUID、传输路径、API Token、真实域名、完整 IP)均已替换为占位符。文档的架构说明、操作步骤、命令与排查思路完整保留,可用于交流、存档或交给 AI 阅读。 需要真实值时,在本机执行 python build.py --private,生成的 dist-private/ 内即为注入真值的完整版。
占位符对照表
| 文档中的占位符 | 对应真实项 | 出现位置 |
|---|---|---|
| 主域名 | 真实主域名 | 全文 |
| 代理服务器 IP | 服务器 IPv4 | 一、二、十一、九 |
| 代理服务器 IPv6 | 服务器 IPv6 | 一、二 |
| HY2 密码 | Hysteria 2 认证密码 | 3.1、十、十二、十三 |
| HY2 混淆密码 | salamander 混淆密码 | 3.1、十、十二、十三 |
| VLESS UUID | Xray 客户端 UUID | 3.2、3.3、十二 |
| WS 路径 | WebSocket path | 3.2、十二、十三 |
| gRPC serviceName | gRPC 服务名 | 3.3、十二、十三 |
| Cloudflare API Token | acme.sh 用 DNS Edit Token | 六、七 |
| 维护人邮箱 | 维护人邮箱 | 文档头 |
一服务器基本信息
| 项目 | 值 |
|---|---|
| IPv4 | 代理服务器 IP |
| IPv6 | 代理服务器 IPv6 |
| 操作系统 | Rocky Linux 9.5 x86_64 |
| 面板 | 宝塔面板(BT Panel) |
| 主域名 | 主域名(托管于 Cloudflare) |
二DNS 记录配置(Cloudflare)
| 子域名 | 类型 | 值 | 代理状态 | 用途 |
|---|---|---|---|---|
hy2.<主域名> | A | 代理服务器 IP | 灰色(仅 DNS) | Hysteria 2 IPv4 |
hy2.<主域名> | AAAA | 代理服务器 IPv6 | 灰色(仅 DNS) | Hysteria 2 IPv6 |
ws.<主域名> | A | 代理服务器 IP | 橙色(已代理) | VLESS + WS / gRPC CDN |
Cloudflare 设置
SSL/TLS 模式
完全(严格)
gRPC
已开启
WebSockets
已开启
IPv6 兼容性
已开启
三节点连接信息
三个节点共用一台服务器:Hysteria 2 走 UDP 直连,两个 VLESS 节点走 Cloudflare CDN。
3.1 Hysteria 2 主力节点
此节点因服务器 IP 被运营商列入 UDP 黑名单,手机流量下无法使用。WiFi 宽带环境下可正常使用。商业节点可通是因其使用了未被标记的 IP 或中转,非协议问题。
| 项目 | 值 |
|---|---|
| 协议 | Hysteria 2 |
| 服务器 | hy2.<主域名> |
| 端口 | 8443(UDP) |
| 密码 | HY2 密码 |
| 混淆类型 | salamander |
| 混淆密码 | HY2 混淆密码 |
| SNI | hy2.<主域名> |
| TLS 证书 | Let's Encrypt(acme.sh 自动续签) |
连接链接格式
hysteria2://<URL编码后的密码>@hy2.<主域名>:8443?sni=hy2.<主域名>&obfs=salamander&obfs-password=<URL编码后的混淆密码>#HY2-主力3.2 VLESS + WebSocket + CDN 备用节点 1
走 Cloudflare CDN,源站 IP 不直接暴露。
| 项目 | 值 |
|---|---|
| 协议 | VLESS |
| 服务器 | ws.<主域名> |
| 端口 | 443(TCP) |
| UUID | VLESS UUID |
| 传输方式 | WebSocket |
| 路径 | WS 路径 |
| TLS | 开启 |
| SNI | ws.<主域名> |
连接链接格式
vless://<UUID>@ws.<主域名>:443?type=ws&path=<URL编码后的WS路径>&security=tls&sni=ws.<主域名>#VLESS-WS-CDN3.3 VLESS + gRPC + CDN 备用节点 2 · 推荐日常
推荐日常优先使用。
| 项目 | 值 |
|---|---|
| 协议 | VLESS |
| 服务器 | ws.<主域名> |
| 端口 | 443(TCP) |
| UUID | VLESS UUID |
| 传输方式 | gRPC |
| serviceName | gRPC serviceName |
| TLS | 开启 |
| SNI | ws.<主域名> |
连接链接格式
vless://<UUID>@ws.<主域名>:443?type=grpc&serviceName=<gRPC服务名>&security=tls&sni=ws.<主域名>#VLESS-gRPC-CDN四节点对比与使用策略
| 节点 | 速度 | 稳定性 | 手机流量 | WiFi | 抗封锁 |
|---|---|---|---|---|---|
| Hysteria 2 | ★★★★★ | ★★★ | ✗ | ✓ | ★★★ |
| VLESS + gRPC + CDN | ★★★★ | ★★★★★ | ✓ | ✓ | ★★★★★ |
| VLESS + WS + CDN | ★★★ | ★★★★★ | ✓ | ✓ | ★★★★★ |
推荐策略
手机流量 · 日常
优先 VLESS + gRPC + CDN
手机流量 · 备用
切换 VLESS + WS + CDN
WiFi 环境
优先 Hysteria 2(速度最快)
八推荐客户端
| 平台 | 客户端 | 支持协议 |
|---|---|---|
| Windows | v2rayN | VLESS + WS / gRPC |
| Android | v2rayNG / Hiddify / sing-box | VLESS + WS / gRPC + Hysteria 2 |
| iOS | Hiddify / Shadowrocket | 全部支持 |
| macOS | Hiddify / V2RayXS | 全部支持 |
Hysteria 2 需要客户端版本较新(v2rayNG 1.8.x+,Hiddify 最新版)。
十端口跳跃配置(Hysteria 2)
服务器端 nftables 规则
将 20000-40000 UDP 全部重定向到 Hysteria 2 主端口 8443:
- 规则文件:
/etc/nftables-hy2-porthopping.conf - 开机服务:
hy2-porthopping.service(已 enable)
# 查看规则是否生效
nft list ruleset | grep "20000"
# 重新加载规则
systemctl restart hy2-porthopping客户端配置(手动填写)
| 字段 | 值 |
|---|---|
| 服务器地址 | hy2.<主域名> |
| 服务器端口 | 8443 |
| 跳跃端口 | 20000-40000 |
| 密码 | HY2 密码 |
| 混淆密码 | HY2 混淆密码 |
| SNI | hy2.<主域名> |
端口跳跃链接格式(8443,20000-40000)部分客户端不支持,建议手动填写字段。
十二sing-box 配置文件
适用于 sing-box 客户端(Android / iOS / macOS / Windows),保存为 config.json 导入。脱敏版需自行填入真实密码 / UUID / 路径 / 域名后方可使用。
{
"log": {
"level": "info"
},
"outbounds": [
{
"type": "hysteria2",
"tag": "HY2-主力(WiFi)",
"server": "hy2.<主域名>",
"server_port": 8443,
"password": "<HY2 密码>",
"obfs": {
"type": "salamander",
"password": "<HY2 混淆密码>"
},
"tls": {
"enabled": true,
"server_name": "hy2.<主域名>"
}
},
{
"type": "vless",
"tag": "VLESS-gRPC-CDN",
"server": "ws.<主域名>",
"server_port": 443,
"uuid": "<VLESS UUID>",
"transport": {
"type": "grpc",
"service_name": "<gRPC serviceName>"
},
"tls": {
"enabled": true,
"server_name": "ws.<主域名>"
}
},
{
"type": "vless",
"tag": "VLESS-WS-CDN",
"server": "ws.<主域名>",
"server_port": 443,
"uuid": "<VLESS UUID>",
"transport": {
"type": "ws",
"path": "<WS 路径>"
},
"tls": {
"enabled": true,
"server_name": "ws.<主域名>"
}
},
{
"type": "direct",
"tag": "direct"
},
{
"type": "block",
"tag": "block"
}
],
"route": {
"rules": [
{
"geoip": "cn",
"outbound": "direct"
},
{
"geosite": "cn",
"outbound": "direct"
}
],
"final": "VLESS-gRPC-CDN"
}
}route.final 默认走 gRPC 节点,国内流量直连。如需切换主节点,修改 final 值为对应 tag 名称。
五服务器端配置文件路径
Hysteria 2
| 项目 | 路径 | |||
|---|---|---|---|---|
| 配置文件 | /etc/hysteria/config.yaml | |||
| 证书目录 | /etc/hysteria/certs/ | |||
| 服务管理 | `systemctl [start\ | stop\ | restart\ | status] hysteria-server` |
Xray
| 项目 | 路径 | |||
|---|---|---|---|---|
| 配置文件 | /usr/local/etc/xray/config.json | |||
| 日志目录 | /var/log/xray/ | |||
| 服务管理 | `systemctl [start\ | stop\ | restart\ | status] xray` |
| 本地监听 | 127.0.0.1:10000(WS)、127.0.0.1:10001(gRPC) |
Nginx(宝塔管理)
| 项目 | 路径 |
|---|---|
| vhost 配置 | /www/server/panel/vhost/nginx/ws.<主域名>.conf |
| 证书路径 | /www/server/panel/vhost/cert/ws.<主域名>/ |
| 服务管理 | systemctl reload nginx |
SSL 证书(acme.sh 自动续签)
| 项目 | 路径 |
|---|---|
hy2 子域证书 | /root/.acme.sh/hy2.<主域名>_ecc/ |
ws 子域证书 | /root/.acme.sh/ws.<主域名>_ecc/ |
| 续签方式 | Cloudflare DNS API 自动(无需手动操作) |
六Cloudflare API 凭证
| 项目 | 值 |
|---|---|
| API Token | Cloudflare API Token |
| 权限 | Zone → DNS → Edit(仅限本域名) |
| 用途 | acme.sh DNS 验证自动续签证书 |
Token 须妥善保管,泄露后立即在 Cloudflare 撤销并重新生成;权限务必限定到单一 Zone 的 DNS Edit,不要用 Global API Key。
七常用维护命令
# 查看所有代理服务状态
systemctl status hysteria-server xray nginx
# 查看 Hysteria 2 实时日志
journalctl -u hysteria-server -f --no-pager
# 查看 Xray 实时日志
journalctl -u xray -f --no-pager
# 手动续签证书(通常自动,无需手动)
export CF_Token="<Cloudflare API Token>"
~/.acme.sh/acme.sh --renew -d hy2.<主域名> --server letsencrypt
~/.acme.sh/acme.sh --renew -d ws.<主域名> --server letsencrypt
# 查看端口监听状态
ss -ulnp | grep '8443' # Hysteria 2 UDP
ss -tlnp | grep -E '10000|10001' # Xray 本地端口
ss -tlnp | grep ':443' # Nginx HTTPS十三更换凭证(废弃旧订阅 / 防止他人使用)
配置文件泄露、文档外传、怀疑他人使用你的节点时执行。执行后所有旧连接链接 / 配置立即失效。
- 生成新 UUID(用于替换 VLESS UUID)
xray uuid # 或 cat /proc/sys/kernel/random/uuid记下输出的新 UUID,格式如
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。 - 修改 Xray 配置(替换 UUID 和路径)
nano /usr/local/etc/xray/config.json在文件中找到并替换以下内容:
旧值(需替换) 替换为 旧 UUID 步骤 1 生成的新 UUID(两个 inbound 建议用同一个) 旧 WS 路径 新 WS 路径,如 /ws_新随机字符串旧 gRPC serviceName 新 gRPC 名称,如 grpc_新随机字符串💡路径建议用随机字符串,例如
openssl rand -hex 8生成 8 位随机串。⚠️WS 和 gRPC 建议使用同一个 UUID,否则 gen-links 脚本需要分别读取,客户端配置也容易出错。
修改完毕后重启 Xray:
systemctl restart xray systemctl status xray - 同步更新 Nginx 路径⛔
Xray 里改了 WS 路径和 gRPC serviceName 后,Nginx 配置必须同步修改,否则新路径请求无法路由到 Xray。
nano /www/server/panel/vhost/nginx/ws.<主域名>.conf在 nano 中按
Ctrl+W搜索旧路径快速定位,将:location /旧WS路径 { location /旧gRPC名称 {改为:
location /新WS路径 { location /新gRPC名称 {保存后验证并重载:
nginx -t && systemctl reload nginx - 修改 Hysteria 2 配置(替换密码)
nano /etc/hysteria/config.yaml找到并替换旧的认证密码与 salamander 混淆密码,新密码建议含大小写 + 数字 + 符号。
修改完毕后重启 Hysteria 2:
systemctl restart hysteria-server systemctl status hysteria-server - 更新文档中的新连接信息
替换完成后,用新 UUID、新密码、新路径重新生成连接链接(格式参考第三节),并更新
private/secrets.json中的对应值,重新构建文档即可。🔒原文档此处列有「旧连接链接(已废弃)」清单,含完整密码与 UUID,脱敏版已整段移除。
十四更新 Xray 核心到最新版本
查看当前 Xray 版本
xray version一键更新到最新版(官方脚本)
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install此命令会自动拉取最新版本并替换安装,服务会短暂中断约几秒,安装完成后服务自动恢复。
验证更新结果
xray version
systemctl status xray注意事项
- 更新 Xray 核心不影响配置文件,
/usr/local/etc/xray/config.json保持不变 - 建议在用量低峰期操作(如凌晨)
- 如更新后服务异常,查看日志排查:
journalctl -u xray -f --no-pager
十五一键生成连接链接脚本
脚本本身不含密钥,它在运行时从服务器配置文件读取当前生效的 UUID / 路径 / 密码并拼出链接。使用前把域名改成自己的。
安装脚本
cat > /usr/local/bin/gen-links << 'EOF'
#!/usr/bin/env python3
import json, re, sys
def urlencode(s):
safe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"
return "".join(c if c in safe else f"%{ord(c):02X}" for c in s)
try:
with open("/usr/local/etc/xray/config.json") as f:
xray = json.load(f)
except Exception as e:
print(f"读取 Xray 配置失败: {e}"); sys.exit(1)
ws_uuid = ws_path = grpc_uuid = grpc_name = None
for ib in xray.get("inbounds", []):
clients = ib.get("settings", {}).get("clients", [])
ss = ib.get("streamSettings", {})
if ss.get("network") == "ws" and not ws_path:
ws_path = ss.get("wsSettings", {}).get("path", "")
if clients: ws_uuid = clients[0].get("id")
if ss.get("network") == "grpc" and not grpc_name:
grpc_name = ss.get("grpcSettings", {}).get("serviceName", "")
if clients: grpc_uuid = clients[0].get("id")
try:
with open("/etc/hysteria/config.yaml") as f:
hy2 = f.read()
except Exception as e:
print(f"读取 Hysteria2 配置失败: {e}"); sys.exit(1)
hy2_pass = obfs_pass = None
for pat in [r'auth:\s*\n\s*(?:type:\s*\S+\s*\n\s*)?password:\s*["\']?([^"\'\n]+)', r'auth:\s*["\']?([^"\'\n]+)']:
m = re.search(pat, hy2)
if m: hy2_pass = m.group(1).strip().strip("\"'"); break
m = re.search(r'salamander:\s*\n\s*password:\s*["\']?([^"\'\n]+)', hy2)
if m: obfs_pass = m.group(1).strip().strip("\"'")
DOMAIN = "<主域名>"
print()
print("=" * 60)
print(" VLESS + WebSocket + CDN")
print("=" * 60)
print(f"vless://{ws_uuid}@ws.{DOMAIN}:443?type=ws&path={urlencode(ws_path)}&security=tls&sni=ws.{DOMAIN}#VLESS-WS-CDN")
print()
print("=" * 60)
print(" VLESS + gRPC + CDN")
print("=" * 60)
print(f"vless://{grpc_uuid}@ws.{DOMAIN}:443?type=grpc&serviceName={grpc_name}&security=tls&sni=ws.{DOMAIN}#VLESS-gRPC-CDN")
print()
print("=" * 60)
print(" Hysteria 2")
print("=" * 60)
print(f"hysteria2://{urlencode(hy2_pass)}@hy2.{DOMAIN}:8443?sni=hy2.{DOMAIN}&obfs=salamander&obfs-password={urlencode(obfs_pass)}#HY2-主力")
print()
EOF
chmod +x /usr/local/bin/gen-links使用方法
gen-links每次更换凭证后运行即可获得最新连接链接。
该脚本的输出包含完整明文凭证,请勿把运行结果截图或粘贴到公开场合。
十一Hysteria 2 手机流量不通原因及解决方案
服务器 IP 段被运营商列入 UDP 黑名单,所有 UDP 流量在运营商侧直接丢弃,与协议 / 端口 / 混淆无关(已验证:服务器日志从未收到任何连接记录)。
商业节点能通的原因:使用 Linode 等数据中心的未被标记 IP,非协议优势。
已验证的中转方案
| 中转服务器 | IP | 结果 |
|---|---|---|
| 直连 | 代理服务器 IP | UDP 封锁 ✗ |
| Oracle 新加坡 | Oracle 服务器 IP | UDP 封锁 ✗ |
| 商业 Linode LAX | Linode 中转 IP | 正常通过 ✓ |
结论:该运营商对源站所在 IP 段和 Oracle Cloud 新加坡 IP 段均封锁 UDP,但 Linode LAX IP 段未被封锁。若要 Hysteria 2 在手机流量下可用,需租用 Linode 节点做中转。
当前最优方案:使用 VLESS + gRPC + CDN 作为主力(已验证稳定可用)。
九故障排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| Hysteria 2 手机不通 | 服务器 IP 被运营商列入 UDP 黑名单,非协议问题 | WiFi 可用;手机流量需加 Linode 等干净 IP 做 UDP 中转 |
| VLESS 443 不通 | Cloudflare 故障 | 等待恢复或检查 DNS |
| 证书过期 | acme.sh 续签失败 | 手动运行续签命令(见第七节) |
| Xray 启动失败 | 配置语法错误 | 检查 /usr/local/etc/xray/config.json |
| Nginx 启动失败 | 配置语法错误 | 运行 nginx -t 检查 |