Files
workbuddy_skills/dual-link-proxy/SKILL.md
T
admin a9d2adaf72 feat(dual-link-proxy): 新增双链路代理搭建与运维技能(已脱敏)
把「在已跑 nginx 的 VPS 上从零搭起橙云 + 灰云双链路、并用 3x-ui 管多用户」
的全过程沉淀成技能:五阶段工作流、五条硬性前提、三条易踩反的判据、19 条避坑。

- references/01 前置取证与选型:泛解析不等通、端口取证、nginx 约束下的选型
- references/02 服务端落地:3x-ui 与 sing-box 两条路线,含包名与 2096 冲突
- references/03 nginx 与证书:80 → 签证书 → 443 的顺序、AEAD 套件、口令文件位置
- references/04 面板与多用户:3x-ui 三层模型、加人步骤、CSRF 登录法
- references/05 避坑清单:19 条,正向写做法、括号里附踩过的坑
- scripts/verify-links.sh 与 scripts/3xui-api.py:两个脚本均对真实环境跑通

正文已脱敏,域名/端口/口令/UUID/主机 全部改为占位符。
2026-10-18 15:05:52 +08:00

82 lines
4.4 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 一行不动。
## 工作流
### 阶段一 取证与选型
读 `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/verify-links.sh` —— 一次验证链路、站点、面板。
- `scripts/3xui-api.py` —— 3x-ui 登录与建入站的命令行封装。