填写服务器 IP、管理分流结果,并保持系统 DNS 不被修改——这是 WG 希望提供的私有隧道体验。
WG 是一个使用 Go 开发的轻量级智能分流私有隧道项目。客户端提供图形界面,服务端通过脚本和命令行管理;域名、IP 和 CIDR 的分流结果可以随时调整,删除人工覆盖项后会重新交给 AUTO 智能分类。
Note
WG 提供可用的 TCP 代理和加密 UDP 中继;它不创建 TUN、系统路由、防火墙或 NAT 规则,因此不会污染系统 DNS。它不是 WireGuard 兼容实现,也不应被配置为系统级全局 VPN。
wg-proxy 是实际数据面:TCP 模式为 TLS 保护、令牌认证的 HTTP/HTTPS CONNECT 代理;UDP 模式为令牌认证、AES-256-GCM 保护的请求/响应 UDP 中继。TCP 和 UDP 可同时使用同一个端口号 9518(分别占用 TCP/UDP 协议),客户端仅监听回环地址。-direct-host 支持 TCP 的按域名后缀直连,整个过程不修改系统 DNS、路由或防火墙。
Important
UDP 中继要求客户端明确指定 -target host:port,适用于 DNS、游戏或其他固定 UDP 服务。它不是透明 UDP/TUN;服务端令牌和证书必须通过安全渠道发放并定期轮换。
服务端示例:
wg-proxy server \
-listen :9518 \
-cert ./server-cert.pem \
-key ./server-key.pem \
-token "$WG_PROXY_TOKEN"长期运行时,使用只允许服务账户读取的令牌文件,避免令牌出现在进程参数中:
chmod 600 /etc/wg-proxy/token
wg-proxy server \
-listen <private-interface-ip>:9518 \
-cert /etc/wg-proxy/server-cert.pem \
-key /etc/wg-proxy/server-key.pem \
-token-file /etc/wg-proxy/token如果本机已有服务占用 127.0.0.1:9518,WG 可以仅绑定服务器私网网卡地址;公网 EIP/NAT 仍可将 TCP 9518 转到该监听,不会影响该回环服务。
客户端示例:
wg-proxy client \
-listen 127.0.0.1:47101 \
-server SERVER_IP:9518 \
-ca ./server-cert.pem \
-token "$WG_PROXY_TOKEN" \
-direct-host example.com
curl --proxy http://127.0.0.1:47101 https://icanhazip.com把服务端证书和令牌放入客户端私有目录,然后启动 Web UI:
mkdir -p ~/.wg-client
chmod 700 ~/.wg-client
cp server-cert.pem ~/.wg-client/server-cert.pem
cp token ~/.wg-client/token
chmod 600 ~/.wg-client/server-cert.pem ~/.wg-client/token./bin/wg-client-ui --listen 127.0.0.1:4173 --assets ui/client/dist打开 http://127.0.0.1:4173,在“连接”页添加或选择服务器,填写服务器 IP、端口(默认 9518)并选择 TCP、UDP 或 TCP + UDP。点击“连接服务器”后,Web UI 会调用同目录下的 wg-proxy,真实启动本机 127.0.0.1:47101 TCP 代理和/或 127.0.0.1:47102 UDP 中继。服务器列表保存在 ~/.wg-client/config.json,不会写入页面存储,也不会修改系统 DNS。
如果二进制或状态目录不在默认位置,可显式指定:
./bin/wg-client-ui \
--listen 127.0.0.1:4173 \
--assets ui/client/dist \
--proxy-bin ./bin/wg-proxy \
--proxy-state ~/.wg-client进入“健康与更新”,选择“开始真实测试”,可验证真实公网出口、UDP DNS 往返,以及 UI 启动后系统 DNS 指纹是否保持不变;页面不会读取或显示令牌。
UDP 服务端与客户端(与 TCP 使用相同令牌,默认同为 9518):
# server: UDP/9518
wg-proxy udp-server -listen :9518 -token-file /etc/wg-proxy/token
# client: expose a loopback UDP relay for one selected destination
wg-proxy udp-client \
-listen 127.0.0.1:47102 \
-server SERVER_IP:9518 \
-target 1.1.1.1:53 \
-token "$WG_PROXY_TOKEN"以下是实际 TCP/UDP 数据面脚本;它们不会修改系统 DNS、路由、NAT 或防火墙。请先通过安全渠道将服务端证书和令牌提供给客户端。
make build
./scripts/wg-client proxy start tcp \
--server SERVER_IP:9518 --ca ./server-cert.pem --token-file ./token
# 切换为 UDP:暴露一个只连接到指定目标的本地 UDP 中继
./scripts/wg-client proxy start udp \
--server SERVER_IP:9518 --target 1.1.1.1:53 --token-file ./tokenmake build
sudo WG_PROXY_BIN="$PWD/bin/wg-proxy" ./scripts/wg-server proxy install \
--server-ip YOUR_PUBLIC_IP --listen :9518git clone https://github.com/Aiweline/WG.git
Set-Location WG
wsl bash ./scripts/wg-client install 203.0.113.10 ./wg-pairing.wgp --dry-run安装脚本会创建 wg-proxy-tcp.service 和 wg-proxy-udp.service 并设置开机自启。若 127.0.0.1:9518 已有本地服务,请将 --listen 指向服务器私网网卡地址,例如 172.23.33.165:9518。
- 智能分流:
AUTO自动判断目标,也可以显式设为TUNNEL、DIRECT或BLOCK。 - 结果可管理:支持域名、IP 和 CIDR 覆盖项;删除后恢复自动分类。
- 私有 DNS 副本:只读复制系统解析器配置,使用独立 generation 和私有 TTL 缓存;没有修改系统 DNS 的接口。
- 客户端有 UI,服务端无 UI:客户端展示连接、分流、DNS、健康和配对;服务端由
wg-server脚本管理。 - 安全开发优先:管理端口只允许回环地址,生产网络模式会被明确拒绝。
WG/1 与 WG-HS/1 是项目定义的实验性格式和状态机,不代表 WireGuard 兼容性。底层密码能力使用 Go 生态中的 X25519、ChaCha20-Poly1305、BLAKE2s 和 HKDF 实现;项目没有自创底层密码原语,也尚未通过独立安全审计。
| 模块 | 安全开发版能力 |
|---|---|
internal/codec |
有界的 WG/1 报文、TLV 和内层帧解析与序列化,含单元测试与 fuzz 入口 |
internal/crypto |
标准密码原语、规范指纹和握手/传输高层接口 |
internal/handshake |
已登记客户端的内存内 WG-HS/1 握手开发路径 |
internal/session |
客户端/服务端状态机、包号与重放防护 |
internal/routing |
域名、IP、CIDR 与四类分流决策 |
internal/privatedns |
系统解析器只读快照、generation 隔离和私有 TTL 缓存 |
internal/controlapi |
有大小、超时和并发上限的本地管理 API |
cmd / ui / scripts |
安全 control core、五页客户端 UI 和真实 TCP/UDP 代理脚本 |
安全 control core 验证架构与管理流程;wg-proxy 承载真实代理流量。
客户端 UI(React,由 Go 主机托管)
│ http://127.0.0.1:4173
▼
wg-client-ui
│ /api/v1
▼
wg-core client(回环管理 API)
├── WG/1 + WG-HS/1
├── crypto + session
├── AUTO 智能分流
└── 私有 DNS 快照与缓存
wg-core server(无 UI,脚本管理)
└── 安全模式仅记录数据监听配置
UDP / TUN / 系统路由 / 防火墙 / NAT
└── 尚未接入
客户端包含连接、智能分流、私有 DNS、健康与更新、首次配对五个页面。更多原型位于 docs/ui-prototypes。
- Go 1.26+
- Node.js 20+
make
git clone https://github.com/Aiweline/WG.git
cd WG
npm --prefix ui/client install
make build启动安全开发客户端 core:
WG_DEV_SAFE=1 ./bin/wg-core client \
--dev-safe \
--no-host-network \
--management-address 127.0.0.1:47003 \
--endpoint 203.0.113.10:9518203.0.113.10 是 TEST-NET 文档示例地址。当前版本只记录端点,不会建立真实隧道。
在另一个终端启动客户端 UI:
./bin/wg-client-ui \
--listen 127.0.0.1:4173 \
--assets ui/client/dist \
--core http://127.0.0.1:47003可选的安全开发服务端 core:
WG_DEV_SAFE=1 ./bin/wg-core server \
--dev-safe \
--no-host-network \
--management-address 127.0.0.1:47002 \
--listen 0.0.0.0:9518安全模式中的 --listen 只是配置记录,不会打开 UDP 端口。
以下命令是彼此独立的 dry-run 示例:
./scripts/wg-server install 203.0.113.10 --dry-run
./scripts/wg-server pair \
--output ./wg-pairing.wgp \
--expires 10m \
--dry-run
./scripts/wg-client install \
203.0.113.10 \
./wg-pairing.wgp \
--dry-runImportant
dry-run 不保证生成配对文件。真实安装尚未完成,install --execute 会明确失败;这些命令不能作为生产部署步骤。
cmd/ wg-core 与 wg-client-ui
internal/ 协议、会话、分流、DNS 和控制 API
scripts/ wg-client 与 wg-server
ui/client/ 客户端 UI
docs/ui-prototypes/ 多页面原型
tests/ 跨包与边界测试
go test ./cmd/... ./internal/... ./tests/...
go test -race ./cmd/... ./internal/... ./tests/...
go vet ./cmd/... ./internal/... ./tests/...
npm --prefix ui/client run build
sh -n scripts/wg-client
sh -n scripts/wg-server- UDP 传输、真实 TUN 数据面、IPv4/IPv6、MTU 与流量加密集成。
- 原子路由事务、最小权限辅助程序、服务隔离、防火墙/NAT 与失败回滚。
- 完整私有 DNS socket、逐链路解析器快照和 TTL 刷新。
- 持久化客户端登记、正式密钥生命周期、一次性登记和 RETRY 状态机。
- 签名发布、供应链校验、打包、跨平台测试和独立安全审计。
欢迎提交 Issue 和 Pull Request。请保持安全开发模式为默认值,为行为变化补充测试,并在提交前运行全部验证命令。
涉及协议、密码、重放防护、分流、DNS 或系统网络设置的变更,请说明兼容性、安全影响与验证依据。
