代理服务器 部署与运维文档
🔒 脱敏版 · 可对外分享
运维文档 · 脱敏版

{{H1}}

Deployment & Operations Guide · Rocky Linux 9.5

Hysteria 2 主力节点与 Xray(VLESS + WebSocket / gRPC + Cloudflare CDN)备用节点的部署、运维、凭证轮换与故障排查记录。本版本已移除全部密钥、UUID、Token、真实域名与完整 IP,保留架构、流程与命令。

部署日期 2026-06-28系统 Rocky Linux 9.5 (Blue Onyx) x86_64维护人 维护人邮箱当前主力 VLESS + gRPC + CDN

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 UUIDXray 客户端 UUID3.2、3.3、十二
WS 路径WebSocket path3.2、十二、十三
gRPC serviceNamegRPC 服务名3.3、十二、十三
Cloudflare API Tokenacme.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 模式

SSL mode

完全(严格)

gRPC

gRPC

已开启

WebSockets

WebSockets

已开启

IPv6 兼容性

IPv6 compatibility

已开启

节点连接信息

三个节点共用一台服务器:Hysteria 2 走 UDP 直连,两个 VLESS 节点走 Cloudflare CDN。

3.1 Hysteria 2 主力节点

⚠️
手机流量下无法使用

此节点因服务器 IP 被运营商列入 UDP 黑名单,手机流量下无法使用。WiFi 宽带环境下可正常使用。商业节点可通是因其使用了未被标记的 IP 或中转,非协议问题。

项目
协议Hysteria 2
服务器hy2.<主域名>
端口8443(UDP)
密码HY2 密码
混淆类型salamander
混淆密码HY2 混淆密码
SNIhy2.<主域名>
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)
UUIDVLESS UUID
传输方式WebSocket
路径WS 路径
TLS开启
SNIws.<主域名>

连接链接格式

vless://<UUID>@ws.<主域名>:443?type=ws&path=<URL编码后的WS路径>&security=tls&sni=ws.<主域名>#VLESS-WS-CDN

3.3 VLESS + gRPC + CDN 备用节点 2 · 推荐日常

手机流量可用,延迟比 WS 略低

推荐日常优先使用。

项目
协议VLESS
服务器ws.<主域名>
端口443(TCP)
UUIDVLESS UUID
传输方式gRPC
serviceNamegRPC serviceName
TLS开启
SNIws.<主域名>

连接链接格式

vless://<UUID>@ws.<主域名>:443?type=grpc&serviceName=<gRPC服务名>&security=tls&sni=ws.<主域名>#VLESS-gRPC-CDN

节点对比与使用策略

节点速度稳定性手机流量WiFi抗封锁
Hysteria 2★★★★★★★★★★★
VLESS + gRPC + CDN★★★★★★★★★★★★★★
VLESS + WS + CDN★★★★★★★★★★★★★

推荐策略

手机流量 · 日常

cellular · primary

优先 VLESS + gRPC + CDN

手机流量 · 备用

cellular · fallback

切换 VLESS + WS + CDN

WiFi 环境

wifi

优先 Hysteria 2(速度最快)

推荐客户端

平台客户端支持协议
Windowsv2rayNVLESS + WS / gRPC
Androidv2rayNG / Hiddify / sing-boxVLESS + WS / gRPC + Hysteria 2
iOSHiddify / Shadowrocket全部支持
macOSHiddify / 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 混淆密码
SNIhy2.<主域名>
⚠️

端口跳跃链接格式(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 TokenCloudflare 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

十三更换凭证(废弃旧订阅 / 防止他人使用)

⚠️
适用场景

配置文件泄露、文档外传、怀疑他人使用你的节点时执行。执行后所有旧连接链接 / 配置立即失效。

  1. 生成新 UUID(用于替换 VLESS UUID)
    xray uuid
    # 或
    cat /proc/sys/kernel/random/uuid

    记下输出的新 UUID,格式如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

  2. 修改 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
  3. 同步更新 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
  4. 修改 Hysteria 2 配置(替换密码)
    nano /etc/hysteria/config.yaml

    找到并替换旧的认证密码与 salamander 混淆密码,新密码建议含大小写 + 数字 + 符号。

    修改完毕后重启 Hysteria 2:

    systemctl restart hysteria-server
    systemctl status hysteria-server
  5. 更新文档中的新连接信息

    替换完成后,用新 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结果
直连代理服务器 IPUDP 封锁 ✗
Oracle 新加坡Oracle 服务器 IPUDP 封锁 ✗
商业 Linode LAXLinode 中转 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 检查