Ground-Zerro/Phobos
GitHub: Ground-Zerro/Phobos
一个集成了 STUN 流量混淆功能的 WireGuard VPN 管理面板,旨在帮助用户在网络审查和 DPI 封锁环境中部署和管理安全的远程通信。
Stars: 148 | Forks: 23
# wg-easy + Phobos 混淆器
[](https://github.com/Ground-Zerro/Phobos/actions/workflows/publish-image.yml)
[](https://github.com/Ground-Zerro/Phobos/stargazers)
[](LICENSE)
带有内置 STUN 混淆器的 WireGuard 管理面板。从客户端到服务器的流量被伪装为 STUN 并进行 XOR 编码 —— 以便在存在网络封锁的地区绕过 DPI。
:51831`,完成初始设置并创建一个客户端。
## 一键部署服务器
在一台全新的服务器上运行以下命令:
```
curl -fsSL https://raw.githubusercontent.com/Ground-Zerro/Phobos/main/deploy.sh | sudo bash
```
脚本执行流程:
- 安装 Docker + Compose 插件(如果尚未安装),
- 从此仓库下载部署文件,
- 从 `ghcr.io/ground-zerro/phobos` 拉取已构建好的项目镜像,
- 无需在服务器端构建镜像,直接启动技术栈,
- 启动设置向导:创建管理员账号、设置主机名并配置 TLS。
部署完成后,打开 `http://:51831/` —— 向导将引导您完成以下设置:
1. 管理员账号(用户名 + 密码)
2. 服务器主机(IP 地址或域名)
3. TLS 证书(自签名 / 导入已有证书 / 按路径导入 / 跳过)
可选参数:
```
WG_HOST= \
WG_EASY_IMAGE=ghcr.io/ground-zerro/phobos:latest \
curl -fsSL https://raw.githubusercontent.com/Ground-Zerro/Phobos/main/deploy.sh | sudo bash
```
如需跳过向导并通过环境变量预先配置管理员凭据:
```
INIT_ENABLED=true \
INIT_USERNAME=admin \
INIT_PASSWORD=YourPassword \
WG_HOST= \
curl -fsSL https://raw.githubusercontent.com/Ground-Zerro/Phobos/main/deploy.sh | sudo bash
```
端口说明:
- Web UI: `http://:51831/`
- 混淆器预设:`UDP :51822-51921`(每个预设占用一个端口,从此范围内分配)
## 工作原理
```
Client device Server (Docker)
───────────── ────────────────
app ─► 127.0.0.1:13255 0.0.0.0:
(local WG client) (wg-obfuscator instance for this preset)
│ │ STUN unwrap + XOR decode
│ plain WG ▼
▼ 127.0.0.1:51820 (wg0, loopback-only)
127.0.0.1:13255 │
(wg-obfuscator client) │ WG
│ ▼
│ XOR + STUN wrap FORWARD → internet
▼
UDP → :
```
单个 `wg-obfuscator` 进程会加载 `/run/wg-obfuscator.conf`,其中服务器为每个启用的预设保留一个 `[preset-]` 段落;二进制程序会为每个段落 fork 出一个监听器。每个监听器将解码后的流量转发到同一个本地回环 WireGuard 端口 —— 因此 WG 端完全不会察觉到预设的选择。
## 混淆器预设
预设允许您通过在同一个 WG 接口上配置带有**独立参数**的混淆器监听器,来为不同的客户端(或客户端组)提供服务。
**预设包含的内容**:
- `name` — 在管理 UI 中显示的自由格式标签;
- `extPort` — 监听器绑定的公共 UDP 端口,必须在 `51822–51921` 范围内(这是 docker-compose 默认发布的端口范围);
- `key` — 仅与该预设的客户端共享的 XOR 密钥;
- `masking` — `STUN` / `AUTO` / `NONE`;
- `idle` — 空闲会话超时时间(秒);
- `dummy` — 每个数据包的最大虚拟字节数;
- `clientWgLocalPort` — 客户端上的本地 WG 端口(当同一台路由器上共存多个 Phobos 配置文件时此项非常重要);
- `isDefault` — 只有一个预设会带有此标志;它会被所有未明确指定分配的客户端使用。
**为什么要使用它**:
- 抗探测回退方案:通过带有轻度填充的 `STUN` 模式为可信用户提供服务,并在备用端口上保留一个更严格的 `AUTO` 模式预设作为后备。
- 组间隔离:将公共测试客户端的密钥与您的个人配置文件分离,这样即使其中一个安装包泄露,也无法解密另一个通道的流量。
- A/B 测试不同的混淆参数,而无需重启那些未更改设置的客户端。
**管理 UI** — *管理面板 → 混淆器预设*:
- `添加预设` — Node 会在此范围内选择下一个可用端口(或由您提供),生成新密钥,应用配置并重启监听器(执行单次 `s6-svc -r`)。
- `设为默认` — 在单个事务中转移默认标志;新建及未分配的客户端会立即使用此预设。
- `重新生成密钥` / `重新生成端口` — 轮换对应的值并重新应用。
- `删除` — 仅允许对非默认预设执行;指向该预设的客户端会自动回退到默认预设(`ON DELETE SET NULL`)。
**针对客户端的分配**:
- *创建客户端*对话框中有一个预设下拉菜单;默认选项是 **使用默认预设**。
- *编辑客户端*页面(`/clients/`)具有相同的下拉菜单 —— 切换后会生成一个新的安装包下载,指向所选预设的端口/密钥。
- 在列表中,非默认预设会以彩色徽章的形式显示在客户端名称旁边。
**生命周期**:
- 每次创建/更新/删除/重新生成/设置默认操作都会调用 `Obfuscator.applyAll()`:它会根据数据库重新生成 `/run/wg-obfuscator.conf`,并发送 `s6-svc -r /run/service/wg-obfuscator` 指令。单次重启会重新 fork 所有监听器;现有会话将通过 `idle-timeout` 重新连接。
- 运行脚本会在 `setsid` 下启动二进制程序,以便所有 fork 出的子监听器共享同一个进程组;随后 `finish` 脚本会执行 `pkill -f /usr/local/bin/wg-obfuscator`,以确保在停止/重启时不会残留任何僵尸监听器。
## 客户端安装
1. 管理员在 Web UI 中创建一个客户端(可选择非默认的混淆器预设)。
2. 管理员点击 **安装链接** 按钮 —— 将以下命令复制到剪贴板:
curl -sL http:///api/install/ | sh
3. 管理员将此命令粘贴到目标设备上。脚本会下载 Phobos 安装包,检测系统平台,安装 `wg-obfuscator` 并配置 WireGuard。
下载的 WireGuard 配置会将预设参数作为 `[instance]` 段落附加到标准的 `[Peer]` 块中,以便客户端混淆器使用正确的密钥连接到正确的服务器端口。
## 支持的客户端平台
- Keenetic / Netcraze (Entware + RCI API)
- OpenWrt / ImmortalWrt (opkg + UCI)
- Debian / Ubuntu Linux (apt + systemd)
- 3x-ui 面板 (SQLite 集成)
## 远程部署脚本
`scripts/deploy/` 中提供了额外的辅助脚本,可用于基于 SSH 的远程操作和更新。
## 开发
```
pnpm dev
```
## 许可证
AGPL-3.0-only — 详见 [LICENSE](LICENSE)。
本项目与 Jason A. Donenfeld、ZX2C4 或 Edge Security 没有任何隶属、关联、授权、认可关系,也未以任何方式正式建立联系。“WireGuard” 和 “WireGuard” 徽标是 Jason A. Donenfeld 的注册商标。
标签:Docker容器, DPI绕过, MITM代理, VPN, Web管理面板, WireGuard, 客户端加密, 攻击面发现, 网络流量混淆, 请求拦截