# 双 VPS Hysteria 2 双跳跃主备高可用架构与全自动容灾实战指南

> **前言**:本文记录了一套基于 **Hysteria 2(QUIC)协议** 的企业级高可用网络拓扑落地实操。
方案采用“双机端口跳跃 + 搬瓦工顶级线路主力 + RackNerd 备用容灾 + 软路由内核级 Fallback 自动切换”,
既支持在外手机/电脑单机直连,又支持家庭软路由全屋无感透明分流。
文中对每一步命令的底层机理、验证手段及常见异常进行了系统拆解。

---

## 阶段零:整体架构与容灾拓扑设计

```text
                               ┌────────────────────────────────────────────────────────┐
                               │                    客户端 / 软路由接入                 │
                               └───────────┬────────────────────────────────┬───────────┘
                                           │                                │
                     ┌─────────────────────┴───────┐        ┌───────────────┴─────────────────────┐
                     │  场景 A:手机/笔记本外出直连 │        │ 场景 B:家庭软路由 (OpenClash TUN) │
                     │  (v2rayNG / 小火箭 / Verge) │        │ Fake-IP 模式 + 自动健康探测 Fallback│
                     └─────────────┬───────────────┘        └───────────────┬─────────────────────┘
                                   │                                        │
           ┌───────────────────────┴────────────────────────────────────────┴───────────────────────┐
           │                                          双节点拓扑                                  │
           ▼                                                                                        ▼
┌──────────────────────────────────────┐                                 ┌──────────────────────────────────────┐
│  ① 搬瓦工 (BWG) —— 主力节点          │                                 │  ② RackNerd (RN) —— 备用容灾节点     │
│  - 线路:CN2 GIA / 9929 顶级优化链路 │                                 │  - 线路:普通国际骨干网 (如 163)     │
│  - 端口:监听 8443 + 端口跳跃 20000-50000│                             │  - 端口:监听 443 + 端口跳跃 20000-50000 │
│  - 带宽参数:100M 上行 / 1000M 下行  │                                 │  - 带宽参数:50M 上行 / 300M 下行    │
│  - 目标:日常独占千兆,抗晚高峰 QoS  │                                 │  - 目标:主力中断 2.5 秒内无感漂移接管│
└──────────────────────────────────────┘                                 └──────────────────────────────────────┘
```

### 核心参数规划速查

| 参数项 | 主力 VPS (搬瓦工 BWG) | 备用 VPS (RackNerd RN) | 规划原理说明 |
| :--- | :--- | :--- | :--- |
| **主监听端口** | UDP `<BWG_HY2_PORT>` (如 8443) | UDP 443 | 搬瓦工监听 8443 避开 Web 占用的 443;RN 直接监听标准 443 |
| **端口跳跃范围** | UDP `20000:50000` | UDP `20000:50000` | 客户端动态跳跃,彻底规避晚高峰运营商单端口 QoS 恶性限速 |
| **带宽声明限额** | `100 mbps / 1000 mbps` | `50 mbps / 300 mbps` | 优质线路释放千兆能力;普通线路限制速率防止 Bufferbloat 拥塞 |
| **证书机制** | 自签 ECC 证书 + 64位指纹固定 | 自签 ECC 证书 + 64位指纹固定 | 零域名成本,免证书维护,杜绝自签客户端红框警告与 MITM 劫持 |

---

## 阶段一:主力 VPS(搬瓦工 BWG)部署

### 步骤 1.1:通过终端建立安全连接

在本地 Windows CMD 或 PowerShell 中执行:

```cmd
ssh -p <BWG_SSH_PORT> root@<BWG_SERVER_IP>
```

* **原理解析**:`ssh` 基于非对称加密与服务器协商会话密钥。首次连接提示 `Are you sure you want to continue connecting (yes/no)?` 时输入 `yes`,公钥指纹会被记入本地 `~/.ssh/known_hosts` 防范中间人劫持。Linux 终端在输入密码时不显示星号或光标移动,属于安全防窥设计。
* **成功验证**:终端前缀变为 `root@hostname:~#`。
* **常见问题与排错**:
  * *报错*:`Host key verification failed`。
  * *原因*:VPS 重装过系统,本地记录的旧公钥指纹与当前指纹冲突。
  * *解决*:在本地 CMD 中执行 `ssh-keygen -R <BWG_SERVER_IP>` 清空旧指纹后重连。

