Skip to content

约 9 分钟阅读

Hysteria2 落地与订阅编排 ​

跨境链路诊断说明了怎样验证上传停顿,而不是仅凭延迟选择协议。本页讨论通过对照实验后的一种部署:Hysteria2 承载适合 QUIC 的流量,保留 TCP 通道,并将账号与订阅变更作为一次可检查、可恢复的发布。普通流代理不能直接等同于 IP 层 TCP-over-TCP 隧道。

方案取舍 ​

通道核心约束适合的判断条件
Shadowsocks TCP加密流转发,缺失字节影响该 TCP 连接交付客户端兼容、路径稳定,实际负载通过
Shadowsocks + WebSocket/TLS多出插件、网关与路径配置;复用情况决定阻塞范围需要与现有 HTTP 入口集成,能维护该组合
Trojan + TLSTCP 与证书,入口认证与目标 TLS 分开需要简单的 TLS 代理路线,可复用本站部署示例
Hysteria2QUIC/UDP、证书、认证与双方参数兼容UDP 可达,上传与长连接对照实测有收益

这里选择“QUIC 优先、TCP 兜底”,不是给所有网络规定同一个优先级。若单位网络限制 UDP,应保留可独立验证的 TCP 通道。客户端也不限于 Mihomo,官方客户端、sing-box 等兼容实现均可使用;本文订阅语法专用于 Mihomo,不能直接复制给其他内核。

几个关键机制 ​

QUIC 对可靠流分别排序和交付,减少跨流字节排序等待,但流共享网络路径、连接级拥塞控制与资源。某个包丢失仍可影响连接整体发送,不能把“流独立”理解成完全隔离。

带宽声明会影响各方向是否选择 Brutal。未声明某方向时,该方向可使用端点配置的其他控制器;服务端 ignoreClientBandwidth 也会改变协商。Brutal 按目标速率模型发送并可补偿丢包,目标高于真实容量会浪费带宽并增加拥塞,不保证业务永远达到设定速率。

salamander 混淆改变报文形态,双方密码必须一致,但不保证不可识别或一定能通过网络策略。开启后服务端不再兼容标准 QUIC/HTTP/3。masquerade 可配置文件、字符串或反向代理;它与混淆不是同一个功能,不能承诺混淆开启后普通浏览器仍可直接访问伪装网站。

整体架构 ​

Hysteria2 与 TCP 双通道及独立订阅控制面

应用流量进入 Mihomo,规则可选择 DIRECT,也可选择 PROXY。故障切换组为新连接选择可用通道;两条通道在远端分别终止,再访问目标。订阅发布只传递配置,不是业务请求的中转站。下面以已有 Trojan/TLS 服务作为完整可引用的 TCP 兜底;已有 Shadowsocks/WebSocket 部署可保留,但必须独立验证插件配置。

服务端要点 ​

绑定监听地址并修正回程路径 ​

现象:开启混淆后,客户端握手总是超时;关闭混淆能握手但数据传不动。

抓包证据:请求从网卡 A 进入(目的地址为 A 的内网地址),回包却从网卡 B 发出,源地址是 B 的内网地址。客户端的 UDP 套接字只接受来自它连接对象的回包,源地址不一致的包被直接丢弃。

边界:多网卡路由、源地址选择与云侧 NAT 共同决定回程。UDP 可以使用 connected socket 或辅助数据选择源地址,监听通配地址不必然有错;TCP 同样受策略路由与反向路径过滤影响。先用两端抓包证明实际源地址和出口,再判断当前实现是否正确保存入口地址,不能只看到 :443 就改配置。

确认该问题后,固定服务入口和回程路由。以下仅是单网卡对应一张路由表的 IPv4 示例,192.0.2.0/24 是文档保留网段,不可直接用于真实主机。主机已有表号、网关、前缀、优先级必须先核对。

先为表补齐直连网段和默认路由,再增加源规则;只增加 ip rule 而不给表提供可用路由,不构成完整修复。

bash
# 示例:eth0=192.0.2.12/24,网关192.0.2.1,表201尚未占用
ip route show table 201
ip rule show
sudo ip route replace table 201 192.0.2.0/24 dev eth0 src 192.0.2.12
sudo ip route replace table 201 default via 192.0.2.1 dev eth0
sudo ip rule add pref 10101 from 192.0.2.12/32 lookup 201
ip route get 198.51.100.20 from 192.0.2.12

ip rule add 重复执行可能重复添加,自动化需先比对规则。通过控制台保留恢复入口,用发行版现有网络管理器持久化,避免多个管理者覆盖路由。检查 rp_filter、云侧 NAT 和安全组,不直接全局关闭过滤。监听可绑定对应本地地址;客户端写映射后的公网地址或正确解析的域名,SNI 仍为证书名称。重启后再次核对路由和双向抓包。

