stillya/wg-relay

GitHub: stillya/wg-relay

基于 eBPF 的 WireGuard 流量混淆代理,通过内核层伪装绕过深度包检测与审查。

Stars: 61 | Forks: 3

# WGRelay [![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/14d19541ca102957.svg)](https://github.com/stillya/wg-relay/actions/workflows/build.yml) [![Coverage](https://coveralls.io/repos/github/stillya/wg-relay/badge.svg?branch=master)](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, 内核态, 内核模块, 安全传输, 安全合规, 安全资源, 客户端加密, 开源网络工具, 性能优化, 政府审查, 旁路安全, 日志审计, 检测绕过, 流量伪装, 流量混淆, 流量转发, 网络代理, 网络审查规避, 网络流量审计, 网络穿透, 透明代理, 隐蔽通道