### 步骤 1.2:环境初始化与官方核心安装

```bash
apt-get update && apt-get install -y curl openssl
bash <(curl -fsSL https://get.hy2.sh/)
```

* **原理解析**:
  * `curl -fsSL`:`-f` 遇到 HTTP 错误静默退出;`-sS` 静默执行但保留致命错误输出;`-L` 自动跟随重定向。
  * `<(...)`(进程替换):利用 Linux 虚拟文件描述符将脚本数据流直接喂给 Bash 在内存中流式执行,**不向磁盘写入临时 `.sh` 脚本,防止脏文件残留**。
  * 脚本会自动拉取最新 Go 二进制放入 `/usr/local/bin/hysteria`,创建受限系统用户 `hysteria:hysteria` 实施权限隔离,并注册 Systemd 服务。
* **成功验证**:执行 `hysteria version`,终端回显输出 `Hysteria 2.x.x` 版本信息。
* **常见问题与排错**:
  * *报错*:连接 GitHub 脚本地址提示超时。
  * *解决*:执行 `echo "nameserver 8.8.8.8" > /etc/resolv.conf` 临时指定公共 DNS 解析后重试。

### 步骤 1.3:生成 100 年自签名 ECC 证书

```bash
mkdir -p /etc/hysteria

openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) \
  -keyout /etc/hysteria/server.key \
  -out /etc/hysteria/server.crt \
  -subj "/CN=www.bing.com" -days 36500

chown -R hysteria:hysteria /etc/hysteria
chmod 600 /etc/hysteria/server.key
```

* **原理解析(为什么必须选 ECC prime256v1?)**:
  * NIST P-256(`prime256v1`)提供 256 位密钥长度,安全强度等同于传统 RSA 3072 位,但证书体积大幅压缩。
  * QUIC 协议初次握手(1-RTT / 0-RTT)的数据包能维持在网络标准 MTU(1500 字节)内,**防止跨洋 UDP 报文被切片丢弃导致的握手卡顿**。
  * `-subj "/CN=www.bing.com"` 伪装域名,有效期 100 年实现终生免维护;`chmod 600` 锁定私钥仅拥有者可读。
* **成功验证**:执行 `ls -lh /etc/hysteria/`,确认目录下存在 `server.crt` 和权限为 `-rw-------` 的 `server.key`。

### 步骤 1.4:写入主力节点服务端配置

```bash
cat << 'EOF' > /etc/hysteria/config.yaml
listen: :<BWG_HY2_PORT>

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

auth:
  type: password
  password: <YOUR_BWG_PASSWORD>

masquerade:
  type: proxy
  proxy:
    url: https://www.bing.com
    rewriteHost: true

quic:
  initStreamReceiveWindow: 8388608
  maxStreamReceiveWindow: 8388608
  initConnReceiveWindow: 20971520
  maxConnReceiveWindow: 20971520

bandwidth:
  up: 100 mbps
  down: 1000 mbps

ignoreClientBandwidth: false
EOF
```

* **原理解析**:
  * `cat << 'EOF'`:HereDoc 单引号模式,强制屏蔽变量解析,防止密码中的 `$`, `!` 等特殊字符被系统误解析吞噬。
  * `masquerade`:主动探测反制。当网络探针向端口发起常规 HTTP/3 请求时,服务端将其作为透明代理反代给必应官网,对外部探测呈现正常的 Web 站点表现。
  * `quic` 窗口优化:在中美跨洋长延迟链路下(RTT 约 160ms~200ms),大单流(8MB)与大连接窗口(20MB)可消除 BDP(带宽时延积)瓶颈,防止发包端在等待 ACK 确认时出现流水线停顿。
  * `bandwidth`:声明千兆下行,确保充分利用家庭宽带。