放行 UDP 端口 ​

云安全组和主机防火墙都要放行 UDP 端口(本例为 443)。只放行其中一个,握手包看起来像“服务端没响应”。验证方法是在服务器上抓包,确认客户端的 UDP 包到达并有回包:

bash
tcpdump -ni any udp port 443 -c 20

用对照实验检查路径 MTU ​

握手成功后数据停顿,也可能来自带宽、策略、目标访问或 MTU。先保存版本、默认配置、包长与丢包时点,在保持其他条件不变时对照以下开关;恢复默认值再次测试,才可判断它是否影响当前路径。不要把关闭探测作为所有部署的默认调优。

yaml
quic:
  disablePathMTUDiscovery: true

区分带宽声明与实际吞吐 ​

服务端 tx 以服务端视角描述发送方向,关联客户端接收速率;零值可能表示未声明该方向的带宽,并非一律错误。应结合实际版本、两端配置与算法选择解释,不用一个非零字段作为验收标准。

Mihomo 支持 up: '16'(默认 Mbps),也支持 up: '16 Mbps'。遇到字段未生效,先查运行内核是否加载了该份订阅,而不是断言带单位字符串都无效。声明值应低于路径可持续能力;无声明时也可正常运行,但传输行为不同。服务端带宽限制的覆盖范围随模式而异,不能把它当成所有算法和全部用户的统一总限速。

完整示例(占位值) ​

yaml
listen: 192.0.2.12:443           # 替换为实际本地入口地址
tls:
  cert: /etc/hysteria/certs/fullchain.pem
  key: /etc/hysteria/certs/privkey.pem
obfs:
  type: salamander
  salamander:
    password: REPLACE_WITH_OBFS_PASSWORD
auth:
  type: userpass
  userpass:
    user01: REPLACE_WITH_UNIQUE_PASSWORD

这是独立 Hysteria2 服务端的完整最小起点,配置语法不适用于 sing-box 入站。需先安装并固定选定版本,核对 hysteria version、hysteria server --help、实际 unit 的配置路径、运行身份和证书读取权限。证书安装与续期机制见 证书页,但其 sing-box 重启命令不能原样套用;Hysteria2 的文件证书在握手时读取,仍要验证新连接看到新证书。

示例省略 masquerade,不配置不受控的 HTTPS 后端,更不关闭证书验证。若不启用混淆且需要展示静态内容,可按实际用途另配文件或字符串模式。修改静态 userpass 后,本流程按重启应用处理,既有连接会中断;自动化仅在有效配置变化时重启,之后验证新旧凭据,而不是仅检查进程状态。

订阅模板 ​

以下是完整 Mihomo 本地配置起点。TCP 兜底依赖已按 systemd 或 Docker 部署的 Trojan 服务;两服务可使用相同数字端口,因为这里分别监听 UDP 与 TCP。两份配置中的密码分别替换,证书覆盖 proxy.example.com。

yaml
mixed-port: 7890
bind-address: 127.0.0.1
allow-lan: false
mode: rule
log-level: info

proxies:
- name: user01-HY2
  type: hysteria2
  server: 203.0.113.10            # 对外网卡对应的公网 IP
  port: 443
  password: user01:REPLACE_WITH_UNIQUE_PASSWORD
  sni: proxy.example.com
  obfs: salamander
  obfs-password: REPLACE_WITH_OBFS_PASSWORD
  up: '16 Mbps'
  down: '30 Mbps'
  skip-cert-verify: false
- name: user01-TCP
  type: trojan
  server: proxy.example.com
  port: 443
  password: REPLACE_WITH_TROJAN_PASSWORD
  sni: proxy.example.com
  skip-cert-verify: false
  udp: false

proxy-groups:
- name: PROXY
  type: fallback
  url: https://www.gstatic.com/generate_204
  interval: 60
  lazy: false
  expected-status: 204
  proxies:
  - user01-HY2
  - user01-TCP

rules:
- DOMAIN-SUFFIX,internal.example,DIRECT
- MATCH,PROXY

fallback 按候选顺序选可用节点,lazy: false 让未使用时也定期探测。204 探测只证明该目标的当前探测通过,不证明上传或长连接正常,60 秒间隔也不是固定的业务恢复时长。内部域名的 DNS 需要另行配置,DIRECT 规则不会创建企业 DNS。

订阅不加入未经运行版本确认的连接中断字段。组切换主要影响后续连接,已有连接需要通过客户端连接管理按需关闭;即使某版本能自动中断,也只是断开,不会重放业务。上传请求需应用自行处理幂等和重试。示例 TCP 兜底不支持 UDP 业务,不能由 TCP 代理探测通过推导 UDP 也能回退。

