dc-holdings-spa/arena-tunnel
GitHub: dc-holdings-spa/arena-tunnel
将 WireGuard 的 UDP 流量封装在 WebSocket 中,借助 Cloudflare 等免费 CDN 实现无需 VPS 的加密 NAT 穿透隧道。
Stars: 2 | Forks: 0
# arena-tunnel
**通过 WebSocket 运行 WireGuard。单一 Go 二进制文件。通过任意 CDN 提供免费的公共入口。**
[](https://github.com/dc-holdings-spa/arena-tunnel/actions/workflows/ci.yml)
[](https://github.com/dc-holdings-spa/arena-tunnel/releases)
[](LICENSE)
[](https://goreportcard.com/report/github.com/dc-holdings-spa/arena-tunnel)
[](client/go.mod)
`arena-tunnel` 能通过任何 HTTP/HTTPS 路径打通 WireGuard VPN——包括免费的 Cloudflare Tunnel。无需租用 VPS。无需 Cloudflare Spectrum。没有供应商锁定。只需两个小巧的 Go 二进制文件和一个明确定义的通信协议。
专为 [Adversario Arena](https://arena.adversario.cl) 打造——这是一个红队训练平台,需要从仅有 CGNAT 的家庭网络中获取公共入口。采用 AGPL-3.0 协议发布,以便遇到同样问题的人可以将其用于自己的自托管环境。
## 为什么需要
WireGuard 使用 UDP 进行通信。大多数免费 CDN(Cloudflare Free、Fastly、Bunny)仅代理 HTTP/WS。那些昂贵的替代方案——Cloudflare Spectrum、Hetzner UDP 中继、Tailscale 的 DERP 服务器——要么需要每月花钱,要么会将你绑定在第三方上。
`arena-tunnel` 通过将每个 WireGuard UDP 数据报封装在一个二进制 WebSocket 帧中来解决这个问题。服务器将帧解包还原为 UDP 数据包,并将其交给本地的 WireGuard 内核接口。CDN 看到的就像是一个长生命周期的 WSS 会话——对于聊天应用或通知服务来说,这是再正常不过的流量。
结果:获得一个**稳定、加密、可穿透 NAT 且每月成本为 $0 的隧道**,并且能够在恶劣的网络环境(企业代理、强制门户、ISP 强加的 CGNAT)中存活。延迟开销:从 LATAM 的大部分地区通过免费的 CF tunnel,单向延迟约为 80–150 ms。除了对同步 RTT 敏感的工作负载外,适用于所有场景。
## 架构
```
Client side Public CDN Server side
───────────────────── ──────────────────────── ──────────────────────────
arena-tunnel-client arena-tunnel-server
├─ wireguard-go (TUN) ↑
└─ WSS dialer ──► wss://your-host/... ──► cloudflared ──► │ WS upgrade
(free tier) ▼
WireGuard kernel iface
│
▼
MASQUERADE / route
│
▼
Your internal network
```
**通信协议**:一个 WS 二进制帧 ↔ 一个 UDP 数据报。其上没有任何额外的封装。没有什么需要逆向工程的。每个方向大约 50 行粘合代码。
详细说明(威胁模型、MTU 计算、为什么我们不使用多路复用、考虑过的替代方案)请参阅 [ARCHITECTURE.md](ARCHITECTURE.md)。
## 快速开始
### 服务端(您的网络)
需要在同一主机上运行 WireGuard 服务端(内核空间或用户空间),并且需要一种发布 HTTP 端口的方法(`cloudflared tunnel`、`ngrok` 等)。
```
# 1. 以正常方式设置 WireGuard;以下是一个最简的 server 配置:
cat > /etc/wireguard/wg0.conf <<'EOF'
[Interface]
PrivateKey =
ListenPort = 51820
Address = 10.200.0.1/24
[Peer]
PublicKey =
AllowedIPs = 10.200.0.2/32
EOF
systemctl enable --now wg-quick@wg0
# 2. 运行 arena-tunnel server(转发 WSS → WG UDP)
go install github.com/dc-holdings-spa/arena-tunnel/server@latest
arena-tunnel-server --listen 127.0.0.1:8888 --wg 127.0.0.1:51820
# 3. 通过你选择的 CDN 将 127.0.0.1:8888 公开。
# 使用 cloudflared,添加一条 ingress 规则进行路由
# wss://wg.example.com → http://127.0.0.1:8888。
```
### 客户端(互联网上的任何位置)
从 [Releases](https://github.com/dc-holdings-spa/arena-tunnel/releases) 下载对应的二进制文件并运行(由于需要使用 TUN 设备,需要 root/Administrator 权限——与 Tailscale、OpenVPN、WireGuard 相同):
```
# Linux / macOS — 通过 flags 传递 creds
chmod +x arena-tunnel-client-linux-amd64
sudo ./arena-tunnel-client-linux-amd64 \
-priv \
-pub \
-ip 10.200.0.2 \
-host wg.example.com
```
或者,在构建时内置凭据以实现零配置的用户体验——请参阅下方的[构建](#build)。
```
[tun] creating device "arena-byoc"
[+] WG up: tunnelIP=10.200.0.2 server=wg.example.com local-udp-port=43902
[wss] dialing wss://wg.example.com/tunnel
[wss] connected
```
此时会存在一个名为 `arena-byoc` 的新网络接口,其 IP 为 `10.200.0.2`。Ping 网关:
```
ping 10.200.0.1
```
## 构建
客户端旨在由发行服务进行**逐用户、逐平台编译**,并在构建时通过 Go 的 `-ldflags` 将凭据内嵌其中。最终用户只需下载一个二进制文件,运行它,就能获得一个隧道——无需配置文件,无需环境变量,无需复制粘贴密钥。
`build.sh` 是您的控制平面可以调用的辅助脚本:
```
./build.sh \
"" \
"" \
"10.200.0.2" \
"wg.example.com" \
linux amd64 \
./arena-tunnel-client-linux-amd64
```
交叉编译矩阵:
| 操作系统 | 架构 | 二进制文件大小 | 备注 |
|---------|--------|--------------|-----------------------------------------------------------------------------------------|
| linux | amd64 | ~6 MB | 静态链接,禁用 CGO |
| linux | arm64 | ~6 MB | 同上 |
| darwin | amd64 | ~6 MB | Intel Macs |
| darwin | arm64 | ~6 MB | Apple Silicon |
| windows | amd64 | ~6 MB | 包含来自 [wintun.net](https://www.wintun.net/) 的 `wintun.dll` (内置在 `assets/` 中) |
或者使用 `Makefile`:
```
make build # local platform
make build-all # all 5 platforms (writes to dist/)
make release # tag + push (used by CI)
```
## 配置
### 服务端标志
| 标志 | 默认值 | 含义 |
|------------------|----------------------|------------------------------------------------------------------------------------|
| `--listen` | `127.0.0.1:8888` | HTTP 绑定地址。因为 CDN 会在上游终止 TLS,所以使用本地回环。 |
| `--wg` | `127.0.0.1:51820` | 解包后的 UDP 数据报目的地 |
| `--idle-timeout` | `5m` | 在 N 时间空闲后丢弃 UDP 隧道 |
### 客户端标志(覆盖内置值)
| 标志 | 含义 |
|-----------|------------------------------------------------------|
| `-priv` | 客户端 WG 私钥 (base64) |
| `-pub` | 服务端 WG 公钥 (base64) |
| `-ip` | 分配给此客户端的隧道 IP (例如 `10.200.0.2`)|
| `-host` | WSS 主机名 (例如 `wg.example.com`) |
| `-v` | 详细的 WireGuard 日志 |
### 编译时变量(生产环境推荐)
通过 `go build -ldflags "-X main.X=Y"` 设置:
```
main.privKeyB64 — client WG private key
main.serverPubKeyB64 — server WG public key
main.tunnelIP — client's tunnel IP
main.serverHost — WSS hostname
main.tunnelName — TUN interface name (default "arena-byoc")
```
## 威胁模型
- **机密性**:通过客户端和服务端之间的 WireGuard ChaCha20-Poly1305 实现端到端加密。CDN 只能看到不透明的 WSS 流——没有明文 IP、没有场景名称、没有命令载荷。
- **真实性**:WireGuard 的 noise 握手。公钥是每个对等端预先共享的(在配置时输入或内置在客户端二进制文件中)。
- **重放/MITM**:WireGuard 会处理这两者。CDN 端的 TLS 是一种纵深防御。
- **CDN 本身**:信任边界。Cloudflare 能看到连接元数据(时间戳、IP、字节数),但看不到内容。请据此选择您的 CDN。如果您不想让 CF 看到流量模式,可以换成其他前端服务——该协议是与 CDN 无关的。
- **单一二进制文件内置凭据**:如果用户共享了他们的二进制文件,接收者将获得该对等端插槽的完整隧道访问权限。请像对待 SSH 私钥一样对待该二进制文件。大多数平台(包括 Adversario)在吊销时会轮换对等端,因此泄漏的二进制文件会在几分钟内失效。
完整的模型见 [SECURITY.md](SECURITY.md)。漏洞报告请发送至:[security@adversario.cl](mailto:security@adversario.cl)。
## 状态
已发布 `v0.1.x` 版本。自 2026 年 6 月起被 [Adversario Arena](https://arena.adversario.cl) 用于生产环境,为 BYOC2 级别的学生提供无需租用 VPS 的 WG 入口。在 `v1.0` 之前,WS 路径可能会发生变化。`v1.0` 之后,通信协议将稳定下来。
## 许可证
[AGPL-3.0](LICENSE)。如果您发布了基于此代码修改版本的服务,则必须在相同的许可证下发布修改内容。协议本身未受专利保护,并在 [ARCHITECTURE.md](ARCHITECTURE.md) 中有详细文档说明,任何人都可以重新实现。
## 相关工作 / 灵感来源
- [WireGuard](https://www.wireguard.com/) — 底层的 VPN
- [wireguard-go](https://git.zx2c4.com/wireguard-go/) — 客户端使用的用户空间 WG
- [wstunnel](https://github.com/erebe/wstunnel) — 启发了该协议架构的 Rust 项目(我们重写了自己的实现以摆脱外部依赖)
- [Tailscale](https://tailscale.com/) — 证明了只要构建好控制平面,就可以在任何地方运行 WG
- [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/) — 我们所依赖的免费公共入口
- [wintun](https://www.wintun.net/) — Windows TUN 驱动程序,已内置标签:CDN代理, EVTX分析, Go, Ruby工具, WebSocket, WireGuard, 依赖分析, 内网穿透, 日志审计, 网络隧道