Hysteria2 落地与订阅编排
跨境链路诊断说明了怎样验证上传停顿,而不是仅凭延迟选择协议。本页讨论通过对照实验后的一种部署:Hysteria2 承载适合 QUIC 的流量,保留 TCP 通道,并将账号与订阅变更作为一次可检查、可恢复的发布。普通流代理不能直接等同于 IP 层 TCP-over-TCP 隧道。
方案取舍
| 通道 | 核心约束 | 适合的判断条件 |
|---|---|---|
| Shadowsocks TCP | 加密流转发,缺失字节影响该 TCP 连接交付 | 客户端兼容、路径稳定,实际负载通过 |
| Shadowsocks + WebSocket/TLS | 多出插件、网关与路径配置;复用情况决定阻塞范围 | 需要与现有 HTTP 入口集成,能维护该组合 |
| Trojan + TLS | TCP 与证书,入口认证与目标 TLS 分开 | 需要简单的 TLS 代理路线,可复用本站部署示例 |
| Hysteria2 | QUIC/UDP、证书、认证与双方参数兼容 | UDP 可达,上传与长连接对照实测有收益 |
这里选择“QUIC 优先、TCP 兜底”,不是给所有网络规定同一个优先级。若单位网络限制 UDP,应保留可独立验证的 TCP 通道。客户端也不限于 Mihomo,官方客户端、sing-box 等兼容实现均可使用;本文订阅语法专用于 Mihomo,不能直接复制给其他内核。
几个关键机制
QUIC 对可靠流分别排序和交付,减少跨流字节排序等待,但流共享网络路径、连接级拥塞控制与资源。某个包丢失仍可影响连接整体发送,不能把“流独立”理解成完全隔离。
带宽声明会影响各方向是否选择 Brutal。未声明某方向时,该方向可使用端点配置的其他控制器;服务端 ignoreClientBandwidth 也会改变协商。Brutal 按目标速率模型发送并可补偿丢包,目标高于真实容量会浪费带宽并增加拥塞,不保证业务永远达到设定速率。
salamander 混淆改变报文形态,双方密码必须一致,但不保证不可识别或一定能通过网络策略。开启后服务端不再兼容标准 QUIC/HTTP/3。masquerade 可配置文件、字符串或反向代理;它与混淆不是同一个功能,不能承诺混淆开启后普通浏览器仍可直接访问伪装网站。
整体架构
应用流量进入 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.12ip 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,PROXYfallback 按候选顺序选可用节点,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 解析与目标内核检查,确认账号、节点名称、策略组引用和规则一致;配置检查通过后再对测试账号应用并验收。
一次可靠发布包含以下约束:
- 重复执行保留现有有效密码,仅在明确轮换时生成新凭据;候选文件变化才应用服务配置。
- 备份位于订阅目录之外的受限目录,保存准确文件清单;发布只允许个人订阅白名单,不使用
*.yaml广泛复制。 - 服务配置和订阅各用目标实现验证。检查通过不等于运行正确,测试账号要实际完成认证、完整上传和兜底测试。
- 发布文件在同一文件系统内原子替换,并校验实际下载内容;多文件和多服务不是天然原子事务,阶段失败要有对应恢复点。
先用测试账号验证,再按小批次发布,最后确认客户端刷新并实际加载。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 防火墙分别验收;单网卡没有源地址问题时,不为照抄示例增加策略路由。
