Files
workbuddy_skills/dual-link-proxy/SKILL.md
T
admin b2016af916 feat(dual-link-proxy): 一键安装脚本,空机器一条命令装完链路与面板
- 新增 scripts/install-dual-link.sh:装 3x-ui → 建两条 VLESS+WS 入站(绑 127.0.0.1)
  → 80 vhost 完成 ACME → 签证书 → 切 443 → 可选面板子域 + Basic Auth → 实测 101 并打印链接;
  支持 --dry-run 干跑、--yes 无人值守、已有 3x-ui 时复用而不重置密码
- 3xui-api.py 补 uuid / link / del-inbound 三个子命令,add 的 --uuid 改为可选
- verify-links.sh 统计实际检查项,空跑以退出码 2 报错,避免假通过
- 避坑清单补三条脚本类实测:ss 端口判定的字段误用、dry-run 仍落盘、验收空跑
2026-10-18 20:18:33 +08:00

107 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: dual-link-proxy
description: Deploy and operate a self-hosted proxy on a VPS that already runs nginx, giving one Cloudflare-fronted link plus one direct-DNS link so clients can switch when a path degrades. Covers nginx-side TLS termination, WebSocket reverse proxying to a loopback backend, Let's Encrypt issuance, 3x-ui panel based multi-user management, and the verification criteria for every hop. Use when building or maintaining nginx-fronted VLESS/WebSocket proxy links, adding or revoking users, checking link health, or diagnosing 101/200/401/403/404/520/526 symptoms.
agent_created: true
---
# 双链路代理:搭建与运维
## 用途
在一台已经跑着 nginx(通常是宝塔 / aaPanel)的 VPS 上,落地一套「两条链路 + 面板管多用户」的代理:
- 链路一挂在 Cloudflare 后面(橙云),抗干扰、隐藏源站。
- 链路二用灰云 A 记录直连源站,路径短、握手快。
- 两条互为备份,任一条被干扰就切另一条,客户端参数结构一致。
- 后端只监听 127.0.0.1,公网只暴露 nginx 的 443。
- 用户通过 3x-ui 面板增删,每人独立 UUID、独立流量统计、可设到期。
## 何时使用
- 在已有 nginx 的机器上加代理,且用户明确「域名都走 nginx 转发」。
- 用户要求「每人一个独立账号」并要网页管理。
- 链路出现 101 不通、证书签不下来、面板打不开等故障需要定位。
## 硬性前提:先确认这四条,再动手
1. 确认域名是否真的回源到目标服务器,解析结果不算数,要看 HTTP 响应特征(见 `references/01-前置取证与选型.md`)。
2. 确认目标端口空闲,且不与 nginx 的 80/443 冲突。
3. 确认后端选型与「域名走 nginx」这一约束不冲突,Reality 与 nginx 转发互斥。
4. 确认改动范围只新增文件,现有站点的 vhost 一行不动。
## 工作流
### 快速通道:一条命令装完(推荐)
新机器(Ubuntu/Debian + 已有 nginx + 域名已解析)直接跑:
```bash
scripts/install-dual-link.sh --dry-run # 先干跑,看它打算做什么,不改任何东西
scripts/install-dual-link.sh # 交互确认后真装
scripts/install-dual-link.sh --yes \
--domain-a gao.example.com --domain-b mao.example.com --panel-domain sing.example.com
```
它一次做完:装 3x-ui → 调面板接口建两条 VLESS+WS 入站(只绑 127.0.0.1)→ 建 80 vhost 完成 ACME → 签证书 → 切 443 → 可选给面板配子域 + Basic Auth → 实测 101 并打印两条可直接导入的链接。
装完会用到的后续命令:
```bash
python3 scripts/3xui-api.py --password '<面板密码>' list # 看入站/账号/流量
python3 scripts/3xui-api.py --password '<面板密码>' add-user --email alice # 一次给两条链路开同一个人
python3 scripts/3xui-api.py --password '<面板密码>' link --inbound linkA --email alice --domain gao.example.com
python3 scripts/3xui-api.py --password '<面板密码>' del-user --email alice
```
脚本是「只接 nginx 转发」这一种架构;下列阶段一~五是把脚本内部每一步拆开讲,出问题或要偏离默认值时按阶段查。
### 阶段一 取证与选型
读 `references/01-前置取证与选型.md`。产出:链路数量与域名分配、后端选型、端口清单。
关键判据:云解析的泛记录常常存在但**不通**,必须用 HTTP 状态码区分「CF 自有 404」与「回源 520 / 200」。
### 阶段二 服务端落地
读 `references/02-服务端落地.md`。产出:后端在 127.0.0.1 的指定端口跑起来,入站就绪。
这一篇含 3x-ui 与纯 sing-box 两条路线,写明包名、版本、端口冲突处理。
### 阶段三 nginx 与证书
读 `references/03-nginx与证书.md`。产出:vhost 建好、证书签发成功、443 可用。
顺序不可颠倒:先建 80 的 vhost 并在其上完成 ACME 验证,再签证书,最后加 443。反过来必然失败。
### 阶段四 面板与多用户
读 `references/04-面板与多用户.md`。产出:面板可登录、入站建好、每个用户在两套入站里各有一个客户端。
面板的脚本化登录有前置条件,先读该文档再写自动化。
### 阶段五 验收
跑 `scripts/verify-links.sh` 或等效命令。四条判据缺一不可:
- 每条链路的 WebSocket 路径返回 `HTTP/1.1 101`。
- 每个既有站点返回 `200`。
- 面板带口令、带浏览器 UA 返回 `200`。
- 后端服务 `active`,被替换的旧服务 `inactive` 且 `disabled`。
## 三条容易踩反的判据
- 验证带 basic auth 的站点要带浏览器 User-Agent。aaPanel 及同类面板对非浏览器 UA 一律返回 404,用 curl 默认 UA 判断「服务挂了」会得到假阳性。
- 验证 WS 转发看 `101 Switching Protocols`,不看 `200`。经 CDN 时先有 `200 Connection Established`(CONNECT 隧道)再是 `101`。
- 判断服务状态要把 `systemctl is-active` 与 `ss -tlnp` 的持有进程一起看。孤儿 worker 会继续持有监听端口,此时 systemd 显示 failed 而站点仍然可访问。
## 资源索引
- `references/01-前置取证与选型.md` —— DNS / 端口 / 选型的取证命令与判据。
- `references/02-服务端落地.md` —— 3x-ui 与 sing-box 两条安装路线。
- `references/03-nginx与证书.md` —— vhost 模板、acme.sh 流程、TLS 套件收紧。
- `references/04-面板与多用户.md` —— 3x-ui 层级模型、加人步骤、脚本登录的 CSRF 处理。
- `references/05-避坑清单.md` —— 实际踩过的坑与对应正向做法。
- `scripts/install-dual-link.sh` —— 一键安装:3x-ui + 两条入站 + nginx 反代 + 证书 + 面板子域 + 验收。支持 `--dry-run`。
- `scripts/verify-links.sh` —— 一次验证链路、站点、面板(**必须带 `--link` / `--site` / `--panel`,不带任何检查项会以退出码 2 报错而不是假通过**)。
- `scripts/3xui-api.py` —— 3x-ui 命令行封装:`ping` / `list` / `add` / `del-inbound` / `add-user` / `del-user` / `uuid` / `link`。