* **成功验证**:执行 `cat /etc/hysteria/config.yaml`,确认输出格式缩进完整无误。

### 步骤 1.5:配置内核级端口跳跃与规则落盘(持久化)

```bash
# 1. 动态抓取主公网网卡名
INTERFACE=$(ip route show default | awk '{print $5}')

# 2. 注入 NAT PREROUTING 规则(将 20000-50000 UDP 重定向至本地实际监听端口)
iptables -t nat -A PREROUTING -i $INTERFACE -p udp --dport 20000:50000 -j REDIRECT --to-ports <BWG_HY2_PORT>

# 3. 安装规则固化工具并持久化落盘
apt-get update && apt-get install -y iptables-persistent
netfilter-persistent save
```

* **原理解析(授人以渔:端口跳跃如何规避 QoS?)**:
  * 国内运营商流控系统(DPI)会对单一五元组(IP+端口)持续大流量的 UDP 实施恶性限速。让客户端在 `20000-50000` 端口之间动态发包,流控会将其误判为独立的短连接,从而绕过限速策略。
  * Linux 内核 Netfilter 在数据包刚进网卡时通过 `REDIRECT` 动作将目标端口重写为服务端的实际端口,**服务端只需监听一个端口,即可接管 30,000 个端口的流量**。
  * `netfilter-persistent save` 会将内存规则落盘至 `/etc/iptables/rules.v4`,防止 VPS 重启失效。
* **安装时的交互弹窗避坑**:
  * **弹窗一(蓝底提示 `Save current IPv4 rules?`)**:敲 **Enter** 确认选 `<Yes>`;若随后出现 IPv6 同样回车选 `<Yes>`。
  * **弹窗二(紫底黑框提示 `needrestart` / `Which services should be restarted?`)**:按一次键盘 **Tab 键** 将高亮焦点切到底部的 **`<Ok>`**,敲 **Enter** 确认退出。
* **成功验证**:执行 `iptables -t nat -L -n -v`,在 `Chain PREROUTING` 下能看到:
  ```text
  REDIRECT  udp  --  eth0  *  0.0.0.0/0  0.0.0.0/0  udp dpts:20000:50000 redir ports <BWG_HY2_PORT>
  ```

### 步骤 1.6:启动服务并提取证书防伪指纹

```bash
systemctl daemon-reload
systemctl enable --now hysteria-server
systemctl status hysteria-server --no-pager

# 提取证书 SHA-256 唯一指纹
openssl x509 -in /etc/hysteria/server.crt -outform DER | sha256sum | awk '{print $1}'
```

* **原理解析(证书固定 Certificate Pinning)**:
  * 自签证书因缺少公共权威 CA 机构背书,移动端客户端默认会报红甚至拦截握手。
  * 通过提取证书的 SHA-256 唯一哈希摘要并在客户端进行指纹固定(Pinning),握手时客户端会直接比对公钥哈希,有 1 位不符便立即熔断。**零成本消除安全警告,并具备防御中间人劫持的能力**。
* **成功验证**:
  * 服务状态输出包含绿色的 `active (running)`,且日志显示已在指定端口监听 UDP。
  * 终端打印出一条 64 位的哈希字符串,复制保存至备忘录备用。

---

## 阶段二:备用 VPS(RackNerd RN)部署与普通线路调优

在 RackNerd VPS 上重复步骤 1.1 至 1.3 完成环境安装与自签证书签发。

### 步骤 2.1:写入备用节点配置(防 Bufferbloat 拥塞)

```bash
cat << 'EOF' > /etc/hysteria/config.yaml
listen: :443

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

auth:
  type: password
  password: <YOUR_RN_PASSWORD>

masquerade:
  type: proxy
  proxy:
    url: https://www.bing.com
    rewriteHost: true

quic:
  initStreamReceiveWindow: 8388608
  maxStreamReceiveWindow: 8388608
  initConnReceiveWindow: 20971520
  maxConnReceiveWindow: 20971520

bandwidth:
  up: 50 mbps
  down: 300 mbps

ignoreClientBandwidth: false
EOF
```

