stillya/wg-relay
GitHub: stillya/wg-relay
基于 eBPF 的 WireGuard 流量混淆代理,通过内核层伪装绕过深度包检测与审查。
Stars: 61 | Forks: 3
# WGRelay
[](https://github.com/stillya/wg-relay/actions/workflows/build.yml)
[](https://coveralls.io/github/stillya/wg-relay?branch=master)
一种基于 eBPF 的流量混淆系统,用于伪装 WireGuard 协议流量以绕过深度包检测(DPI)和政府审查
## 概述
WireGuard eBPF 代理在内核层拦截 WireGuard 数据包,应用轻量级混淆,并通过代理服务器透明路由,然后再到达实际的 WireGuard 端点。这有助于绕过网络限制,同时保持 WireGuard 的安全性和性能优势。
## 架构
```
Client Obfuscator Proxy WireGuard Server
| | |
| WG packets | |
|------------------------->| |
| | Obfuscated packets |
| |------------------------->|
| | | Real WG packets
| | |----------> WG Server
| | |
| | WG Response |
| |<-------------------------|
| Deobfuscated response | |
|<-------------------------| |
```
## 安装
### 部署概述
完整的部署需要 **两个** wg-relay 实例:
- **正向实例** - 在中继机器上运行。设置 `mode: "forward"` 并配置 `backends` 指向反向实例。
- **反向实例** -在与 WireGuard 服务器相同的机器上运行。设置 `mode: "reverse"`。它将对传入流量进行去混淆并转发到本地 WireGuard 守护进程。
两个实例必须使用相同的混淆设置(相同的 XOR 密钥、相同的填充配置)。
### Debian / Ubuntu
从 [最新发布](https://github.com/stillya/wg-relay/releases/latest) 下载 `.deb` 包:
```
wget https://github.com/stillya/wg-relay/releases/latest/download/wg-relay__linux_amd64.deb
sudo dpkg -i wg-relay__linux_amd64.deb
```
在启动前编辑配置:
```
sudo nano /etc/wg-relay/config.yaml
sudo systemctl start wg-relay
```
查看日志:
```
journalctl -u wg-relay -f
```
覆盖服务设置而无需编辑单元文件(例如使用不同的配置路径):
```
sudo systemctl edit wg-relay
# 在 /etc/systemd/system/wg-relay.service.d/override.conf 添加即插即用
```
### RPM (RHEL / Fedora)
```
sudo rpm -i wg-relay__linux_amd64.rpm
sudo nano /etc/wg-relay/config.yaml
sudo systemctl start wg-relay
```
### 二进制压缩包
```
tar -xzf wg-relay__linux_amd64.tar.gz
sudo install -m 755 wg-relay-daemon /usr/local/bin/
sudo wg-relay-daemon -c config.yaml
```
使用提供的 `checksums.txt` 验证下载:
```
sha256sum -c checksums.txt --ignore-missing
```
## 要求
- Linux 内核 6.6+ 并启用 eBPF 支持
- 执行 eBPF 操作需要 root 权限
- Go 1.25+
- WireGuard 工具
## 快速开始
### 1. 构建
```
make build
```
### 测试
```
# 运行所有测试(需要 root 权限)
make test
# 仅运行 eBPF 单元测试
make test-ebpf
```
### 2. 配置
创建 `config.yaml` 文件:
```
daemon: # Daemon configuration
listen: ":8080" # Address and port for daemon to bind to
monitoring: # Monitoring configuration
statistics: # vnstat-style console output
enabled: true # Enable/disable statistics display
interval: "5s" # Statistics update interval
prometheus: # Prometheus HTTP exporter
enabled: true # Enable/disable Prometheus metrics server
listen: ":8081" # Address and port for metrics server
proxy:
enabled: true # Enable/disable proxy
mode: "forward" # "forward" for forward proxy, "reverse" for reverse proxy
wg_port: 51820 # WireGuard port to intercept (default: 51820)
instrumentations: # Instrumentation configuration
xor: # XOR obfuscation
enabled: true
key: "your_xor_key"
padding: # Padding obfuscation
enabled: true
size: 32
mode: "direct" # "direct" (fixed size) or "randomize" (random 1..size)
driver_mode: "driver" # "driver", "generic" or "offload" for XDP mode
interfaces: # Network interfaces to attach to
- "eth0"
forward: # Forward proxy configuration (forward mode)
backends:
- name: "wg-gateway-1" # Optional: backend name for metrics (defaults to backend_)
ip: "192.168.200.2" # Backend 1 IP address
port: 51820 # Optional: port (defaults to wg_port)
- name: "wg-gateway-2" # Named backend for low-cardinality metrics
ip: "192.168.200.3" # Backend 2 IP address
port: 51820
```
后端名称:可选的 `name` 字段允许你为后端分配人类可读的标签,用于 Prometheus 指标和控制台统计信息。如果省略,后端将标记为 backend_0、backend_1 等。命名后端有助于提高指标清晰度和仪表板创建。
### 3. 本地运行
```
# 运行守护进程
sudo make run-daemon
# 或在特定网络命名空间中运行
sudo make run-forward-proxy # ebpf-proxy namespace
sudo make run-reverse-proxy # wg-server namespace
```
## 配置
### 代理模式
- **正向模式**:拦截出站 WireGuard 流量,进行混淆并转发到其中一个后端
- **反向模式**:处理服务器端双向流量处理
### 混淆方法
- **XOR**:使用可配置密钥的简单 XOR 混淆
- **填充**:向数据包添加填充以改变流量模式。支持 `direct` 模式(固定大小)和 `randomize` 模式(每个数据包在 1 到 `size` 之间随机大小)
- **无**:透传模式,用于测试
### XDP 驱动模式
- **驱动**:原生 XDP 模式(性能更好,需要驱动支持)
- **卸载**:卸载 XDP 模式(硬件卸载,需要网卡支持)
- **通用**:通用 XDP 模式(兼容性更广,性能略低)
## 监控与统计
### 控制台统计(类似 vnstat)
守护进程提供实时流量统计,区分下游/上游:
正向模式(显示每个后端的统计信息):
```
wg-relay(forward) traffic statistics
| down_rx | down_tx | up_rx | up_tx | total | avg. rate
------------------+--------------+--------------+--------------+--------------+--------------+--------------
traffic | 7.4 GB | 480.9 MB | 3.2 GB | 1.8 GB | 13.3 GB | 68.1 KB/s
------------------+--------------+--------------+--------------+--------------+--------------+--------------
estimated | 5.3 GB | 341.6 MB | 2.3 GB | 1.3 GB | 9.2 GB |
Per-backend statistics:
backend | down_rx | down_tx | up_rx | up_tx | total
------------------+--------------+--------------+--------------+--------------+--------------
wg-gateway-1 | 35.3 KB | 12.5 KB | 18.2 KB | 9.1 KB | 75.1 KB
wg-gateway-2 | 29.0 KB | 7.1 KB | 15.3 KB | 7.6 KB | 59.0 KB
backend_2 | 33.1 KB | 8.4 KB | 17.1 KB | 8.5 KB | 67.1 KB
```
列含义:
- down_rx:从客户端接收的字节数(下游接收)
- down_tx:发送到客户端的字节数(下游传输)
- up_rx:从后端/WireGuard 接收的字节数(上游接收)
- up_tx:发送到后端/WireGuard 的字节数(上游传输)
在配置中启用统计监控:
```
monitoring:
statistics:
enabled: true
interval: 5s
```
### Prometheus 指标
公开 Prometheus 指标以便使用 Grafana 仪表板进行监控:
```
monitoring:
prometheus:
enabled: true
listen: ":9090"
```
可用指标:
正向模式(带后端标签):
- `wg_relay_forward_downstream_rq_rx_packets_total{backend}` - 从客户端接收的数据包
- `wg_relay_forward_downstream_rq_tx_packets_total{backend}` - 发送到客户端的数据包
- `wg_relay_forward_downstream_rq_rx_bytes_total{backend}` - 从客户端接收的字节数
- `wg_relay_forward_downstream_rq_tx_bytes_total{backend}` - 发送到客户端的字节数
- `wg_relay_forward_upstream_rq_rx_packets_total{backend}` - 从后端接收的数据包
- `wg_relay_forward_upstream_rq_tx_packets_total{backend}` - 发送到后端的数据包
- `wg_relay_forward_upstream_rq_rx_bytes_total{backend}` - 从后端接收的字节数
- `wg_relay_forward_upstream_rq_tx_bytes_total{backend}` - 发送到后端的字节数
反向模式(无标签):
- `wg_relay_reverse_downstream_rq_rx_packets_total` - 从客户端接收的数据包
- `wg_relay_reverse_downstream_rq_tx_packets_total` - 发送到客户端的数据包
- `wg_relay_reverse_downstream_rq_rx_bytes_total` - 从客户端接收的字节数
- `wg_relay_reverse_downstream_rq_tx_bytes_total` - 发送到客户端的数据包
- `wg_relay_reverse_upstream_rq_rx_packets_total` - 从 WireGuard 服务器接收的数据包
- `wg_relay_reverse_upstream_rq_tx_packets_total` - 发送到 WireGuard 服务器的数据包
- `wg_relay_reverse_upstream_rq_rx_bytes_total` - 从 WireGuard 服务器接收的字节数
- `wg_relay_reverse_upstream_rq_tx_bytes_total` - 发送到 WireGuard 服务器的字节数
标签:
- `backend`:后端服务器名称(仅正向模式)- 要么是配置中设置的名称,要么是 backend_ 回退
## 开发
### Devcontainer 设置
对于开发,可以使用 `.devcontainer` 目录中提供的 devcontainer 设置。这允许你在
一致的环境中工作,所有依赖项均已预先安装。尤其适用于非 Linux 环境。
```
### 使用网络命名空间进行测试
# 创建测试命名空间
sudo bash setup-netns.sh
# 在命名空间中运行前向代理
sudo make run-local-forward
# 在命名空间中运行反向代理
sudo make run-local-reverse
```
标签:Docker镜像, DPI绕过, Go, Ruby工具, Rust, VPN混淆, WireGuard, WSL, 内核态, 内核模块, 安全传输, 安全合规, 安全资源, 客户端加密, 开源网络工具, 性能优化, 政府审查, 旁路安全, 日志审计, 检测绕过, 流量伪装, 流量混淆, 流量转发, 网络代理, 网络审查规避, 网络流量审计, 网络穿透, 透明代理, 隐蔽通道