---
name: selfhost-vpn
description: >-
  在用户自己租的一台 VPS 上，端到端部署个人自用的 VLESS+REALITY 翻墙节点（sing-box）：
  选机器与地区、选 dest/SNI、开服与安全加固、出客户端链接、验证与排障。
  范围是个人自建单机跨境代理；不覆盖商业机场、多节点、订阅系统。
---

# selfhost-vpn — 个人一机自建翻墙节点

**这是入口文档。** 把一台裸 VPS 变成一个能跨 GFW 的个人节点：除了「注册账号 + 租机器 + 付款」必须用户
自己做，其余(选机房、定参数、开服、发客户端、排障)全部由你(agent)照本文档完成。

> **agent 能力要求（硬性，缺一即停）**：① 能读网页取文档；② 能执行 shell 命令并由此 SSH 登录用户的 VPS
> （shell 跑在哪台机器上不限，能连到该 VPS 即可）。不满足就停下，请用户换一个满足条件的 agent。
> 本文档的所有关卡（IP 门、dest 硬门、`sing-box check`、原子替换与回滚）都按 agent 自己跑命令、自己判读
> 输出编写；转述模式还会让用户把含私钥或完整分享链接的输出贴回聊天窗口，违反本文档的凭据规则。
> **执行方式**：读文档 → 生成命令 → 向用户说明这一步做什么 → 经 SSH 执行。

## 文档地图（按需读取）

| 文档 | 什么时候读 |
|---|---|
| **本文（SKILL.md）** | 先读完。全流程、决策规则、边界。 |
| [references/provisioning.md](references/provisioning.md) | **开服时**。装 sing-box、写配置、权限、systemd 加固、原子替换与回滚，12 步全流程。 |
| [references/checks.md](references/checks.md) | **检查时**。IP 洁净门、dest 硬门、候选排名、CN 上线门怎么跑、怎么判读。 |
| [references/parameters.md](references/parameters.md) | **定参数 / 选机器 / 选 dest 时**。参数表、选站 5 规则、机房与 IP、为什么用 sing-box。 |
| [references/clients.md](references/clients.md) | **发客户端链接时**。客户端选择判据、导入、国内直连做法、线级画像。 |
| [references/troubleshooting.md](references/troubleshooting.md) | **出问题时**。连不上/慢/疑似被墙的故障树与运维坑。 |

## 两条贯穿全程的铁律

**① 每项检查的结论只用这四种记号：**

| 记号 | 意思 | 怎么处理 |
|---|---|---|
| `PASS` | 查了，通过 | 继续下一步 |
| `FAIL` | 查了，不通过 | **停**，按文档处理（如换 IP、换 dest） |
| `UNKNOWN` | 查了，但没拿到能解释的答案（超时、工具缺失、被拒） | **停**，当作「没有证据」，不得当成通过 |
| `NOT_RUN` | 这项未执行 | 记 `NOT_RUN` 并向用户说明未执行 |

**硬门只认 `PASS`。** 哪几步是硬门看 §3 的「关卡 / 停止条件」列——写了「只有 `PASS` 继续」「都 `PASS` 才用」
「必须 ==」的那几行就是硬门，`FAIL` / `UNKNOWN` 一律停在原地。
**软门与 agent 跑不了的外部验证**（步 8 CN 上线门、抓包线级核对）不适用上一条：记 `NOT_RUN`，把结果原样
交给用户，由用户拍板是否继续。

**② 完整执行安全关键步骤**：私钥权限、systemd 加固项、原子替换与失败回滚、IP/dest 门。

## 0. 边界与非目标(先读)

**范围:** 一台 VPS → 一个 stock `sing-box` 的 VLESS+REALITY 入站(`:443`)→ 各设备的分享链接 → 验证与排障。
**一机、一协议、一份配置。** 不要引入这些:控制面、订阅系统、按 UA 分发格式、多节点的 SNI 集中管理与审计、
Prometheus/Alertmanager 之类的监控告警、per-user 流量计量。
用 sing-box **官方 release**,不要打补丁构建。

## 1. 推荐栈(一句话)

> **`sing-box`(stock 最新稳定版)· VLESS · REALITY · flow=`xtls-rprx-vision` · TCP · 监听 `:443` · 不要域名、不要证书。**