* **原理解析(为什么备用节点带宽不能标千兆?)**:
  * 普通 163 骨干网晚高峰回国丢包率偏高。如果虚标千兆带宽,Hysteria 2 会以激进速率强行发包,超出跨洋路由器的承载上限,导致数据包在队列中积压超时被丢弃(Bufferbloat 缓冲区膨胀),引发严重的重传风暴与数千毫秒延迟。
  * 将其限定在 `50M/300M`,能在保证流畅播放 4K 视频的同时维持流控平稳。

### 步骤 2.2:配置端口跳跃并固化

```bash
INTERFACE=$(ip route show default | awk '{print $5}')
iptables -t nat -A PREROUTING -i $INTERFACE -p udp --dport 20000:50000 -j REDIRECT --to-ports 443

apt-get update && apt-get install -y iptables-persistent
netfilter-persistent save
```

* **成功验证**:执行 `iptables -t nat -L -n -v`,确认包含 `udp dpts:20000:50000 redir ports 443`。

### 步骤 2.3:启动备用服务并抓取指纹

```bash
systemctl daemon-reload
systemctl enable --now hysteria-server
openssl x509 -in /etc/hysteria/server.crt -outform DER | sha256sum | awk '{print $1}'
```

* **成功验证**:服务运行正常,记录该 VPS 对应的 64 位 SHA-256 指纹。

---

## 阶段三:双机自动化运维:看门狗与内存/日志维护脚本

两台 VPS 均需配置此定时维护脚本,以防范低配小内存机器因 Go 堆内存未立即归还导致的 OOM 杀进程,以及系统日志撑满小磁盘。

### 步骤 3.1:写入全能维护脚本

在两台 VPS 终端中执行:

```bash
cat << 'EOF' > /usr/local/bin/hy2-maintenance.sh
#!/usr/bin/env bash
LOG_TAG="[HY2-MAINTENANCE]"

# 1. 看门狗模块:进程异常退出时毫秒级自动拉起
watchdog() {
    if ! systemctl is-active --quiet hysteria-server; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') $LOG_TAG 异常:检测到服务离线,正在紧急重启..."
        systemctl restart hysteria-server
        sleep 2
        if systemctl is-active --quiet hysteria-server; then
            echo "$(date '+%Y-%m-%d %H:%M:%S') $LOG_TAG 成功:服务已恢复拉起。"
        else
            echo "$(date '+%Y-%m-%d %H:%M:%S') $LOG_TAG 严重:服务拉起失败,请人工排查!"
        fi
    fi
}

# 2. 深度维护模块:清理日志、回收内存与周期重启
deep_clean() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') $LOG_TAG 执行系统深度维护..."
    
    # 限制 systemd-journald 日志在 100MB / 7 天内
    command -v journalctl &> /dev/null && journalctl --vacuum-size=100M --vacuum-time=7d > /dev/null 2>&1
    
    # 安全截断超过 20MB 的历史系统大文本日志(不破坏已有写入文件描述符)
    for log_file in /var/log/*.log /var/log/syslog /var/log/messages /var/log/auth.log; do
        if [ -f "$log_file" ] && [ $(stat -c%s "$log_file" 2>/dev/null || echo 0) -gt 20971520 ]; then
            truncate -s 0 "$log_file"
        fi
    done
    
    # 周期轻量重启服务释放 Go 堆内存池,并同步磁盘写入回收内核缓存
    systemctl restart hysteria-server
    sync
    echo 3 > /proc/sys/vm/drop_caches
    echo "$(date '+%Y-%m-%d %H:%M:%S') $LOG_TAG 深度维护任务全部完成。"
}

case "$1" in
    check) watchdog ;;
    clean) deep_clean ;;
    *) echo "用法: $0 {check|clean}"; exit 1 ;;
esac
EOF

chmod +x /usr/local/bin/hy2-maintenance.sh
```

