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 提供免费的公共入口。** [![Build](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/54e3405e52224741.svg)](https://github.com/dc-holdings-spa/arena-tunnel/actions/workflows/ci.yml) [![Release](https://img.shields.io/github/v/release/dc-holdings-spa/arena-tunnel?logo=github)](https://github.com/dc-holdings-spa/arena-tunnel/releases) [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-orange.svg)](LICENSE) [![Go Report Card](https://goreportcard.com/badge/github.com/dc-holdings-spa/arena-tunnel)](https://goreportcard.com/report/github.com/dc-holdings-spa/arena-tunnel) [![Go Version](https://img.shields.io/github/go-mod/go-version/dc-holdings-spa/arena-tunnel?filename=client%2Fgo.mod)](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, 依赖分析, 内网穿透, 日志审计, 网络隧道