例如中转 API 原来命中 DIRECT,切换后仍需在连接记录里确认命中 PROXY 和实际节点,再按完整上传探针验收;不能因组名改了就写成问题已解决。

速率与容量 ​

出口容量按同时活跃的负载估计。例如 150 Mbit/s 出口上,5 个持续下载各请求 30 Mbit/s,名义需求已经占满出口,还没有给协议开销、重传和其他业务留余量。20 个账号中只有一个活跃,与5个持续下载是完全不同的容量场景。

带宽声明、服务端限制和业务实际吞吐是三个量。先在目标网络测单用户上传、下载及长连接,再逐步增加并发,记录 CPU、出口、丢包、完成率和延迟。单次峰值与“账号数乘上限”的算式都不能单独证明稳定容量。

账号自动化与下发 ​

账号同步涉及两套服务端凭据和个人订阅,不能只更新其中一份。发布前先生成候选文件,用结构化 YAML 解析与目标内核检查,确认账号、节点名称、策略组引用和规则一致;配置检查通过后再对测试账号应用并验收。

订阅批量下发与回滚流程

一次可靠发布包含以下约束:

  1. 重复执行保留现有有效密码,仅在明确轮换时生成新凭据;候选文件变化才应用服务配置。
  2. 备份位于订阅目录之外的受限目录,保存准确文件清单;发布只允许个人订阅白名单,不使用 *.yaml 广泛复制。
  3. 服务配置和订阅各用目标实现验证。检查通过不等于运行正确,测试账号要实际完成认证、完整上传和兜底测试。
  4. 发布文件在同一文件系统内原子替换,并校验实际下载内容;多文件和多服务不是天然原子事务,阶段失败要有对应恢复点。

先用测试账号验证,再按小批次发布,最后确认客户端刷新并实际加载。HTTP 200 只说明下载得到响应,还需核对返回内容与运行配置。链接可保持不变,但 token 泄漏时必须撤销;密码泄漏处理见 用户管理。

历史部署使用过名为 hy2-sync 的自定义脚本,它不是 Hysteria2 或 Mihomo 官方命令。本页不分发该实现,不能直接执行这个名称。自行实现时应提供“生成候选、只读校验、应用指定账号、恢复指定批次”接口,并返回准确失败阶段;不要把只校验模式做成隐式改密或重启。

事故复盘 ​

事故现象根因处理与防范
订阅无法解析did not find expected key文本拼接破坏层级;不同合法缩进风格本身不构成错误结构化生成,发布前用每个目标内核检查每份文件;失败恢复该批次白名单
备份被发布服务端配置进入订阅目录通配符恢复把含凭据文件一并复制立即撤下并处理缓存,按可能泄漏轮换凭据;访问日志没有下载记录不能证明未泄漏
长连接留在兜底QUIC 恢复后业务仍走 TCP组选择恢复不迁移已有连接确认连接实际节点,按业务窗口关闭旧连接并验证应用重试;只在必要时重启服务
测试中连接中断复验结果反复变化并发写入或重启改变测试条件对发布使用互斥锁和版本校验,记录操作者与变更时间;日志检查不能代替互斥

客户端兼容性 ​

客户端内核是否支持 hysteria2说明
Mihomo,如 Clash Verge Rev 所用内核支持本页 YAML 以此为例,仍需核对实际版本
官方 Hysteria2、兼容的 sing-box支持使用各自配置格式,不能导入本页整份 YAML
原版 Clash、Clash Premium 等旧内核不支持该节点类型不能向它们统一下发本模板;GUI 名字不足以判断运行内核

下发前要确认所有使用者的客户端。不支持的客户端不是“少一个节点”,而是原本可用的订阅也加载不了。

验收清单 ​

  • 同一探针经 QUIC 通道和 TCP 通道各跑多轮,比较完成率和耗时分布。
  • 两端配置与实际算法选择一致,上传和下载分别测量;不以 tx 非零代替吞吐验收。
  • PROXY 组当前选中 HY2 节点;人为停止服务后能回落到兜底节点,恢复后新连接回到 HY2。
  • 已有连接中断后的应用行为符合预期,非幂等上传不会被盲目重复提交。
  • 订阅链接 HTTP 返回 200,且订阅目录里没有备份或服务端配置文件。
  • 未变化的候选配置不会重复重启,失败阶段可恢复,恢复不会重新启用泄漏凭据。

适用边界 ​

  • UDP 被限速或封禁的网络里,QUIC 通道不可用,只能依靠兜底通道,这时体验会回到原来的水平。
  • 性能数字只代表测试时的网络环境,换运营商、时段或地区后要重新用探针验证。
  • 多网卡、带宽协商和 UDP 防火墙分别验收;单网卡没有源地址问题时,不为照抄示例增加策略路由。
别急,先让缓存热一下。