* **原理解析(为什么必须用 `truncate -s 0` 而不是 `rm`?)**:
  * 如果直接用 `rm` 删除正在被内核写入的文件(如 `syslog`),进程依然持有文件描述符,磁盘空间**不会被真正释放**,反而会产生僵尸句柄。
  * `truncate -s 0` 将文件长度瞬间截断为 0 字节,既能立刻释放空间,又不会损坏已有写句柄。

### 步骤 3.2:挂载 Crontab 定时调度

```bash
(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/hy2-maintenance.sh check >> /var/log/hy2-watchdog.log 2>&1"; echo "0 4 * * 1 /usr/local/bin/hy2-maintenance.sh clean >> /var/log/hy2-maintenance.log 2>&1") | crontab -
```

* **原理解析**:
  * 每 5 分钟执行一次 `check`(看门狗巡检,异常退出 5 分钟内自愈)。
  * 每周一凌晨 04:00 执行一次 `clean`(网络低峰期整理内存并轮转日志)。
* **成功验证**:执行 `crontab -l`,正确打印出上述两行配置。

---

## 阶段四:方案一 —— 移动单机客户端直连(外出差旅)

适用于手机蜂窝网络或笔记本在外直连。

### 步骤 4.1:拼接带指纹固定与端口跳跃的标准 URL

将参数替换为真实值后,拼接为标准链接:

* **搬瓦工主力节点(含端口跳跃与指纹固定)**:
  ```text
  hy2://<BWG_PASSWORD>@<BWG_SERVER_IP>:<BWG_HY2_PORT>/?sni=bing.com&pinSHA256=<BWG_FINGERPRINT>&mport=20000-50000#BWG-Primary
  ```
* **RackNerd 备用节点(含端口跳跃与指纹固定)**:
  ```text
  hy2://<RN_PASSWORD>@<RN_SERVER_IP>:443/?sni=www.bing.com&pinSHA256=<RN_FINGERPRINT>&mport=20000-50000#RN-Backup
  ```

### 步骤 4.2:各平台客户端导入配置速查

* **Android (v2rayNG / NekoBox)**:
  * 复制链接,打开 v2rayNG 点击右上角 `+` -> **【从剪贴板导入】**。
  * 由于参数中携带了 `pinSHA256`,客户端直接校验公钥指纹,**不会触发不受信任自签证书的红色拦截**。
* **iOS (Shadowrocket / 小火箭)**:
  * 从剪贴板导入,进入节点编辑详情,确认开启“允许不安全(Allow Insecure)”,并在端口处确认已填写跳跃端口范围 `20000-50000`。
* **Windows / macOS (Clash Verge Rev)**:
  * 直接加载后文软路由相同的 YAML 规则文件,开启系统代理接管。
* **成功验证**:手机切断 Wi-Fi 走 5G 移动网络,开启客户端代理,访问 `https://ip.sb`,显示的出口 IP 与所选 VPS 物理 IP 一致。

---

## 阶段五:方案二 —— 软路由全屋透明代理与无感容灾(家庭网关)

### 步骤 5.1:停用旧代理插件(消除防火墙与端口死锁)

若软路由上此前运行着 **ShadowSocksR Plus+** 或 PassWall:
1. 进入 OpenWrt 后台:**【服务】** -> **【ShadowSocksR Plus+】**。
2. 客户端主服务器下拉切换为 **“停用”**,取消自动切换勾选,点击 **【保存并应用】**。
* **原理解析**:旧插件会在防火墙注入全局 REDIRECT 链,并强占系统的 53 DNS 端口。若同时开启两个代理插件,规则相互抢占会导致整个局域网瞬间瘫痪断网。

### 步骤 5.2:通过 SSH 写入软路由配置(绕过 LuCI 100KB 截断限制)

在 OpenWrt 网页后台在线编辑大文本配置时,极易触发 `At reading part data, byte offset 102910, the value exceeds the maximum allow size` 错误。
* **根因**:OpenWrt 新版 LuCI 框架针对网页文本框设置了 **100KB 单字段限制**。
* **解决之道**:打开电脑 CMD,执行 `ssh root@<ROUTER_IP>` 登录软路由,直接在终端中写入配置:

