Skip to content

Instantly share code, notes, and snippets.

@wey-gu
Created August 19, 2026 09:45
Show Gist options
  • Select an option

  • Save wey-gu/94a864e3afb9f65a6865da8501667f29 to your computer and use it in GitHub Desktop.

Select an option

Save wey-gu/94a864e3afb9f65a6865da8501667f29 to your computer and use it in GitHub Desktop.
prompt-setup_rule-based_network_infra_for_ai_worker_in_prc.md
# 云服务器 + Hysteria2 + Mihomo + Sub-Store 网络方案 Agent 任务书
> 本文可以直接交给负责部署的 AI Agent。它适用于一台或多台 Linux 云服务器,
> 服务器可以来自 DMIT、Microsoft Azure、Google Cloud 或其他合适的 VPS
> 供应商。VXLink 和 Proxy-Cheap 都是可选商业服务;没有购买它们时,基础方案
> 仍应能够独立工作。
## 任务目标
你是一名负责 Linux、Hysteria2、Mihomo 和 Sub-Store 的运维 Agent。请帮助我
设计并部署一套集中维护、可以验证、可以回滚的个人或团队网络访问方案。DMIT
是常用选择,但不是架构上的硬性依赖。
不要假设我熟悉 VPS、端口、TLS、SOCKS5、订阅或代理组。每进入一个阶段前,
先用简单语言解释将要做什么、为什么需要、可能产生什么费用或中断,再征得
相应授权。
请遵守服务器供应商、网络服务供应商和当地法律的服务条款。不要将本方案用于
未经授权访问、隐藏违法活动或攻击第三方系统。
## 首先理解各个层次
这些组件不是同一种东西,也不能相互替代。
| 组件 | 类型 | 在系统中的职责 | 是否必需 |
| --- | --- | --- | --- |
| 云服务器 | DMIT、Azure、GCP 等商业 IaaS/VPS | 提供运行 Hy2 服务端的 Linux VM 和公网出口 | 是,可任选合适供应商 |
| Hysteria2 / Hy2 | 开源协议及实现 | 加密客户端到服务器的 UDP/QUIC 连接 | 是 |
| VXLink | 商业转发服务 | 在客户端与所选云服务器之间增加可选 UDP 入口 | 否 |
| Proxy-Cheap | 商业代理 IP 服务 | 为所选云服务器提供可选的其他地区出口 IP | 否 |
| Sub-Store | 开源订阅管理项目 | 集中维护节点并生成客户端订阅 | 推荐集中部署一套 |
| Mihomo | Clash 配置生态的开源规则代理内核 | 在用户设备上读取 profile、匹配规则并选择节点 | 使用完整 Mihomo profile 时需要 |
Sub-Store 不转发业务流量。它只生成配置。用户实际访问网站时,不会经过
Sub-Store。
Mihomo 通常位于用户侧。它可能运行在电脑、Android 设备或 OpenWrt 路由器上,
而不是运行在 Hy2 云服务器上。iPhone 上的 Shadowrocket 等客户端不一定使用
Mihomo 内核,但可以消费 Sub-Store 生成的相应节点订阅。
## 流量路径
### 最小可用方案
```text
应用
-> 用户设备上的 Mihomo 或兼容客户端
-> Hysteria2
-> 云服务器
-> Internet
```
这是第一阶段必须先完成的方案。它不依赖 VXLink 或 Proxy-Cheap。
### 增加 Proxy-Cheap 出口
```text
应用 -> Mihomo/兼容客户端 -> Hysteria2 -> 云服务器
-> Proxy-Cheap SOCKS5 -> Internet
```
此时客户端仍然连接云服务器上的 Hy2。Proxy-Cheap 位于服务端后面,只改变
最终出口 IP。它不改善客户端连接云服务器的线路。
### 增加 VXLink 入口
```text
应用 -> Mihomo/兼容客户端 -> VXLink UDP 入口
-> 云服务器的 Hy2 UDP 端口 -> Internet
```
VXLink 只转发入口流量,不提供 Hy2 的认证、TLS 或最终出口。
### 同时使用两项可选服务
```text
客户端
-> Mihomo 或兼容客户端
-> VXLink UDP 入口
-> 云服务器上的 Hysteria2
-> Proxy-Cheap SOCKS5
-> Internet
```
配置分发与业务流量是两条不同路径:
```text
配置路径:Sub-Store -> Mihomo profile -> 用户设备上的 Mihomo
流量路径:用户应用 -> Mihomo -> 选中的 Hy2 节点 -> 云服务器 -> Internet
```
排障和设计时必须区分三个地址:
1. **入口 IP**:客户端直接连接的云服务器 IP 或 VXLink IP。
2. **Hy2 后端 IP**:实际运行 Hysteria2 服务端的云服务器 IP。
3. **最终出口 IP**:目标网站看到的云服务器 direct IP 或 Proxy-Cheap IP。
VXLink 只替换第一项,Proxy-Cheap 只替换第三项。二者不能相互替代。
## 设计原则和已知限制
### 为什么不让所有流量都走 cheap
cheap 出口是用途受控的补充出口,不应成为所有业务的默认承载路径,原因包括:
- 套餐可能限制并发连接数、带宽、月流量、单连接时长或允许的协议。
- SOCKS5 可用于 TCP 不代表支持 `UDP ASSOCIATE`;即使支持,也可能有较小的 UDP
会话额度或动态中继端口限制。
- 云服务器到 cheap 出口多了一跳,延迟、抖动和故障概率都会增加。
- 共享、轮换或信誉不稳定的出口 IP 可能触发登录、支付和反滥用风控。
- 自动测速组可能在会话中途更换出口,导致账号地区变化或长连接中断。
视频会议、语音通话、远程桌面和在线游戏通常依赖低抖动 UDP、较多并发流、
STUN/TURN 或长连接。除非 cheap 供应商明确支持这些能力并通过目标网络实测,
否则这类流量应进入单独的 `REALTIME` 组,默认选择稳定 direct 节点。视频点播
虽然对实时延迟不那么敏感,但会持续消耗带宽和流量,应放在单独的 `VIDEO` 组。
AI 服务可以按成本需求进入 `CHEAP`,但也要保留手动切换到稳定节点的选项。
支付、账单和金融服务必须进入 `PAYMENT` 组,默认固定到地区一致、长期稳定且
信誉良好的专用出口。不要把 `PAYMENT` 默认指向会自动轮换的 `CHEAP-AUTO`;
如必须使用购买的代理,应固定选择一个已验证的静态出口,不在交易过程中切换。
### VXLink 能解决什么,不能解决什么
当客户端到云服务器公网 IP 的路径被干扰、路由很差或无法直连,而 VXLink 入口
仍能访问该云服务器时,VXLink 提供一条替代入口。目标网站仍然看到 Hy2 后端的
direct 出口或其后面的 cheap 出口;VXLink 不会自动改变最终出口 IP,也不能解决
目标网站封禁最终出口、后端 VM 停机、云账号被暂停或后端防火墙错误等问题。
本文的成熟部署可以租用一台固定的 VXLink 枢纽服务器,在同一个稳定入口上管理
多条 Link,并获得较明确的容量和入口地址。普通用户更可能购买固定端口转发:
- 一条规则通常对应一个入口端口、一个协议和一个后端地址。
- TCP 和 UDP 可能需要分别购买或创建规则;Hy2 必须有 UDP。
- 套餐可能限制端口数、并发连接/流、带宽、流量和可修改后端的次数。
- 后端 IP 改变后通常必须更新规则;固定转发本身不是自动故障转移。
- 固定转发不能可靠承载使用动态 UDP relay 端口的通用 SOCKS5 服务。
- 固定枢纽也是单独的故障域,需要监控容量、流量、续费和入口可达性。
购买前应让供应商明确说明限制,而不是把网页上的“支持 TCP/UDP”理解为无限
连接、无限带宽或任意协议都能透明转发。
### 多故障域高可用
高可用不是简单复制更多同类节点。设计时至少区分客户端、配置管理、入口转发、
Hy2 后端、云供应商/区域、cheap 出口供应商和规则上游这些故障域:
- 至少准备两个不同云供应商或不同区域的 direct Hy2 节点,例如 DMIT 与
Azure/GCP,或新加坡与日本;避免所有后端依赖同一账号和同一机房。
- 对关键后端同时保留 direct 地址和可选 VXLink 地址;需要更高入口可用性时使用
两个独立枢纽/入口,而不是只为同一枢纽创建更多端口。
- cheap 出口应准备两个供应商或地区,并独立验证 TCP、UDP、并发和目标网站;
不能因为入口不同就把同一个 cheap 供应商误算为多出口容灾。
- `url-test` 适合按延迟选择一般网页节点;`fallback` 适合有顺序的健康故障转移。
`REALTIME` 和 `PAYMENT` 应优先稳定、固定选择,避免会话中途频繁切换。
- Sub-Store 是配置管理面,不在业务流量路径中。客户端应缓存最后一份有效配置,
Sub-Store 暂时不可用不应立即中断现有流量。
- 健康检查 URL 成功只证明某个测试目标可达,不能证明 UDP、并发额度、会议质量
或支付网站接受该出口。应为这些能力分别建立合成测试和告警。
## 官方参考资料
执行前优先阅读官方资料,不要依赖年代不明的博客配置。
### DMIT
- 官网:https://www.dmit.io/
- 官方文档:https://docs.dmit.io/
- 价格:https://www.dmit.io/pages/pricing?language=english
- Acceptable Use Policy:https://www.dmit.io/pages/aup
DMIT 是服务器供应商。选购时重点比较机房、线路、月流量、端口速率、IPv4
费用、换 IP 政策和服务条款。Hy2 通常不需要很多 CPU;UDP 稳定性、线路质量
和流量额度更重要。
### Microsoft Azure 与 Google Cloud
除 DMIT 外,也可以在 Azure 或 Google Cloud 租用 Linux VM。例如可选择新加坡
或日本区域,作为单独节点或跨供应商容灾节点。
- Azure VM 区域列表:
https://learn.microsoft.com/en-us/azure/reliability/regions-list
- Azure Linux VM 文档:
https://learn.microsoft.com/en-us/azure/virtual-machines/linux/
- Google Compute Engine 区域与可用区:
https://cloud.google.com/compute/docs/regions-zones
- Google Compute Engine VM 文档:
https://cloud.google.com/compute/docs/instances
常见区域标识包括:
| 云平台 | 新加坡 | 日本 |
| --- | --- | --- |
| Azure | `southeastasia` | `japaneast`,也可评估 `japanwest` |
| Google Cloud | `asia-southeast1` | 东京 `asia-northeast1`,大阪 `asia-northeast2` |
区域名称不代表从用户网络访问一定更快。创建前应从目标网络实测延迟、UDP 丢包
和路由。Azure/GCP 还要分别检查:
- VM 价格、磁盘价格和公网 IPv4 费用。
- 出站流量单价及免费额度。
- 临时公网 IP 与静态公网 IP 的生命周期。
- Azure NSG 或 Google Cloud VPC firewall 是否开放 Hy2 UDP。
- Linux 主机防火墙是否同步开放该端口。
- 账号配额、区域容量及服务条款。
- 删除 VM 时公网 IP、磁盘和快照是否继续计费。
如果用户已经登录并授权 Azure CLI 或 Google Cloud CLI,Agent 可以帮助盘点和
部署;创建付费资源、调整预算或删除资源仍需明确授权。
### Hysteria2
- 官网及文档:https://v2.hysteria.network/
- 服务端入门:https://v2.hysteria.network/docs/getting-started/Server/
- 客户端入门:https://v2.hysteria.network/docs/getting-started/Client/
- 完整服务端配置:https://v2.hysteria.network/docs/advanced/Full-Server-Config/
- ACL:https://v2.hysteria.network/docs/advanced/ACL/
- URI 分享格式:https://v2.hysteria.network/docs/developers/URI-Scheme/
- GitHub:https://github.com/apernet/hysteria
Hysteria2 官方服务端支持 `direct`、`socks5` 和 `http` 出站。必须以实际安装
版本的官方文档为准,并在部署前运行配置检查。
### VXLink
- 官网:https://www.vx.link/
- 控制台:https://vx.link/dashboard
本方案使用 VXLink 的 Link TCP/UDP 端口转发能力。具体节点、入口地区、流量
和价格可能变化,应以购买当日控制台和客服说明为准。Hysteria2 基于 UDP,
因此对应 Link 必须支持并启用 UDP 转发。固定枢纽服务器与普通固定端口转发套餐
在端口数、并发、流量、可修改后端能力和故障域上可能不同,Agent 必须按实际
订单逐项记录,不能把本文部署所用的固定枢纽能力假设为所有账户默认拥有。
### Proxy-Cheap
- 官网:https://www.proxy-cheap.com/
- 价格入口:https://www.proxy-cheap.com/pricing/static-residential-proxies
- 官方帮助中心:https://support.proxy-cheap.com/hc/en-us
- HTTP/SOCKS5 切换说明:
https://support.proxy-cheap.com/hc/en-us/articles/24651208638365-How-to-change-proxy-protocol
Proxy-Cheap 是一个专有产品名称。本文节点名中的 `cheap` 是“低成本或特殊
地区出口”的分类标签,不代表任何产品都便宜,也不代表它一定支持 SOCKS5。
官方资料显示,不同产品协议能力不同。例如部分 rotating residential 产品只
支持 HTTP,不能默认用于本方案。并发连接、UDP、带宽、会话时长、IP 是否共享
或轮换等限制必须以具体订单和实测为准。
### Sub-Store
- Sub-Store GitHub:https://github.com/sub-store-org/Sub-Store
- Sub-Store 配置说明:
https://github.com/sub-store-org/Sub-Store/blob/master/config/README.md
- Sub-Store Releases:https://github.com/sub-store-org/Sub-Store/releases
Sub-Store 是开源订阅管理项目,不是线路、客户端或代理供应商。它可以生成
Mihomo/OpenClash 使用的完整 profile,也可以为其他兼容客户端生成节点订阅。
### Mihomo:原 Clash.Meta 内核
- Mihomo GitHub:https://github.com/MetaCubeX/mihomo
- 官方文档:https://wiki.metacubex.one/
- 配置说明:https://wiki.metacubex.one/en/config/
- rule-providers:
https://wiki.metacubex.one/en/config/rule-providers/
Mihomo 是规则代理内核,早期通常称为 **Clash.Meta**,属于 Clash 配置和 API
生态的延续实现。很多界面仍会出现 Clash、Clash Meta、Meta 或 Mihomo 等名称。
本文以当前项目名 `Mihomo` 为准。
Mihomo 本身主要是内核,不等于图形界面,也不等于订阅服务:
- Sub-Store 生成和发布配置。
- Mihomo 读取配置、处理 DNS、匹配规则、选择代理组和连接 Hy2 节点。
- OpenClash、Clash Verge 类应用或 Dashboard 提供安装、控制和可视化界面。
- Hysteria2 服务端运行在云服务器上,接收 Mihomo 发来的 Hy2 连接。
典型安装位置:
| 位置 | 常见形态 | 影响范围 |
| --- | --- | --- |
| OpenWrt 路由器 | OpenClash 管理 Mihomo 内核 | 可以透明处理整个局域网设备流量 |
| Windows/macOS/Linux 电脑 | Clash Verge 类前端搭配 Mihomo | 处理该电脑的系统代理或 TUN 流量 |
| Android | 支持 Mihomo/Clash Meta 的客户端 | 处理该手机的 VPN/TUN 流量 |
| iPhone/iPad | Shadowrocket 等独立客户端 | 通常不运行 Mihomo,但可导入兼容节点订阅 |
系统代理通常只接管遵循系统代理设置的应用;TUN 或路由器透明代理能够覆盖更广
的 TCP/UDP 流量,但需要额外处理 DNS、路由和回环问题。Agent 必须先确认用户
希望由路由器统一接管,还是由每台设备运行本地客户端。排障时不要同时叠加多层
TUN/透明代理,否则很难判断实际使用了哪个节点。
## 采购决策
不要立即购买全部组件。先列出方案、月费、流量额度、续费价格和退出成本,
再由用户决定。
| 方案 | 需要购买 | 适用情况 |
| --- | --- | --- |
| 基础版 | 1 台 DMIT/Azure/GCP/VPS | 只有一个 direct Hy2 出口 |
| 多出口版 | 云服务器 + Proxy-Cheap | 需要美国、新加坡等不同出口 |
| 转发版 | 云服务器 + VXLink | 云服务器直连不稳定或路由较差 |
| 完整版 | 云服务器 + Proxy-Cheap + VXLink | 同时需要替代入口和不同出口 |
| 高可用版 | 多区域或多供应商 VM | 需要跨机房、跨供应商容灾 |
Agent 可以帮助打开产品页、解释字段、比较套餐和计算成本,但未经用户明确确认,
不得下单、续费、充值或产生费用。支付、2FA 和最终购买确认应由用户完成。
### 购买云服务器前确认
- 目标用户到机房的实测延迟和丢包,而不只看机房名称。
- 月流量是单向计费还是双向计费。
- 端口速率是否共享或有公平使用限制。
- 是否包含 IPv4,以及换 IP 的条件和费用。
- 普通 Tier 1 与优化线路的差异。
- DMIT、Azure、GCP 等供应商之间的出口流量和公网 IPv4 成本差异。
- 操作系统、虚拟化和 UDP 服务是否受限制。
- 服务条款是否允许预期用途。
### 购买 VXLink 前确认
- 入口地区到客户端和后端云服务器的双向质量。
- 是否明确支持 UDP Link。
- 流量、带宽、连接数和端口数量限制。
- 购买的是共享固定端口转发,还是一台容量独立的固定枢纽服务器。
- 连接数指 TCP 连接、UDP flow、并发会话还是其他计费口径。
- 是否可以随时修改后端 IP 与端口。
- TCP 和 UDP 是否需要建立两条规则。
- 后端是否需要白名单。
- 是否提供健康检查、API、多个入口或自动故障转移;没有书面说明就按“不提供”设计。
- 超额计费、续费、故障和退款政策。
### 购买 Proxy-Cheap 前确认
- 产品是否明确支持 SOCKS5,而不只是 HTTP。
- SOCKS5 是否支持 UDP ASSOCIATE;不要仅根据“支持 SOCKS5”自行推断。
- 是固定 IP、粘性会话还是轮换地址。
- 支持用户名/密码认证还是 IP 白名单。
- 国家、城市和 ASN 是否满足需要。
- 上传与下载是否都计入流量。
- 并发、速率和连接时长限制。
- 是否允许会议、WebRTC、流媒体、自动化请求或所需目标网站。
- IP 不可用时能否更换。
- 目标网站是否接受该出口 IP。
建议先购买最小套餐或短周期套餐,完成真实测试后再扩容。
## 执行前向用户收集的信息
请逐项询问并解释用途:
- 云服务器供应商、订阅/项目、主机别名、公网 IP、系统、SSH 用户和端口。
- 用户本地 SSH 公钥;绝不要求上传私钥。
- 每台服务器所在地区和希望承担的角色。
- 当前已有服务、监听端口和防火墙规则。
- 希望使用的 Hy2 UDP 端口。
- TLS 域名和证书方案,或是否接受受控的自签名证书方案。
- 每个 Proxy-Cheap 地址、端口、用户名、密码和产品类型。
- 是否需要 VXLink;若需要,使用哪个项目、入口地区和套餐。
- Sub-Store 部署位置及允许的访问方式。
- 客户端类型:OpenClash、Mihomo、Clash Verge、Shadowrocket 等。
- 维护窗口和当前不能中断的连接。
不要在终端回显、日志或最终报告中打印完整密码、token、私钥和订阅密钥。
## 分阶段实施
### 阶段 1:只读盘点
在任何修改之前输出盘点表:
- 每台服务器的系统、CPU、内存、磁盘和公网地址。
- SSH 服务、现有端口、systemd 服务和容器。
- 主机防火墙及云防火墙状态。
- 是否已经安装 Hysteria2、Docker、Sub-Store 或其他代理服务。
- 现有配置和流量是否正在使用。
先提出端口和节点规划,得到用户确认后再写配置。
### 阶段 2:备份和 SSH 安全
这里的“SSH 免密”是指使用公钥认证,不是把服务器设置成无密码、无认证状态。
用户的私钥始终保存在自己的电脑上,服务器只保存对应公钥。
#### 2.1 确认初始登录方式
先确认云平台提供的是哪一种初始入口:
- 创建 VM 时注入的 SSH 公钥。
- 云控制台生成或下载的临时密钥。
- Azure CLI、Google Cloud CLI 或浏览器控制台 SSH。
- 服务商给出的初始用户名和密码。
记录云平台串行控制台、VNC、Rescue Mode 或 Web Console 等恢复入口。没有恢复
入口时,不要贸然修改 SSH、防火墙或网络配置。
#### 2.2 在用户电脑上准备专用密钥
先检查用户是否已有合适的 Ed25519 公钥:
```bash
find ~/.ssh -maxdepth 1 -name '*.pub' -print
```
如果没有,建议为这套服务器生成独立密钥:
```bash
ssh-keygen -t ed25519 -a 64 \
-f ~/.ssh/<PROJECT>-ed25519 \
-C '<USER>@<PROJECT>'
```
建议为私钥设置 passphrase,再由系统 Keychain 或 `ssh-agent` 缓存,从而兼顾
便利和私钥被复制后的安全性:
```bash
ssh-add ~/.ssh/<PROJECT>-ed25519
```
Agent 不得要求用户发送私钥内容。它只能读取用户明确指定的 `.pub` 公钥,或让
用户自行将公钥粘贴到云平台。
#### 2.3 把公钥安装到服务器
优先在创建 VM 时通过云平台的 SSH key/metadata 功能注入公钥。对于已经能够
登录的服务器,可以使用:
```bash
ssh-copy-id -i ~/.ssh/<PROJECT>-ed25519.pub \
-p <INITIAL_SSH_PORT> <SSH_USER>@<SERVER_IP>
```
如果服务器没有 `ssh-copy-id`,由 Agent 在已认证会话中将公钥追加到目标用户的
`~/.ssh/authorized_keys`,并校正权限:
```bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```
不要覆盖已有 `authorized_keys`,不要把公钥装到错误用户,也不要把私钥上传到
服务器。
如果服务商初始只提供 root,Agent 应先说明并征得同意,然后创建一个普通管理
用户,将其加入对应系统的 sudo/wheel 管理组,并只把用户公钥安装到这个账号。
必须验证该账号能够登录和执行必要的 `sudo` 操作,之后才讨论限制 root 远程
登录。创建用户和管理组的命令因 Debian/Ubuntu、RHEL 系列等发行版而异,必须
先识别系统,不能盲目复制命令。
#### 2.4 配置本地 SSH 别名
在用户电脑的 `~/.ssh/config` 中使用清晰别名:
```sshconfig
Host <SERVER_ALIAS>
HostName <SERVER_IP_OR_DOMAIN>
User <SSH_USER>
Port <SSH_PORT>
IdentityFile ~/.ssh/<PROJECT>-ed25519
IdentitiesOnly yes
ServerAliveInterval 30
ServerAliveCountMax 3
```
首次连接时核对主机指纹。公网 IP 被替换或系统重装后,不要直接忽略 host key
变化,应从云控制台或已可信通道重新核对指纹。
#### 2.5 用第二个会话验收
保持当前会话不要退出,在另一个终端执行:
```bash
ssh -vv <SERVER_ALIAS>
```
确认以下事项后才算通过:
- 登录明确使用了预期私钥。
- 无需输入服务器账号密码。
- 目标用户和主机正确。
- `sudo` 能按预期使用。
- 退出后可以再次建立新连接。
#### 2.6 可选 SSH 加固
只有密钥登录和恢复控制台都验证后,才向用户提出以下可选操作:
- 禁止 root 直接登录。
- 禁止 SSH 密码认证。
- 限制允许登录的用户。
- 按需更换 SSH 监听端口;这不是必需项,也不能替代密钥认证和防火墙。
- 在云防火墙和主机防火墙中同步调整 SSH TCP 规则。
任何 sshd 修改都先运行配置检查:
```bash
sudo sshd -t
```
优先 reload 而不是直接 restart,并保持旧会话直到新会话验证成功。修改 SSH
端口、防火墙、登录用户或认证方式前必须单独获得授权。
#### 2.7 备份与记录
- 备份所有将修改的 SSH 和防火墙配置。
- 记录初始登录方式、恢复控制台、SSH 别名和公钥指纹。
- 不记录私钥和明文密码。
- 不执行会让当前唯一连接立即断开的操作。
### 阶段 3:部署最小 direct Hy2
先只部署一个 direct 实例:
```text
客户端 -> SERVER:direct_port/udp -> 云服务器公网出口
```
要求:
- 固定明确的 Hysteria2 版本。
- 使用唯一 UDP 端口。
- 使用强随机认证密码。
- 正确配置 TLS、SNI 和证书验证策略。
- 配置文件仅允许 root 或服务用户读取。
- 使用独立 systemd unit 管理。
- 只开放需要的 SSH TCP 和 Hy2 UDP 端口。
- 从服务器外部运行真实 Hy2 客户端测试。
不要用“进程 active”或“端口打开”代替真实代理测试。
### 阶段 4:增加 Proxy-Cheap 出口
为每个 cheap 出口建立独立 Hy2 监听和服务实例。例如:
| 监听用途 | 示例后端端口 | 出口 |
| --- | --- | --- |
| direct | `<HY2_DIRECT_UDP_PORT>` | 云服务器本机 |
| cheap-us | `<HY2_CHEAP_US_UDP_PORT>` | US SOCKS5 |
| cheap-sg | `<HY2_CHEAP_SG_UDP_PORT>` | SG SOCKS5 |
文档故意不提供实际端口号,以免不同用户机械复用同一套端口。Agent 应先使用
`ss -lntup` 等工具检查占用,再从合法的非特权端口范围中为每台服务器提出一组
互不冲突的随机候选端口。端口计划必须经用户确认,并同步到服务配置、云防火墙、
主机防火墙、VXLink 和客户端节点。随机端口不能代替认证、TLS 和防火墙安全。
Hysteria2 服务端通过官方 `outbounds` 配置连接 SOCKS5。可以为每个出口运行独立
实例,或者使用经过验证的 ACL 选择出站。优先采用故障隔离清晰、容易回滚的
方式。cheap 出口故障不能影响 direct 实例。
先单独验证上游 SOCKS5 的 TCP 出口:
```bash
curl --proxy 'socks5h://USER:PASSWORD@HOST:PORT' \
https://api.ipify.org
```
命令中的凭据要避免写入 shell history。实际执行时应通过安全输入、临时权限受限
文件或环境变量提供,并在用后清理。
`curl` 只证明 SOCKS5 TCP 可用。还必须通过 Hy2 cheap 节点测试 DNS、普通网页
和需要 UDP 的目标。上游不支持 UDP 时,应记录限制,不能报告为完整可用。
不要将所有规则默认指向 cheap。部署时至少保留 direct、cheap 和一条稳定回退
路径,并分别做并发、持续带宽、UDP、长连接和出口稳定性测试。会议、通话、
远程桌面等实时流量默认留在 direct 路径;支付流量固定到经过验证的稳定出口。
### 阶段 5:按需增加 VXLink
只有 direct 或 cheap Hy2 已经通过真实测试后,才创建 VXLink。对每个需要转发
的 Hy2 监听建立 UDP Link:
| 节点 | VXLink 入口 | 后端 |
| --- | --- | --- |
| `vx-site-direct` | `ENTRY_IP:ENTRY_PORT/udp` | `SERVER_IP:DIRECT_PORT/udp` |
| `vx-site-cheap-us` | `ENTRY_IP:ENTRY_PORT/udp` | `SERVER_IP:CHEAP_US_PORT/udp` |
对应的 direct 与 VXLink 节点使用相同 Hy2 认证、SNI 和 TLS 参数,客户端连接
地址和端口不同。
一条 VXLink 规则只代表一个替代入口,不代表后端高可用。若要容忍后端或云供应商
故障,应把入口分别指向不同供应商/区域的 Hy2 后端,并把每条路径作为独立节点
发布。固定枢纽套餐也要保留 direct 回退;普通固定转发套餐则额外记录连接数、
端口数和流量上限。
不要把 VXLink 直接映射到 Proxy-Cheap SOCKS5 并将其发布成普通 SOCKS5 节点。
SOCKS5 UDP relay 可能使用动态端口,固定 TCP/UDP 端口转发未必完整支持。
创建规则前展示入口、后端、协议、流量额度和费用。不得删除或覆盖已有 Link,
除非用户明确授权。
### 阶段 6:部署 Sub-Store
在一台稳定服务器上集中部署一套 Sub-Store。它可以与 Hy2 同机,但需要独立
目录、持久化和访问控制。
要求:
- 使用 Docker Compose。
- 固定镜像版本,不盲目使用浮动的 `latest`。
- 持久化数据和备份目录。
- 配置合理的自动重启策略。
- 使用强随机 backend path/token。
- 不将无认证管理 UI 暴露到公网。
- 优先通过 LAN、Tailscale 或带认证的 HTTPS 反向代理访问。
- 升级前备份,并先阅读 release notes。
至少生成:
1. 完整 Mihomo profile:供 OpenClash、Mihomo、Clash Verge 使用,包含节点、
代理组和规则。
2. 节点订阅:供 Shadowrocket 等客户端按其支持格式导入。
不要把节点订阅误认为完整分流 profile。
### 阶段 7:让用户真正消费 Sub-Store
部署完成不等于用户已经能使用。Agent 必须向用户演示从管理节点到客户端导入、
更新和排障的完整流程。
#### 7.1 先解释 Sub-Store 中的对象
不同版本界面名称可能略有变化,应以当前 UI 为准:
| 对象 | 作用 | 谁使用 |
| --- | --- | --- |
| Backend/API | 保存数据并执行转换 | Sub-Store 前端和生成链接 |
| Frontend/UI | 管理 Sub-Store 数据 | 管理员浏览器 |
| Subscription | 一个节点源,可以是手工节点或上游订阅 | Collection/File |
| Collection | 合并多个 Subscription,并过滤、重命名、排序 | Share 或 File |
| File | 一份完整配置,例如含节点、代理组和规则的 Mihomo YAML | OpenClash/Mihomo |
| Share | 将 Subscription、Collection 或 File 发布为带 token 的稳定 URL | 各类客户端 |
管理地址与订阅地址不是同一个东西:
```text
管理地址:管理员打开 UI,编辑节点和配置
分享地址:客户端定期下载,不提供管理能力
```
后端根地址打开后显示空白页、JSON 或 404,不一定表示服务损坏。有些部署只有
Backend,需要使用官方前端或自托管前端并指定 Backend URL。Agent 必须明确交付
“前端地址”“后端 API 地址”和“分享 URL”,而不是只给一个端口让用户猜。
#### 7.2 设计 Sub-Store 的访问范围
在部署前让用户选择:
| 方式 | 优点 | 限制 |
| --- | --- | --- |
| LAN 内访问 | 简单、暴露面小 | 外出设备不能更新 |
| Tailscale 内访问 | 远程安全访问,无需公开管理面 | 客户端更新时要连 Tailscale |
| HTTPS 公开分享 | 手机和外部客户端随时更新 | 必须保护管理面和分享 token |
推荐把管理 UI/API 限制在 LAN 或 Tailscale,只按需公开只读分享 URL。如果前后端
跨域,设置 `SUB_STORE_CORS_ALLOWED_ORIGINS` 为准确的前端 origin,包括协议、
域名和端口,但不包含路径。不要为了省事长期使用 `*`。
不要把 `sub.store` 当作项目拥有的公共服务域名。Sub-Store 官方仓库明确提示该
域名可能造成数据被发送到非项目控制的公共服务。应使用明确的自托管地址或官方
列出的前端,并核对 Backend URL。
#### 7.3 建立唯一节点源
在 UI 的 `Subscription` 页面创建一个本地节点源,例如 `<PROJECT>-nodes`:
1. 使用 `+` 新建本地 Subscription。
2. 逐个加入 direct、cheap 和可选 VXLink 节点。
3. 优先使用标准 `hysteria2://` URI 或 Mihomo-compatible proxy YAML。
4. 使用统一命名,避免同名节点。
5. 在保存前预览转换结果。
6. 每个节点从外部真实测试后才标记为可用。
如果节点来自其他上游订阅,应把上游 URL 作为单独 Subscription,不要把生成后的
结果反向覆盖原始数据。手工节点和第三方订阅应分开,便于定位来源和撤销。
#### 7.4 使用 Collection 管理节点集合
按用途建立 Collection,例如:
- `<PROJECT>-all`:所有已验证节点。
- `<PROJECT>-direct`:只包含 direct 出口。
- `<PROJECT>-cheap`:只包含 cheap 出口。
- `<PROJECT>-mobile`:只包含移动端确认支持的协议和字段。
在 Collection 中进行过滤、排序、重命名和属性修正。过滤规则必须先预览,防止
拼写差异导致节点被错误遗漏。不要仅凭含糊的 `cheap` 子串分类而不检查结果。
#### 7.5 生成完整 Mihomo File
在 `File` 页面建立一份完整 Mihomo 配置,例如 `<PROJECT>-mihomo`。它至少包含:
- 从已验证 Collection 注入的 `proxies`。
- `PROXY`、`AUTO`、`CHEAP`、`AI`、`VIDEO`、`SOCIAL`、`TESTSPEED` 等组。
- DNS 和 TUN/透明代理所需设置。
- 远程 `rule-providers`。
- 有明确顺序的 `rules`。
生成后下载到隔离环境执行:
```bash
mihomo -t -f <DOWNLOADED_PROFILE.yaml>
```
检查 YAML、节点名、代理组引用和 rule providers。验证通过前,不要覆盖用户当前
OpenClash 或电脑上的工作配置。
#### 7.6 创建 Share URL
在 UI 中对目标 Subscription、Collection 或 File 点击 Share/分享,选择目标格式,
由 Sub-Store 生成 URL。不要手工猜测或拼接 API 路径,因为不同部署和版本的路径、
token 参数可能不同。
至少交付两条用途不同的分享:
| 分享 | 内容 | 目标客户端 |
| --- | --- | --- |
| Mihomo 完整 profile | 节点、组、DNS、规则、rule providers | OpenClash、Mihomo、Clash Verge 类客户端 |
| 节点订阅 | Collection 转换后的节点,不承诺携带完整规则 | Shadowrocket 等独立客户端 |
Share token 等同凭据:
- 不放进公开仓库、截图或聊天记录。
- 为不同人员或设备使用不同分享时,优先生成可单独撤销的 URL。
- 泄漏后立即轮换 token。
- 最终报告只显示脱敏 URL。
#### 7.7 在 OpenClash 中消费
1. 确认 OpenClash 当前内核支持 profile 中使用的 Hy2 和 Mihomo 字段。
2. 进入 OpenClash 的配置订阅/配置文件订阅页面。
3. 新增订阅并粘贴 **Mihomo 完整 profile Share URL**。
4. 先执行下载或配置检查,不要立即设为正在运行的配置。
5. 检查节点数、代理组、规则和 rule providers 是否完整。
6. 在维护窗口内由用户手动切换并观察日志。
7. 保留上一份可工作配置和回滚入口。
OpenClash 所在路由器必须能访问分享 URL。如果 URL 只在 Tailscale 中可达,路由器
本身也需要可达该 tailnet;浏览器能打开不代表路由器能下载。
#### 7.8 在 Clash Verge 类桌面客户端中消费
1. 打开 Profiles/配置页面。
2. 以 URL 新建 Remote Profile。
3. 粘贴 **Mihomo 完整 profile Share URL**。
4. 手动更新并检查是否出现预期代理组。
5. 激活前先运行客户端提供的配置检查。
6. 根据需求只启用系统代理,或经授权启用 TUN。
7. 设置合理的自动更新时间,不要频繁请求 Sub-Store。
如果桌面设备已经通过 OpenWrt/OpenClash 透明代理,再启用本地 TUN 可能形成嵌套
路径。排障时一次只启用一层,并记录实际出口 IP。
#### 7.9 在独立 Mihomo 中消费
独立 Mihomo 没有统一图形界面。Agent 应建立安全更新脚本:下载到临时文件,执行
`mihomo -t`,验证成功后原子替换正式配置,再 reload 服务。下载失败或检查失败时
继续使用旧配置,不能留下空文件。
不得把带 token 的 URL直接写进公开日志。定时器应有超时、失败日志和合理更新
间隔。
#### 7.10 在 Shadowrocket/iOS 中消费
Shadowrocket 通常不使用 Mihomo 完整配置,因此不要直接给它 Mihomo File URL。
在 Sub-Store 中分享 Subscription 或 Collection,并把目标格式选择为
`Shadowrocket`:
1. 在 Sub-Store 预览 Shadowrocket 输出,确认 Hy2 节点字段完整。
2. 复制生成的节点订阅 Share URL。
3. 在 Shadowrocket 的订阅/配置入口添加 URL。
4. 手动更新并逐个测试 direct、cheap 和 VXLink 节点。
5. Shadowrocket 的本地规则和分组需要按该客户端能力单独维护;节点订阅不会自动
继承 Mihomo File 中全部代理组和 rule providers。
#### 7.11 Android 和其他客户端
- 使用 Mihomo 内核且支持完整远程 profile 的客户端,可尝试完整 Mihomo File。
- 仅支持节点订阅的客户端,应从 Collection 分享到对应 target 格式。
- 客户端声称支持 Hy2 不代表支持全部扩展字段;必须预览转换并实测。
- 不要把一个客户端导出的非标准 URI 再当作系统的唯一源数据。
#### 7.12 更新机制
明确区分三种更新:
1. **节点源更新**:Sub-Store 重新读取 Subscription。
2. **客户端 profile 更新**:OpenClash/桌面/手机重新下载 Share URL。
3. **规则集更新**:Mihomo 按 `rule-providers.interval` 下载规则。
Sub-Store 中编辑节点后,客户端不会凭空立即变化。需要确认 Share 输出已更新,
然后由客户端手动或定时拉取。rule providers 的更新也不要求重新生成全部节点,
但客户端必须能够访问规则 URL。
#### 7.13 消费端验收
每种实际使用的客户端至少验证:
- 分享 URL 返回成功且内容不是空白 HTML。
- Content-Type 和正文格式符合客户端预期。
- 节点数量、名称和类型正确。
- 完整 profile 中代理组和规则可见。
- direct 节点出口是对应云服务器 IP。
- cheap 节点出口是对应代理服务 IP。
- 手动更新一次成功。
- 自动更新失败时仍保留上一份工作配置。
- Share token 轮换后旧 URL 确实失效。
如果浏览器显示白屏,Agent 应分别使用 `curl -I` 和 `curl` 检查状态码、重定向、
Content-Type 和响应正文,并判断访问的是管理前端、Backend 根地址还是 Share URL,
不能仅凭浏览器页面判断服务状态。
## 节点命名和分类
使用统一名称,不使用容易误匹配的拼写:
```text
{region}-{server}-direct
{region}-{server}-cheap-us
{region}-{server}-cheap-sg
vx-{region}-{server}-direct
vx-{region}-{server}-cheap-us
vx-{region}-{server}-cheap-sg
```
每个名称必须唯一。每个节点应有明确元数据或可验证的命名规则,确保它只进入
正确的 direct 或 cheap 分组。
## Mihomo 代理组和规则
完整 profile 至少包含:
| 组名 | 用途 |
| --- | --- |
| `PROXY` | 手动选择主要出口 |
| `AUTO` | 对可用 direct 节点进行 URL test |
| `CHEAP` | 手动选择 cheap 出口 |
| `CHEAP-AUTO` | 对可用 cheap 节点进行 URL test |
| `AI` | AI 服务,可选择 `CHEAP` 或稳定节点 |
| `REALTIME` | 会议、通话、远程桌面等实时流量,默认稳定 direct 节点 |
| `PAYMENT` | 支付、账单和金融服务,固定选择地区一致的稳定出口 |
| `VIDEO` | 视频流量,可在 `PROXY`、`CHEAP`、`DIRECT` 间选择 |
| `SOCIAL` | 社交媒体流量,允许单独选择 |
| `TESTSPEED` | 测速流量,避免消耗错误出口 |
| `GLOBAL` | 诊断和临时全局选择 |
使用仍在维护、格式适配 Mihomo 的 rule providers。记录仓库、具体 URL、格式、
更新时间和故障回退方式。不要只写“使用最新规则”而没有来源。
### 建议的规则上游
以下来源于 2026-08-18 做过可达性和仓库活跃度核对。它们是社区项目,不构成
永久可用承诺;Agent 在部署当日仍须检查最近提交、Release/Action 是否成功、
许可证、目标文件 HTTP 状态和 Mihomo 解析结果。
| 用途 | 首选上游 | 推荐产物 | 说明 |
| --- | --- | --- | --- |
| 基础域名分类 | `v2fly/domain-list-community` | 由下游编译为 MRS | 社区维护的原始 geosite 域名数据,不替用户决定策略 |
| Mihomo 基础/细分规则 | `MetaCubeX/meta-rules-dat` 的 `meta` 分支 | `geo/geosite/*.mrs` | Mihomo 原生 MRS,可用于 AI、社交、支付及基础分类 |
| 聚合媒体与测速 | `DustinWin/ruleset_geodata` | Release `mihomo-ruleset/*.mrs` | `media.mrs`、`networktest.mrs` 聚合多个公开来源 |
| 服务专项补充 | `blackmatrix7/ios_rule_script` | Clash YAML/list | 适合 LinkedIn、Teams、GlobalMedia、Speedtest 等补漏;需匹配格式 |
建议使用的具体集合:
- `AI`:MetaCubeX `category-ai-!cn.mrs`,必要时与 DustinWin `ai.mrs` 对照,避免
一个来源异常或漏项时无从判断。
- `SOCIAL`:MetaCubeX `category-social-media-!cn.mrs`;另用 blackmatrix7 的
`LinkedIn` Clash 规则检查 LinkedIn 是否确实包含,防止被国内站点重定向。
- `VIDEO`:DustinWin Release 的 `media.mrs`;若需要 Netflix、YouTube、Disney
等单独手选,应分别建立 provider 和组,不要只用一个大媒体集合。
- `TESTSPEED`:DustinWin Release 的 `networktest.mrs`,其说明列出
`category-speedtest`、Speedtest 等上游。
- `PAYMENT`:MetaCubeX 的 `stripe.mrs`、`paypal.mrs`、`wise.mrs`。支付域名会
变化,Agent 应保留一个受版本控制的本地补充 provider,并通过连接日志核对漏项。
- `REALTIME`:MetaCubeX 的 `zoom.mrs`、`webex.mrs`,以及 blackmatrix7 的
`Teams` 规则。Google Meet 等没有合适独立集合的服务应经抓包确认后加入本地
补充 provider,不能为了省事把全部 Google/Microsoft 流量都归入会议组。
- 基线:使用同一受控上游的 `private`、`cn`、`geolocation-!cn` 等集合,避免
域名分类来源互相覆盖时无法追踪。
参考地址:
- https://github.com/v2fly/domain-list-community
- https://github.com/MetaCubeX/meta-rules-dat/tree/meta/geo/geosite
- https://github.com/DustinWin/ruleset_geodata/releases/tag/mihomo-ruleset
- https://github.com/blackmatrix7/ios_rule_script/tree/master/rule/Clash
当前可用的下载地址遵循以下形式,`<NAME>` 只应替换为上文已经核对的集合名:
```text
MetaCubeX MRS:
https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/<NAME>.mrs
DustinWin MRS:
https://github.com/DustinWin/ruleset_geodata/releases/download/mihomo-ruleset/<NAME>.mrs
blackmatrix7 Clash YAML:
https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/<NAME>/<NAME>.yaml
```
不要自行猜测文件名。部署前对每个最终 URL 检查 HTTP 200、非 HTML 内容和实际
Mihomo 解析结果,并将最终 URL 固化在交付清单中。
### 规则更新链路
必须向用户说明更新发生在不同层:
```text
社区原始仓库
-> 上游项目的构建/Release 产物
-> Mihomo rule-provider 按 interval 下载并缓存
-> rules 按顺序把命中的流量送入可手选的策略组
```
Sub-Store File 通常只保存 `rule-providers` 的 URL 和分流结构,不需要把每个远程
规则正文复制进节点订阅。客户端必须能够访问这些 URL。Mihomo 应缓存最后一次
成功下载的规则;下载失败时保留旧缓存并告警,不能用空规则覆盖。建议:
- `interval` 从 24 小时开始,避免所有客户端高频请求上游。
- 记录 provider 名、仓库、分支或 Release、URL、`behavior`、`format`、最近成功
下载时间、文件大小或哈希以及连续失败次数。
- `.mrs` 域名规则使用 `behavior: domain`、`format: mrs`;IP 规则使用
`behavior: ipcidr`。含混合 Clash 规则类型的 YAML 通常使用 `behavior: classical`,
不能只改扩展名或把不同格式混用。
- 更新前在隔离环境下载并让目标 Mihomo 版本解析;检查文件非空、规则数没有异常
暴增/骤减,再允许客户端定时更新。
- 对 GitHub Raw/Release 准备可信镜像或上一版本本地副本,但不要静默切到来源不明
的第三方镜像。
- 每月抽查 AI、LinkedIn、Stripe/PayPal、会议、视频和测速测试域名的实际命中组;
规则项目“活跃”不等于恰好覆盖用户需要的全部域名。
建议顺序:
1. 网络测速 -> `TESTSPEED`
2. 实时会议/通话 -> `REALTIME`
3. 支付与账单 -> `PAYMENT`
4. AI 服务 -> `AI`
5. 社交媒体 -> `SOCIAL`
6. 视频媒体 -> `VIDEO`
7. 私有网络 -> `DIRECT`
8. 中国大陆域名和 IP -> `DIRECT`
9. 非中国大陆域名 -> `PROXY`
10. `MATCH` -> `PROXY`
专项规则必须放在宽泛的中国大陆或非中国大陆规则之前。检查 AI 规则是否覆盖
当前主流服务,社交规则是否包含 LinkedIn 等容易发生地区跳转的服务。支付、
实时会议和账号登录需要“稳定优先”,不能只依据 URL test 延迟最低来选出口。
## 验证标准
每一层单独验证,并输出表格:
- SSH 修改前后都能建立新的密钥连接。
- 所有 Hy2 systemd 实例处于 active。
- 对应 UDP 端口真实监听。
- 主机防火墙和云防火墙均允许对应 UDP。
- direct 节点从外部真实连接成功,出口 IP 是对应云服务器 IP。
- cheap 节点从外部真实连接成功,出口 IP 是购买的代理 IP。
- VXLink 节点连接成功,出口与对应非 VX 节点一致。
- cheap 代理停止工作时,direct 节点仍能使用。
- Mihomo profile 通过配置语法检查。
- YAML 没有重复节点名、缺失代理组或无效引用。
- 所有 rule providers 可以下载并解析。
- AI、REALTIME、PAYMENT、VIDEO、SOCIAL、TESTSPEED 测试域名命中预期组。
- Sub-Store 订阅能被目标客户端实际下载。
测试表至少包含:
| 节点 | 入口 | Hy2 后端 | 出口 | TCP | UDP | 延迟 | 结果 |
| --- | --- | --- | --- | --- | --- | --- | --- |
不要自动重载或重启用户的 OpenClash、路由器或正在承载当前连接的客户端。生成
订阅后,把订阅地址和导入说明交给用户,由用户决定维护窗口。
## 回滚和变更边界
以下操作必须单独获得明确授权:
- 购买、续费、充值或升级套餐。
- 修改 SSH 端口或认证方式。
- 修改防火墙默认策略。
- 重启服务器、网络服务、Docker 或路由器。
- 删除已有节点、VXLink 规则、服务或订阅。
- 将 Sub-Store 或其他管理界面暴露到公网。
- 自动重载 OpenClash/Mihomo 当前配置。
每次写入前备份。每个阶段结束后验证,再进入下一阶段。失败时停止扩大变更范围,
恢复上一份可工作的配置。
## 最终交付
完成后提供一份不含敏感信息的报告:
- 架构图和实际流量路径。
- 服务器、地区和端口用途表。
- direct、cheap、VXLink 节点矩阵。
- 软件版本和服务状态。
- 防火墙开放项。
- 每个节点的真实出口 IP、TCP、UDP 和延迟测试。
- Sub-Store 的受保护管理入口。
- Mihomo 完整订阅地址的脱敏表示。
- Shadowrocket 等客户端的订阅方式。
- rule provider 来源及更新时间。
- 当前限制、费用和未解决问题。
- 完整回滚步骤。
最终报告不得包含完整密码、token、私钥、Proxy-Cheap 凭据或订阅密钥。
## Agent 的第一条回复应包含什么
收到本任务书后,先不要直接安装或购买。第一条回复应当:
1. 用不超过十句话复述云服务器、Hy2、Mihomo、Sub-Store 及两个可选商业服务
在架构中的位置。
2. 说明最小可用方案和所有可选组件。
3. 列出需要用户提供的信息,但不索取私钥。
4. 给出只读盘点命令和预计不会产生中断的检查范围。
5. 等待用户授权只读盘点。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment