ClusterM/wg-obfuscator
GitHub: ClusterM/wg-obfuscator
这是一款轻量级且无依赖的工具,专门用于混淆 WireGuard 流量以绕过 DPI 检测和网络封锁。
Stars: 625 | Forks: 41
# WireGuard 混淆器
WireGuard Obfuscator 是一种旨在将 WireGuard 流量伪装成随机数据或其他协议的工具,使得 DPI(深度包检测)系统更难检测和阻止。如果你的 ISP 或政府试图阻止或限制 WireGuard 流量,这非常有用。
**项目目标:**
* **紧凑且无依赖**:该应用程序设计得尽可能轻量,完全没有外部依赖。这使其非常适合安装在基础家用路由器等最小化硬件上。
* **独立的混淆器**:混淆器被构建为完全独立于 VPN 客户端/服务器,而不是维护 WireGuard 的单独分支。这允许无缝集成到现有的网络架构中,或者如果运行 WireGuard 的设备无法支持其他应用程序,甚至可以在单独的设备上运行混淆器。
* **保持带宽效率**:混淆器继续仅使用 UDP,并对原始数据包的大小引入最小的开销,以确保最大吞吐量。
**它不是什么:**
* **不是一个独立的解决方案**:你需要在 WireGuard 连接的两端运行此工具。你必须在两侧部署混淆器,以确保对流量的正确混淆和去混淆。因此,你不能将其与第三方 VPN 服务器一起使用。如果你想绕过 ISP 的限制或审查,你需要运行自己的 VPN 服务器(例如,托管在 VPS 上)并使用 WireGuard 连接到它。
* **不是一个 VPN**:这不是 VPN 服务或 WireGuard 客户端/服务器。它仅混淆 WireGuard 流量。
目录:
- [功能概览](#feature-overview)
- [基本概念](#basic-concept)
- [配置](#configuration)
- [避免路由环路](#avoiding-routing-loops)
- [伪装](#masking)
- [双向模式](#two-way-mode)
- [如何下载、构建和安装](#how-to-download-build-and-install)
- [Linux](#linux)
- [Windows](#windows)
- [macOS](#macos)
- [Android](#android)
- [在 Linux 上运行 Docker 容器](#running-docker-container-on-linux)
- [OpenWrt](#openwrt)
- [MikroTik 路由器](#mikrotik-routers)
- [注意事项和建议](#caveats-and-recommendations)
- [下载](#download)
- [致谢](#credits)
- [支持开发者和项目](#support-the-developer-and-the-project)
## 功能概览
最初作为一个快速的个人解决方案构建,该项目已发展成为一个功能齐全的工具,具有以下能力:
* **针对 WireGuard 的专用设计**
该混淆器是专为 WireGuard 协议构建的:它能识别 WireGuard 数据包类型,并主动监控握手是否成功以确保可靠运行。
* **基于密钥的混淆**
混淆是使用用户指定的密钥执行的。虽然这可以说使其更像加密,但请注意,提供强大的密码学保证并不是这里的目标 —— WireGuard 本身已经处理了安全加密。密钥的目的是让你的流量看起来不可识别,而不是不可破解。
* **对称操作**
该工具会自动检测数据包是否经过混淆,并相应地处理它们。
* **握手随机化**
WireGuard 握手数据包填充了随机虚拟数据,因此其混淆后的大小差异显著。这使得监控流量的任何人难以发现模式或可靠地识别握手。即使是数据包,其大小也可以增加几个随机字节。
* **伪装**
从 1.4 版本开始,该项目引入了伪装支持:将流量伪装成其他协议的能力。当 DPI 仅允许白名单协议时,这特别有用。目前,唯一可用的选项是 STUN 仿真。由于 STUN 通常用于视频通话,因此很少被阻止。
* **非常快速和高效**
混淆器的设计速度极快,CPU 和内存开销极小。它可以处理高流量负载,而不会出现明显的性能下降。
* **内置 NAT 表**
该应用程序具有高性能的内置 NAT 表。这允许数百个客户端连接到单个服务器端口,同时保持快速、高效的转发。每个客户端的地址和端口都映射到唯一的服务器端端口。
* **静态(手动)绑定 / 双向模式**
你可以手动定义静态 NAT 表条目,从而实现“双向”模式 —— 允许两个 WireGuard 对等端通过混淆器相互发起连接。
* **多段配置文件**
支持简单的配置文件和命令行参数,以便进行快速的一次性运行或高级自动化。你可以在单个配置文件中定义多个混淆器实例。
* **详细且可自定义的日志记录**
详细程度范围从仅错误输出到完整的数据包级跟踪,以进行高级故障排除和分析。
* **跨平台和轻量级**
提供 Linux、Windows 和 Mac 的二进制文件,以及极小的多架构 Docker 镜像(amd64、arm64、arm/v7、arm/v6、386、ppc64le、s390x)。这些镜像非常小,甚至适合 MikroTik 等嵌入式路由器。
* **极低的依赖占用**
不需要大型外部库或框架。
* **Android 客户端**
提供了一个非常简单的混淆器 Android 移植版本:https://github.com/ClusterM/wg-obfuscator-android/ - 它允许你在 Android 设备(包括手机、平板电脑和 Android TV)上混淆 WireGuard 流量。
## 基本概念
```
┌────────────────┐ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐
| WireGuard peer | | WireGuard peer | | WireGuard peer | | WireGuard peer |
└───────▲────────┘ └───────▲────────┘ └────────▲───────┘ └───────▲────────┘
| | └──────┐ ┌─────┘
┌───────▼────────┐ ┌───────▼────────┐ ┌─────▼────▼─────┐
| Obfuscator | | Obfuscator | | Obfuscator |
└───────▲────────┘ └───────▲────────┘ └────────▲───────┘
| | |
┌───────▼──────────────────▼─────────────────────────────▼────────────────┐
| | | Internet | |
└───────▲──────────────────▲─────────────────────────────▲────────────────┘
| | |
| ┌───────▼────────┐ |
└─────────>| Obfuscator |<───────────────────┘
└───────▲────────┘
|
┌───────────▼────────────┐
| WireGuard server peer |
└────────────────────────┘
```
在大多数情况下,混淆器用于服务器(具有静态或公共 IP 地址)和客户端(可能位于 NAT 后面)明显分离的场景中。我们将在这里专注于此设置。
如果**两端**都有公共 IP 并且可以相互发起连接,请参阅下面的[“双向模式”](#two-way-mode)部分。
通常,混淆器与你的 WireGuard 客户端或服务器安装在同一设备上。在此设置中,你配置 WireGuard 连接到混淆器的地址和端口(通常是 `127.0.0.1` 和自定义端口),而*真正的*远程地址和端口则在混淆器的配置中指定。
例如,一个标准的 WireGuard 客户端配置:
```
[Peer]
Endpoint = example.com:19999
```
将变为:
```
[Peer]
Endpoint = 127.0.0.1:3333
```
混淆器将像这样启动/配置:
```
source-lport = 3333
target = example.com:19999
```
在**服务器**端,WireGuard 配置:
```
[Interface]
ListenPort = 19999
```
将更改为:
```
[Interface]
ListenPort = 5555
```
混淆器将使用以下配置运行:
```
source-lport = 19999
target = 127.0.0.1:5555
```
该应用程序维护自己的内部地址映射表,因此单个服务器端混淆器可以使用一个服务器端口处理来自多个客户端的连接 —— 每个客户端都有自己的混淆器实例。同样,在客户端,单个混淆器可以支持到多个对等端的连接(尽管在典型用途中很少需要)。
混淆器会自动确定每个数据包的方向(混淆或去混淆),因此客户端和服务器端上的配置文件看起来几乎完全相同。唯一重要的是双方使用相同的密钥。
**密钥**只是一个纯文本字符串。这里不需要密码学强度:你可以自由使用任何常用词或短语(越长越好,但实际上通常四五个字符就足够了)。最重要的是,你的密钥不能和其他人的相同!
## 配置
### 命令行参数和配置文件
可以通过命令行配置或使用配置文件来运行混淆器。可用的命令行参数有:
* `-?` 或 `--help`
显示描述所有命令行参数的帮助消息并退出。
* `-V` 或 `--version`
打印版本信息并退出。
* `-c ` 或 `--config=`
配置文件的路径,可以用来代替其余的参数。
* `-i ` 或 `--source-if=`
要监听的源接口。可选,默认为 `0.0.0.0`,即所有接口。可用于仅监听特定接口。
* `-p ` 或 `--source-lport=`
要监听的源端口。源客户端应连接到此端口。必需。
* `-t ` 或 `--target=`
`address:port` 格式的目标地址和端口。所有混淆/去混淆的数据都将转发到此地址。必需。
* `-k ` 或 `--key=`
混淆密钥。只是一个字符串。越长越好。必需,长度必须为 1-255 个字符。
* `-a ` 或 `--masking=`
用于伪装流量的协议伪装类型。可选,默认为 `AUTO`。支持的值:`STUN`、`AUTO`、`NONE`。有关详细信息,请参阅[“伪装”](#masking)。
* `-b ` 或 `--static-bindings=`
用于双向模式的逗号分隔的静态绑定,格式为 `::`。有关详细信息,请参阅[“双向模式”](#two-way-mode)。
* `-f ` 或 `--fwmark=`
要在所有数据包上设置的防火墙标记。可用于防止路由环路。可选,默认为 `0`(即禁用)。可以是 `0`-`65535` 或 `0x0000`-`0xFFFF`。
* `-v ` 或 `--verbose=`
详细程度级别。可选,默认为 `INFO`。可接受的值为:
`ERRORS`(仅关键错误)
`WARNINGS`(重要消息)
`INFO`(信息性消息:状态消息、连接已建立等)
`DEBUG`(详细的调试消息)
`TRACE`(非常详细的调试消息,包括数据包转储)
高级用户的附加参数:
* `-m ` 或 `--max-clients=`
最大客户端数。这是可以同时连接到混淆器的最大客户端数。如果达到限制,将拒绝新客户端。可选,默认为 `1024`。
* `-l ` 或 `--idle-timeout=`
最大空闲超时(以秒为单位)。这是客户端在断开连接之前可以保持空闲的最长时间(以秒为单位)。如果客户端在此时间内没有发送任何数据包,它将被断开连接。可选,默认为 `300` 秒(5 分钟)。
* `-d ` 或 `--max-dummy=`
数据包的最大虚拟长度。这是可以添加到数据包的虚拟数据的最大长度(以字节为单位)。用于混淆流量并使其更难检测。该值必须介于 `0` 和 `1024` 之间。如果设置为 `0`,则不会添加虚拟数据。默认为 `4`。注意:带有虚拟字节的数据包总大小将限制为 1024 字节。
你可以使用 `--config` 参数指定配置文件,这允许你以 `key=value` 格式设置所有这些参数。例如:
```
# Instance 名称
[main]
source-lport = 13255
target = 10.13.1.100:13255
key = love
static-bindings = 1.2.3.4:12883:6670, 5.6.7.8:12083:6679
verbose = 2
# 您可以指定多个 Instance
[second_server]
source-if = 0.0.0.0
source-lport = 13255
target = 10.13.1.100:13255
key = hate
verbose = 4
```
如你所见,配置文件允许你为多个混淆器实例定义设置。这使得从单个配置文件运行具有不同设置的多个混淆器实例变得容易。
请务必查看下面的[注意事项和建议](#caveats-and-recommendations)部分,了解有关配置和用法的重要说明。
### 避免路由环路
使用 WireGuard 时,尤其是结合 WireGuard Obfuscator 等工具时,重要的是确保**不会意外地将通往 VPN 服务器本身的流量通过 VPN 隧道路由**。否则,你可能会在握手后立即遇到路由环路或完全断开连接。
#### 为什么以及何时会发生这种情况
WireGuard 根据 `AllowedIPs` 列表路由数据包。通常,它会自动排除服务器的 IP 地址(`Endpoint` 字段中指定的),以避免通过隧道本身路由握手和保活数据包。
然而,当你使用本地运行的 WireGuard Obfuscator(例如,在 `127.0.0.1` 上)时,**WireGuard 只能看到混淆器的本地地址**,而看不到 VPN 服务器的实际公共 IP。它不知道真正的服务器端点,该端点隐藏在混淆器的配置中。
当对等端配置为以下情况时,这会成为一个问题:
```
AllowedIPs = 0.0.0.0/0
```
即,当所有流量都通过 VPN 隧道路由时。在这种情况下,如果没有明确排除真正的服务器 IP,**WireGuard Obfuscator 可能会尝试通过隧道将其自己的流量发送到 VPN 服务器**,从而导致路由环路或连接丢失。
#### 通用解决方案:从 `0.0.0.0/0` 中手动排除服务器 IP
WireGuard 不支持否定语法(例如 `!203.0.113.45`)。为了避免将通往服务器的流量通过隧道路由,你可以**手动将 `0.0.0.0/0` 拆分为一组排除服务器 IP 的较小 CIDR 块**。
例如,如果你的服务器公共 IP 是 `203.0.113.45`,那么代替:
```
AllowedIPs = 0.0.0.0/0
```
你将使用:
```
AllowedIPs = 0.0.0.0/1, 128.0.0.0/2, 224.0.0.0/3, 208.0.0.0/4, 192.0.0.0/5,
204.0.0.0/6, 200.0.0.0/7, 202.0.0.0/8, 203.128.0.0/9, 203.64.0.0/10,
203.32.0.0/11, 203.16.0.0/12, 203.8.0.0/13, 203.4.0.0/14, 203.2.0.0/15,
203.1.0.0/16, 203.0.128.0/17, 203.0.0.0/18, 203.0.64.0/19, 203.0.96.0/20,
203.0.120.0/21, 203.0.116.0/22, 203.0.114.0/23, 203.0.112.0/24,
203.0.113.128/25, 203.0.113.64/26, 203.0.113.0/27, 203.0.113.48/28,
203.0.113.32/29, 203.0.113.40/30, 203.0.113.46/31, 203.0.113.44/32
```
这个长列表将所有流量通过隧道路由,**除了**服务器的 IP(`203.0.113.45`),后者留在隧道外并避免了环路。
你可以使用以下脚本自动计算子网列表:
[https://colab.research.google.com/drive/1spIsqkB4YOsctmZV83aG1HKISFFxxMCZ](https://colab.research.google.com/drive/1spIsqkB4YOsctmZV83aG1HKISFFxxMCZ)
#### Linux 特定解决方案:使用 `fwmark`
在 Linux 上,有一种更简洁的方法(自 1.4 版起):使用 WireGuard 配置中的 `FwMark` 选项。这**仅当 `AllowedIPs = 0.0.0.0/0` 时才有用**,因为它允许系统区分通过隧道的流量和建立或维护隧道所需的流量(,握手数据包)。
WireGuard 配置示例:
```
[Interface]
FwMark = 0xdead
```
然后,在 **WireGuard Obfuscator** 中,指定相同的标记:
* 在配置文件中:
fwmark = 0xdead
* 或通过命令行:
--fwmark 0xdead
### 伪装
从 1.4 版开始,提供了伪装支持 —— 将流量伪装成其他协议的能力。当 DPI 仅允许白名单协议时,这特别有用。你可以使用配置文件中的 `masking` 选项或命令行上的 `--masking` 参数来设置伪装模式。
目前,唯一可用的选项是 STUN 仿真。由于 STUN 通常用于视频通话,因此很少被阻止。因此,目前支持的值为:
* `NONE`
完全不伪装。混淆器不会伪装传出流量,也不会识别或处理任何传入的伪装流量。
* `AUTO`
默认情况下,混淆器不会伪装传出流量。但是,如果来自客户端(在 'source-lport' 侧)的第一个数据包是伪装的,服务器将自动检测伪装类型并切换到该类型,从而允许客户端独立选择伪装模式。
* `STUN`
强制对传出流量使用 STUN 协议,并且仅接受经过 STUN 伪装的传入流量。
### 双向模式
(适用于高级用户)
在某些设置中,两个 WireGuard 对等端都有公共 IP 地址,并且都可以发起连接。在这种情况下,你需要两端都通过混淆器接受和发送连接。这就是**双向模式**的用武之地。
#### 什么是静态绑定?
**静态绑定**从启动时起就告诉混淆器,哪些对等端 IP 和端口应该映射到哪些本地端口。这使得混淆器能够确切地知道如何将数据包从服务器转发到正确的本地 WireGuard 实例 —— **即使该对等端尚未发送任何数据包。**
如果没有静态绑定,混淆器只有在看到来自客户端的流量后才会知道如何转发数据包。
#### 示例:带混淆的双向 WireGuard
假设你有两个对等端:
* **对等端 A**:公共 IP `1.2.3.4`,在本地端口 `1111` 上运行 WireGuard
* **对等端 B**:公共 IP `5.6.7.8`,在本地端口 `6666` 上运行 WireGuard
我们可以在两个对等端上设置混淆器:
* **对等端 A**:混淆器在端口 `2222` 上侦听本地 WireGuard 流量,并在端口 `3333` 上侦听来自**对等端 A** 的传入混淆握手。
* **对等端 B**:混淆器在端口 `4444` 上侦听来自**对等端 B** 的传入混淆握手,并在端口 `5555` 上侦听本地 WireGuard 流量。
**对等端 A WireGuard 配置**(`1.2.3.4`):
```
[Interface]
PrivateKey =
ListenPort = 1111
[Peer]
PublicKey =
Endpoint = 127.0.0.1:2222
```
**对等端 A 混淆器配置**(`1.2.3.4`):
```
source-lport = 2222
target = 5.6.7.8:4444
static-bindings = 127.0.0.1:1111:3333
key = your_secret_key
```
**对等端 B 混淆器配置**(`5.6.7.8`):
```
source-lport = 4444
target = 127.0.0.1:6666
static-bindings = 1.2.3.4:3333:5555
key = your_secret_key
```
**对等端 B WireGuard 配置**(`5.6.7.8`):
```
[Interface]
PrivateKey =
ListenPort = 6666
[Peer]
PublicKey =
Endpoint = 127.0.0.1:5555
```
在此示例中,该行:
```
static-bindings = 1.2.3.4:1111:3333
```
从视觉上看,它看起来像这样:
```
┌───────────────────────────┐ ┌───────────────────────────┐
│ Peer A (1.2.3.4) │ │ Peer B (5.6.7.8) │
│ ┌─────────────────┐ | │ ┌─────────────────┐ |
│ │ WireGuard │ | │ │ WireGuard │ |
│ │ ListenPort=1111 | | │ │ ListenPort=6666 | |
│ └─────▲───────────┘ | │ └─────▲───────────┘ |
│ │ │ │ │ │
│ ┌─────▼───────────────┐ │ │ ┌─────▼───────────────┐ │
│ │ source-lport=2222 | │ │ │ local port=5555 │ │
│ │ | │ │ │ │ │
│ │ Obfuscator | │ │ │ Obfuscator | │
│ │ static-bind | │ │ │ static-bind | │
│ │ 127.0.0.1:1111:3333 | │ │ │ 1.2.3.4:3333:5555 | │
│ │ | │ │ │ │ │
│ │ local port=3333 │ | │ │ source-lport=4444 | │
│ └─────▼───────────────┘ │ │ └─────▼───────────────┘ │
│ │ │ │ │ │
└────────┼──────────────────┘ └────────┼──────────────────┘
│ │
│ UDP/obfuscated traffic │
│<--------------------------------------->│
```
当**对等端 A** 与**对等端 B** 发起握手时:
1. **对等端 A** 上的 WireGuard 从端口 `1111` 向端口 `2222` 上的本地混淆器发送一个未混淆的握手 UDP 数据包。
2. **对等端 A** 上的混淆器使用密钥对数据包进行混淆,并将其发送到端口 `4444` 上的**对等端 B** 的混淆器,使用 `3333` 作为源端口。
3. **对等端 B** 的混淆器接收数据包,对其进行去混淆,并将其转发到端口 `6666` 上的**对等端 B** 的本地 WireGuard 实例,使用 `5555` 作为源端口。
4. **对等端 B** 的 WireGuard 处理握手,并从端口 `6666` 向端口 `5555` 上的混淆器发送响应。
5. **对等端 B** 的混淆器对响应进行混淆,并将其发送回端口 `3333` 上的**对等端 A** 的混淆器,使用 `4444` 作为源端口。
6. **对等端 A** 的混淆器对响应进行去混淆,并将其从端口 `2222` 转发到端口 `1111` 上的**对等端 A** 的 WireGuard。
7. **对等端 A** 的 WireGuard 处理响应,完成握手。
当**对等端 B** 与**对等端 A** 发起握手时,过程相同但顺序相反:
1. **对等端 B** 上的 WireGuard 从端口 `6666` 向端口 `5555` 上的本地混淆器发送一个未混淆的握手 UDP 数据包。
2. **对等端 B** 上的混淆器对数据包进行混淆,并将其发送到端口 `3333` 上的**对等端 A** 的混淆器,使用 `4444` 作为源端口。
3. **对等端 A** 的混淆器接收数据包,对其进行去混淆,并将其转发到端口 `1111` 上的**对等端 A** 的 WireGuard,使用 `2222` 作为源端口。
4. **对等端 A** 的 WireGuard 处理握手,并从端口 `1111` 向端口 `2222` 上的混淆器发送响应。
5. **对等端 A** 的混淆器对响应进行混淆,并将其发送到端口 `4444` 上的**对等端 B** 的混淆器,使用 `3333` 作为源端口。
6. **对等端 B** 的混淆器对数据包进行去混淆,并将其转发到端口 `6666` 上的**对等端 B** 的 WireGuard,使用 `5555` 作为源端口。
7. **对等端 B** 的 WireGuard 处理响应,完成握手。
#### 总结
通过静态绑定,每个混淆器都提前知道如何在服务器和本地 WireGuard 之间转发数据包,无论哪个对等端发起连接。这实现了完全双向的、对等的 WireGuard 隧道 —— *即使双方都可以随时发起连接。*
## 如何下载、构建和安装
请参阅下面的[下载](#download)部分以获取下载链接。
### Linux
在 Linux 上,可以将混淆器作为 systemd 服务安装,以便自动启动和管理。
要从源代码在 Linux 上构建和安装,只需运行:
```
make
sudo make install
```
这将把混淆器安装为 systemd 服务。
你可以使用以下命令启动它:
```
sudo systemctl start wg-obfuscator
```
配置文件位于:
`/etc/wg-obfuscator.conf`
#### 第三方包
- **`ALT Linux`** [**Sisyphus**](https://packages.altlinux.org/en/sisyphus/srpms/wg-obfuscator) 中的 *apt-rpm 包*
### Windows
你可以下载包含所有必需 DLL 库的随时可运行的二进制文件。
如果你想从源代码为 Windows 构建此工具,你需要 [MSYS2](https://www.msys2.org/) 和以下包:
* `base-devel`
* `gcc`
* `git`
安装所需的包,然后运行:
```
make
```
### macOS
你可以下载适用于 macOS x64 和 ARM 版本的随时可运行的二进制文件。
要从源代码构建 Obfuscator,只需键入:
```
make
```
### Android
提供了一个非常简单的混淆器 Android 移植版本:https://github.com/ClusterM/wg-obfuscator-android/ - 它允许你在 Android 设备(包括手机、平板电脑和 Android TV)上混淆 WireGuard 流量。
### 在 Linux 上运行 Docker 容器
WireGuard Obfuscator 可作为多架构 Docker 镜像使用:
**[Docker Hub 上的 clustermeerkat/wg-obfuscator](https://hub.docker.com/r/clustermeerkat/wg-obfuscator)**
**支持的标签:**
* **`latest`** - 始终指向最新的稳定版本。
* **`nightly`** - 从当前主分支自动构建;可能不稳定。仅用于测试新功能。
* **版本标签**(例如 `1.0`、`1.1`)- 用于特定版本。
**可用的架构:**
* `linux/amd64`
* `linux/arm64`
* `linux/arm/v7`
* `linux/arm/v6`
* `linux/arm/v5`
* `linux/386`
* `linux/ppc64le`
* `linux/s390x`
#### 示例:docker-compose.yml
```
version: '3.8'
services:
wg-obfuscator:
image: clustermeerkat/wg-obfuscator:latest
volumes:
- ./.wg-obfuscator.conf:/etc/wg-obfuscator/wg-obfuscator.conf
ports:
- "13255:13255/udp"
container_name: wg-obfuscator-container
restart: unless-stopped
```
* **`image`** 可以更改为使用特定标签(例如,`clustermeerkat/wg-obfuscator:1.1`)。
* 将你的配置作为 `.wg-obfuscator.conf` 放在 `docker-compose.yml` 所在的同一目录中,或者调整卷路径。
* **端口映射**(`13255:13255/udp`)必须与你的混淆器监听端口相对应。
#### 手动运行
你也可以直接运行容器:
```
docker run -d \
--name wg-obfuscator \
-v $PWD/.wg-obfuscator.conf:/etc/wg-obfuscator/wg-obfuscator.conf \
-p 13255:13255/udp \
clustermeerkat/wg-obfuscator:latest
```
### OpenWrt
WireGuard Obfuscator 可作为原生 OpenWrt 包使用,具有完整的 UCI 集成和可选的 LuCI Web 界面。
**📖 [完整的 OpenWrt 文档](docs/OPENWRT.md)**
该文档涵盖:
- 为你的路由器架构构建包
- 安装和配置
- LuCI Web 界面和 UCI 命令行设置
- 多实例配置
- 服务管理和故障排除
### MikroTik 路由器
WireGuard Obfuscator 可以在具有 **RouterOS 7.4+**(ARM64/x86_64)的 MikroTik 设备上作为 Docker 容器运行。
**📖 [完整的 MikroTik 文档](docs/MIKROTIK.md)**
该文档涵盖:
- 容器包安装
- 使用 veth 接口的网络配置
- 端口转发设置
- 容器部署和管理
- 故障排除
**要点:**
- 不需要外部磁盘
- 在内部存储上运行
- 适用于 CHR、CCR、RB5009 和其他 RouterOS 7.4+ 设备
## 注意事项和建议
* **端点排除和路由环路:**
有关如何防止路由环路的详细信息,请参阅上面的[“避免路由环路”](#avoiding-routing-loops)部分。重要的是确保通往 VPN 服务器本身的流量没有通过 VPN 隧道路由。
* **PersistentKeepalive:**
为了保持稳定的连接 —— 特别是当客户端位于 NAT 或防火墙后面时 —— 建议使用 WireGuard 的 `PersistentKeepalive` 选项。`25` 秒的值通常就足够了。
* **初始握手要求:**
启动混淆器后,在建立成功的握手之前,WireGuard 对等端之间不会有流量流动。
如果你**不**重新启动 WireGuard 本身而重启混淆器,对等端可能需要一些时间才能重新建立握手并恢复流量。你可以通过短暂切换 WireGuard 接口来加快此过程。
* **MTU 设置:**
如果你遇到数据包丢失问题(你可以在 DEBUG 级别日志中看到 `recv` 或 `recvfrom` 错误),请确保你的 WireGuard 配置具有适当的 MTU 设置。特别是当使用伪装时(它会向每个数据包添加额外的字节),你可能需要减小 MTU。常见的设置是 `MTU = 1420`,但你需要根据网络条件减小它。
* **IPv6 支持:**
混淆器目前不支持 IPv6。它仅适用于 IPv4 地址和端口。
* **检查调试日志:**
如果遇到问题,请使用 `--verbose=DEBUG`(DEBUG 级别)运行混淆器以查看详细日志。这有助于诊断许多常见问题。
## 下载
* 你始终可以在以下位置找到最新版本(源代码、Docker 镜像以及适用于 Linux、Windows 和 macOS 的现成二进制文件):
https://github.com/ClusterM/wg-obfuscator/releases
* 此外,你可以在以下位置下载自动 CI 构建:
https://clusterm.github.io/wg-obfuscator/
仅当你想测试尚未发布的新功能或错误修复时才下载它。可能会有错误或不稳定,使用风险自负!
* Android 移植版本:
https://github.com/ClusterM/wg-obfuscator-android
## 致谢
* 我:[Cluster](https://github.com/ClusterM),电子邮件:cluster@cluster.wtf
* [WireGuard](https://www.wireguard.com/) - 该工具旨在混淆的 VPN 协议。
* [uthash](https://troydhanson.github.io/uthash/) - 一个用于哈希表的出色 C 库,用于 NAT 表。
## 支持开发者和项目
* [GitHub Sponsors](https://github.com/sponsors/ClusterM)
* [Buy Me A Coffee](https://www.buymeacoffee.com/cluster)
* [Sber](https://messenger.online.sberbank.ru/sl/Lnb2OLE4JsyiEhQgC)
* [Donation Alerts](https://www.donationalerts.com/r/clustermeerkat)
* [Boosty](https://boosty.to/cluster)
标签:AWS, DPI, LangChain, UDP, VPN, VPS, WireGuard, 二进制发布, 去中心化, 反审查, 安全合规, 客户端加密, 开源工具, 抗封锁, 无依赖, 流量伪装, 流量绕过, 深度包检测, 混淆, 穿透, 网络代理, 网络安全, 网络安全, 网络安全分析, 请求拦截, 路由器, 轻量级, 隐私保护, 隐私保护