```bash
mkdir -p /etc/openclash/config

cat << 'EOF' > /etc/openclash/config/config.yaml
# ===================================================
# 基础运行与监听设置
# ===================================================
port: 7890
socks-port: 7891
redir-port: 7892
mixed-port: 7893
tproxy-port: 7895
allow-lan: true
mode: rule
log-level: info
ipv6: false
external-controller: 0.0.0.0:9090

# ===================================================
# DNS 系统 (TUN 虚拟网卡 + Fake-IP 模式)
# ===================================================
dns:
  enable: true
  listen: 0.0.0.0:1053
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - "*.lan"
    - "localhost.ptlogin2.qq.com"
  nameserver:
    - 223.5.5.5
    - 119.29.29.29
  fallback:
    - 8.8.8.8
    - 1.1.1.1

# ===================================================
# 节点集群定义(双机均启用端口跳跃)
# ===================================================
proxies:
  # 搬瓦工:千兆主力 + 20000-50000 端口跳跃
  - name: "BWG-Hy2-Primary"
    type: hysteria2
    server: <BWG_SERVER_IP>
    port: <BWG_HY2_PORT>
    ports: 20000-50000
    password: <YOUR_BWG_PASSWORD>
    sni: bing.com
    skip-cert-verify: true
    alpn:
      - h3
    up: "100 Mbps"
    down: "1000 Mbps"
    fast-open: true

  # RackNerd:防 QoS 备用 + 20000-50000 端口跳跃
  - name: "RN-Hy2-Backup"
    type: hysteria2
    server: <RN_SERVER_IP>
    port: 443
    ports: 20000-50000
    password: <YOUR_RN_PASSWORD>
    sni: www.bing.com
    skip-cert-verify: true
    alpn:
      - h3
    up: "50 Mbps"
    down: "300 Mbps"
    fast-open: true

# ===================================================
# 容灾核心:自动故障转移策略组 (Fallback)
# ===================================================
proxy-groups:
  - name: "自动故障转移"
    type: fallback
    url: "https://www.gstatic.com/generate_204"
    interval: 180              # 每 3 分钟执行一次健康心跳
    timeout: 2500              # 单次握手超时 2.5 秒即标记为故障熔断
    proxies:
      - "BWG-Hy2-Primary"      # 排在首位:只要畅通,独占 100% 流量
      - "RN-Hy2-Backup"        # 排在次位:主力异常时毫秒级自动漂移接管

  - name: "节点选择"
    type: select
    proxies:
      - "自动故障转移"
      - "BWG-Hy2-Primary"
      - "RN-Hy2-Backup"
      - DIRECT

# ===================================================
# 路由分流规则 (国内直连,国外走容灾组)
# ===================================================
rules:
  - GEOIP,lan,DIRECT,no-resolve
  - IP-CIDR,223.5.5.5/32,DIRECT,no-resolve
  - IP-CIDR,119.29.29.29/32,DIRECT,no-resolve
  - GEOIP,CN,DIRECT
  - MATCH,节点选择
EOF
```

* **原理解析(授人以渔:为什么 Fake-IP + Fallback 能做到无感容灾?)**:
  * **Fake-IP 机制**:内网主机请求外部域名时,软路由立即下发私有网段保留地址(`198.18.0.x`),终端拿到后无需等待远端查询即建立连接。软路由接收到原始 IP 包后在底层隧道直接用域名进行路由转发,实现 **0ms 域名响应并彻底免疫国内 DNS 劫持污染**。
  * **Fallback 容灾机制**:Meta 内核按照配置列表的先后顺序作为优先级。只有当排在第一位的主力节点无法通过 HTTP 探测时,内核才会临时切换到备用节点;主力恢复后自动切回。
* **成功验证**:执行 `ls -lh /etc/openclash/config/config.yaml`,确认文件已生成且大小在 2KB 左右。

### 步骤 5.3:重载核心与应用核验