- **为什么是 sing-box 而不是 Xray**,见 [parameters.md §4](references/parameters.md)。
- **服务端 sing-box 版本现查**:部署/升级前到官方仓库 [SagerNet/sing-box releases](https://github.com/SagerNet/sing-box/releases) 取**当前稳定版**;下载校验与装后自证的做法见 [provisioning.md §3](references/provisioning.md)。

**只用 VLESS+REALITY-on-443 一个协议。** 不引入第二种协议,也不做 CDN/WS 之类的并行备线。IP 被封的对治是 **reroll IP 重建**(destroy+rebuild);可另备一台不同厂商/ASN 的同协议冷备机,被封时按同一份配置拉起(见 [troubleshooting §5.1](references/troubleshooting.md))。

## 2. 选服务器(agent 决定机械部分,只问它无法判定的)

**存活轴和质量轴是两件独立的事。**

| 轴 | 由什么决定 | CN2 GIA / CMIN2 这类公网优化线路有用吗? |
|----|-----------|-----------------------------------|
| **存活**(会不会被墙) | (a) 协议=REALITY (b) **一个全新、干净、未上黑名单的出口 IP** | **没用——几乎不贡献。** 廉价机就能过这轴。 |
| **质量**(晚上 9 点能用吗) | 晚高峰的跨境**中转路径** | **有用——这是优质线路唯一买到的东西**:降丢包/抖动,不是"不被墙"。 |

**规则:选个就近地区的靠谱廉价机 → 硬卡"IP 干净" → 跑 REALITY。只有当用户真的观测到晚高峰丢包/抖动无法忍受,
才为优质 CN 线路付费。**

- **地区(agent 推荐,并告诉用户理由;用户租机时选):** 就近压倒一切。Tier1 东京/大阪/香港/新加坡(~30–80ms,一台平庸线路的
  日本机通常胜过优质线路的美国机);Tier2 美西/圣何塞(~150–180ms,若 CN2 稳);Tier3 美东/欧洲(除非用户在当地,否则避开)。
- **厂商选型**:优先级 = **能否按小时销毁重建**(换 IP 成本,压倒月费) > 目标机房的流量额度与超额价 > 线路质量。
  **具体厂商现查**;选型三维度、易错点与全表见 [parameters.md §3](references/parameters.md#server)。
- **谁定什么**:用户定预算与是否已租,并**亲自完成注册、付款、租机**;agent 定 IP 门、dest/SNI(默认过就用,
  不过或用户指定则说明并确认后换)与全部 REALITY 参数。要问用户哪几项、租机建议给到什么粒度,见 §3 步 1、步 2。

## 3. Agent 执行顺序

> 全程经 SSH 操作,幂等可重跑。**本表只给顺序与关卡;每步执行前先读右列文档,以其内容为准。**
> 每步都向用户说明你在做什么。

| # | 步骤 | 关卡 / 停止条件 | 读这份 |
|---|---|---|---|
| 1 | **问需求**:从哪访问、预算、是否已租、会不会分享给朋友 | — | 分享的运维影响 [troubleshooting §5.5](references/troubleshooting.md) |
| 2 | **推荐服务商**(未租时),收成**一句"照这个租"**(厂商+地区+套餐+OS+**确认给 IPv4**) | 已租 → 跳到 4 | [parameters.md §3](references/parameters.md#server) |
| 3 | **用户租机 + 交登录**(注册与付款只能用户自己做) | **所有进 SSH 的参数先在本地校验格式**,可疑字符一律拒绝 | [checks.md](references/checks.md) 顶部 |
| 4 | **IP 洁净门** | 只有 `PASS` 继续,`FAIL`/`UNKNOWN` 都停。**黑名单 ≠ 被墙**(被墙看步 8) | [checks.md §1](references/checks.md) |
| 5 | **选 dest/SNI**(无硬编码默认,必要时向用户确认) | 排名 → 完整硬门,**两步都 `PASS` 才用**;只用在该节点验证过的 dest | 规则 [parameters.md §2](references/parameters.md)<br>检查 [checks.md §2/§3](references/checks.md) |
| 6 | **开服**(先查 sing-box 当前稳定版) | **完整执行:权限、systemd 加固、原子替换与回滚、私钥留在服务端** | [provisioning.md](references/provisioning.md) 全篇 |
| 7 | **选客户端 → 开服自检全过后主动问一次要不要显示链接(确认才打印) → 用户导入 → 验证隧道** | **出口 IP 必须 == 节点 IP**;链接是凭据,经用户确认才显示、只问一次 | [clients.md](references/clients.md)<br>凭据处理 [provisioning.md §11](references/provisioning.md) |
| 8 | **CN 上线门**(itdog) | **软门,不是硬拦**:结果给用户,由用户拍板上不上线 | [checks.md §4](references/checks.md) |
| 9 | **各设备铺开**:导入同一条链接 | — | [clients.md](references/clients.md) |
| 10 | **收尾**:装两维 dead-man 监控(进程/端口存活 + 中继可达) | — | [troubleshooting §5.4/§5.10](references/troubleshooting.md) |

### 全程适用的四条
- **改配置一律 `systemctl restart vpn-singbox`**,它**会断开所有在连客户端约 5 秒**——多处改动合并成一次,改前告知用户。
  (`systemctl reload` 对本服务不可用,会报 `Job type reload is not applicable`。)
- restart 前先 `sing-box check -c /etc/singbox/node.json` 校验配置,并核对参数一致性(SNI==handshake.server==客户端 sni;pbk/sid/uuid 对齐)。
- 服务端 `node.json` 是唯一参数真源。客户端 JSON 和链接都从它派生,漂移立即停止。
- `private_key` 永不离开服务器。完整客户端链接也是凭据:步 7 主动问一次、经用户确认才显示,其余场合一律不打印。

## 4. 决策速记

1. **挑 dest 的依据是可达性与稳定性**(流量隐藏不是 dest 的作用)。把精力放在能控的变量:dest 选得对 + 握手保真 + 行为 + "reroll-until-clean"。
2. **443 是默认**,高端口只是某个 `:443` 被针对性封锁时的窄逃生口;**绝不"为保险"默认高端口**。
3. **"reroll-until-clean":被墙就重建换 IP。** 判"被墙"用步 8 的 CN 上线门,不是靠黑名单。
4. **分流看客户端默认**:Shadowrocket 出厂即国内直连分流,sing-box 最小配置默认全走代理,两种都能翻墙。要调整,按 [clients.md](references/clients.md) 的各客户端做法配,**不下发自定义分流配置**。

## 何时不该用本 skill
- 用户要的是**订阅商业机场/买别人的节点**(不自建),不是本 skill。
- 用户要搭**多节点、带计费计量的商业服务**,超出"个人自用一机"的范围,本 skill 不覆盖。
- 纯本机/局域网代理、非跨境场景,不用本 skill。
