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

6.0 KiB
Raw Blame History

name, description, agent_created
name description agent_created
dual-link-proxy 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. 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 + 域名已解析)直接跑:

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 并打印两条可直接导入的链接。

装完会用到的后续命令:

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。