1. 打开软路由后台:**【服务】** -> **【OpenClash】**。
2. 在 **【运行状态】** 界面,确认配置文件已选中 `config.yaml`,点击 **【应用配置】**。
3. 等待 5~10 秒,左上角状态变为绿色的 **“运行中”**。
4. 点击右侧面板按钮 **【Metacubexd】** 进入 Web 仪表盘:
   * 切换至 **Proxies(代理)** 页面,找到 **“自动故障转移”** 策略组。
   * 点击右上角测速小图标,确认两个节点均返回绿色的低延迟读数。

> **技术原理说明:为什么重载 OpenClash 时 SSH 终端会提示 `Connection closed by remote host`?**
> 这是完全正常的底层网络行为。当 OpenClash 重启并重新加载 TUN 虚拟网卡与防火墙规则时,软路由内部的连接跟踪表(`conntrack`)会被刷新,之前建立的所有 TCP 长连接(包括当前的 SSH 终端会话)会被内核发送 RST 报文主动重置。此时直接重新发起 SSH 连接即可。

---

## 阶段六:全链路容灾切换演练(实战验收)

按以下步骤在生产环境中闭环测试高可用自动切换逻辑:

1. **常态基准确认**:电脑端持续播放一段 4K 视频,访问 `https://ip.sb` 确认当前出口为 **搬瓦工主力 IP**。
2. **切断主力节点**:通过终端连接到搬瓦工 VPS,执行停服命令:
   ```bash
   systemctl stop hysteria-server
   ```
3. **验证秒级漂移**:在软路由 Metacubexd 仪表盘中,或直接刷新 `https://ip.sb`,观察到出口 IP 在数秒内**自动变更为 RackNerd 备用 IP**,此时视频播放依旧平滑,全屋局域网无断网弹窗。
4. **恢复主力节点**:回到搬瓦工 VPS 终端,执行启动命令:
   ```bash
   systemctl start hysteria-server
   ```
5. **验证自动回切**:等待下一个探测周期,软路由检测到主力恢复,策略组高亮自动重新跳回主力节点,出口 IP 恢复为搬瓦工。
6. **验证端口跳跃实时命中**:
   在搬瓦工 VPS 执行以下命令:
   ```bash
   iptables -t nat -L -n -v | grep <BWG_HY2_PORT>
   ```
   随着电脑端缓冲视频,最左侧的 **pkts(数据包量)** 与 **bytes** 呈现出上千或上万量级的持续递增,证明软路由发出的流量已成功在 `20000-50000` 动态跳跃并被内核重定向至主监听端口。

---

## 阶段七:常见故障与排查速查表

| 故障现象 | 根因排查方向 | 解决方案 |
| :--- | :--- | :--- |
| **手机 v2rayNG 提示证书不安全并弹红框阻断** | 节点使用了自签证书但未绑定指纹 | 确保导入的 URL 中包含 `pinSHA256=<64位指纹>` 参数并重新导入。 |
| **保存 OpenClash 配置提示 `byte offset ... exceeds maximum`** | LuCI 引擎对单表单限制 100KB 大小 | 避免在网页编辑大配置文件,通过 SSH 终端执行 `cat << 'EOF'` 直接落盘写入。 |
| **开启 OpenClash 后全屋断网打不开网页** | 原旧插件(如 SSR+)未停止,端口与防火墙规则抢占 | 彻底停用 SSR+ 并保存应用,随后重启 OpenClash。 |
| **VPS 重启后端口跳跃失效,节点连不上** | 防火墙规则仅保留在内存中,未持久化落盘 | 执行 `apt-get install -y iptables-persistent && netfilter-persistent save`。 |
| **VPS 运行几个月后莫名掉线** | 小内存 VPS 发生 OOM,或日志填满磁盘 | 部署本文第三阶段的看门狗与日志维护 Crontab 脚本。 |
| **执行 `netfilter-persistent save` 报错 command not found** | 未安装持久化组件 | 执行 `apt-get update && apt-get install -y iptables-persistent` 补装工具。 |