masterking32/MasterDnsVPN
GitHub: masterking32/MasterDnsVPN
一款基于自定义 ARQ 协议的高级 DNS 隧道 VPN 工具,专为高丢包和严格审查网络设计,提供加密与负载均衡支持。
Stars: 168 | Forks: 21
# 🚀 MasterDnsVPN 项目
## [نسخه فارسی](https://github.com/masterking32/MasterDnsVPN/blob/main/README_FA.MD) | [English Version](https://github.com/masterking32/MasterDnsVPN/blob/main/README.MD) | [Spanish Version](https://github.com/masterking32/MasterDnsVPN/blob/main/README_ES.MD)
**MasterDnsVPN** 项目是一个健壮、低开销且先进的解决方案,通过将 TCP 流量隐藏并封装在 DNS 查询中来绕过互联网审查和过滤。
该系统专为绕过严格的防火墙和严重的网络限制而设计,在这些环境下,传统的 VPN 协议,甚至是知名的 DNS 隧道服务(如 **DNSTT** 和 **SlipStream**)由于大规模的干扰和 DNS 解析器的限制而被阻断或失效。
**MasterDnsVPN** 的主要目标是提供一个安全、可靠且灵活的隧道,最大限度地减少协议开销,即使在遭受高丢包率或严格 MTU 限制的网络中也能提供稳定、可接受的性能。
❌ 免责声明:本项目仅供教育和研究目的。使用它可能会破坏网络结构,禁止利用它来规避国家法律。我们对此类行为不承担任何责任。
## ✨ 关键特性与优势
- 🛡️ **绕过严格审查:** 专为提高穿透那些拦截标准 VPN 协议的防火墙和限制性网络策略的概率而设计。
- ⚡ **负载均衡与解析器多样性:** 支持多种 DNS 解析器,并采用先进的包负载均衡策略(包括随机、轮询 和最少丢包)。
- 📡 **数据包复制(多路径):** 能够同时通过多个路径(不同的解析器和域)发送相同的数据包。无论哪个数据包先到达都会被处理;如果一个数据包在一条路径上丢失,其副本会通过另一条路径安全到达。这种技术增加了带宽使用,但在高度干扰的网络中显著提高了可靠性和稳定性(可调节且可禁用)。
- 🔄 **自定义 ARQ 协议与开销优化:** 在 UDP/DNS 之上实现了一个自定义 ARQ(自动重传请求)层,用于数据包重传和排序,而不是依赖 QUIC。这消除了 QUIC 的沉重开销,降低了所需的 MTU,并确保与不支持 EDNS 或具有低 MTU 限制的解析器兼容。数据包结构被最小化以减少应用侧的开销。
- 🔐 **强安全性与灵活加密:** 支持多种强大的加密方法以确保用户隐私,包括:`XOR`、`ChaCha20`、`AES-128-GCM`、`AES-192-GCM` 和 `AES-256-GCM`。
- 🧰 **自动扫描与 MTU 探测:** 执行时,客户端会自动扫描所有配置的解析器,测试其质量,显示结果,并为您网络路径计算最佳的 MTU。
- 🌐 **TCP 多路复用:** 将多个本地 TCP 连接多路复用到单个 DNS 会话上,以实现最佳资源管理。
- 🗜️ **小包压缩/打包:** 如果配置,系统可以将多个小包合并为一个直到 MTU 限制的有效载荷。这大大减少了出站 DNS 请求的数量,并为实际有效载荷数据释放了空间。
- 🧦 **专用 SOCKS5 优化:** 在最近的版本中,针对 SOCKS5 进行了特定的优化。系统自动处理 SOCKS5 转发,无需安装第三方代理工具(如 X-UI 或 Dante)。此外,将协议设置为 SOCKS5 会剥离隧道中冗余的 SOCKS 握手包,从而显著减少流量。
- 🚀 **转发各种 TCP 协议:** 除了高度优化的 SOCKS5 集成外,您还可以转发其他基于 TCP 的服务,如 `VLESS`、`ShadowSocks`、`VMESS` 等。
# 🧑💻 设置指南
## 🛠️ 第 1 部分:网络前置条件(DNS 配置)
为了让您的服务器直接接收和处理 DNS 查询,您必须将一个子域委派给您的专用服务器。登录您域名的 DNS 管理面板(例如 Cloudflare, ArvanCloud)并创建以下两条记录:
### 🅰️ 步骤 1.1:创建 A 记录(服务器 IP)
首先,创建一个指向您服务器公网 IPv4 地址的 `A` 记录。
- **类型:** `A`
- **名称:** 一个简短的、任意的名称(例如 `ns`)
- **IPv4 地址:** 您服务器的 IP 地址(例如 `1.2.3.4`)
### 🏷️ 步骤 1.2:创建 NS 记录(隧道子域)
接下来,创建一个 `NS`(名称服务器)记录。这告诉互联网,您在上一步中定义的服务器负责处理该特定子域的查询。
- **类型:** `NS`
- **名称:** 主隧道子域(例如 `v`)
- **目标/名称服务器:** 您在步骤 1.1 中创建的 A 记录(例如 `ns.example.com`)
## ⚠️ 第 1.3 部分:重要警告(Cloudflare 用户)
如果您使用的是 Cloudflare,`A` 记录的代理状态**必须**设置为 **DNS only(灰云 ☁️)**。如果启用了代理(橙云),Cloudflare 将阻止 UDP 端口 53 的流量,您的隧道将**完全无法工作**!
## 💡 第 1.4 部分:速度黄金法则(MTU)
在 DNS 协议中,域名的长度会占用每个数据包非常有限的有效载荷容量的一部分。使用**更短**的域名和子域名(例如 `v.ex.com` 而不是 `tunnel.my-long-domain.com`)会为实际用户有效载荷留出更多空闲空间。这直接带来更高的带宽、更快的速度和更少的连接中断。
## 🚀 第 2 部分:安装与执行(客户端与服务端)
您可以使用两种方法安装和运行本项目:快速、预编译的自动化方法(推荐),或直接从 Python 源代码运行。
### 🐧 步骤 2.1:快速 Linux 服务器设置
如果您想在 Linux 机器上设置服务器,最简单的方法是使用自动安装脚本。只需在您的服务器终端中运行以下命令:
```
bash <(curl -Ls https://raw.githubusercontent.com/masterking32/MasterDnsVPN/main/server_linux_install.sh)
```
此命令从 GitHub 下载脚本,并自动处理整个安装和配置过程。完成后,服务器将启动,终端日志中将显示一个**加密密钥**。请务必复制此密钥(为方便起见,它也保存在服务器可执行文件旁的 `encrypt_key.txt` 中),因为连接客户端时需要它。
### 步骤 2.2:使用预编译的客户端二进制文件(✅ 推荐)
为了方便起见,客户端可执行文件(以及其他操作系统的服务器)已经预编译好。只需下载适合您操作系统的正确版本并解压 ZIP 文件。
#### 📤 MasterDnsVPN 客户端下载链接
| 操作系统 (OS) | 架构 | 适用对象... | 直接下载链接 |
| :--- | :--- | :--- | :--- |
| Windows 🪟 | `AMD64` (64-bit) | Windows 10 & 11 | [下载 Windows 版本 ⬇️](https://github.com/masterking32/MasterDnsVPN/releases/latest/download/MasterDnsVPN_Client_Windows_AMD64.zip) |
| macOS 🍎 | `ARM64` | 新款 Mac (M1 / M2 / M3) | [下载 Mac (Apple Silicon) 版本 ⬇️](https://github.com/masterking32/MasterDnsVPN/releases/latest/download/MasterDnsVPN_Client_MacOS_ARM64.zip) |
| Linux 🐧 | `AMD64` (64-bit) | 较新的发行版 (Ubuntu 22.04+, Debian 12+) | [下载 Linux (新版) ⬇️](https://github.com/masterking32/MasterDnsVPN/releases/latest/download/MasterDnsVPN_Client_Linux_AMD64.zip) |
| Linux (旧版) 🐧 | `AMD64` (64-bit) | 较旧的发行版 (Ubuntu 20.04, Debian 11) | [下载 Linux (旧版) ⬇️](https://github.com/masterking32/MasterDnsVPN/releases/latest/download/MasterDnsVPN_Client_Linux-Legacy_AMD64.zip) |
| Linux (ARM) 🐧 | `ARM64` | ARM 服务器, Raspberry Pi 等 | [下载 Linux (ARM) 版本 ⬇️](https://github.com/masterking32/MasterDnsVPN/releases/latest/download/MasterDnsVPN_Client_Linux_ARM64.zip) |
*(Windows 和 Mac 用户可以解压文件并立即进入第 3 部分进行配置)。*
#### 📤 MasterDnsVPN 服务端下载链接
*(仅当您未使用快速安装脚本时)*
| 操作系统 (OS) | 架构 | 适用对象... | 直接下载链接 |
| :--- | :--- | :--- | :--- |
| Windows 🪟 | `AMD64` (64-bit) | Windows Server, Windows 10 & 11 | [下载 Windows 服务端 ⬇️](https://github.com/masterking32/MasterDnsVPN/releases/latest/download/MasterDnsVPN_Server_Windows_AMD64.zip) |
| Linux 🐧 | `AMD64` (64-bit) | Ubuntu 22.04+, Debian 12+ 服务器 | [下载 Linux 服务端 (新版) ⬇️](https://github.com/masterking32/MasterDnsVPN/releases/latest/download/MasterDnsVPN_Server_Linux_AMD64.zip) |
| Linux (旧版) 🐧 | `AMD64` (64-bit) | 较旧的服务器 (Ubuntu 20.04, Debian 11) | [下载 Linux 服务端 (旧版) ⬇️](https://github.com/masterking32/MasterDnsVPN/releases/latest/download/MasterDnsVPN_Server_Linux-Legacy_AMD64.zip) |
| Linux (ARM) 🐧 | `ARM64` | ARM 云服务器 | [下载 Linux 服务端 (ARM) ⬇️](https://github.com/masterking32/MasterDnsVPN/releases/latest/download/MasterDnsVPN_Server_Linux_ARM64.zip) |
| macOS 🍎 | `ARM64` | 新款 Mac (M1 / M2 / M3) | [下载 Mac 服务端 (Apple Silicon) ⬇️](https://github.com/masterking32/MasterDnsVPN/releases/latest/download/MasterDnsVPN_Server_MacOS_ARM64.zip) |
### 步骤 2.2.1:Linux 上的解压与准备 🐧
在 Linux 上,下载 ZIP 文件后,确保您拥有所需的解压和文本编辑工具:
```
sudo apt update
sudo apt install unzip nano
```
解压下载的 ZIP(根据您下载的版本更改文件名):
```
# 解压客户端(或服务端)
unzip MasterDnsVPN_Client_Linux_AMD64.zip
# 列出解压后的文件
ls
```
在 Linux 和 macOS 上,您必须授予二进制文件执行权限。输入 `ls` 命令输出的确切文件名:
```
chmod +x MasterDnsVPN_Client_Linux_AMD64
```
现在,使用 `nano` 编辑器打开配置文件(`client_config.toml` 或 `server_config.toml`)并填写您的详细信息(配置变量请参考第 3 部分):
```
nano client_config.toml
```
保存配置后,运行程序:
```
./MasterDnsVPN_Client_Linux_AMD64
```
### 步骤 2.3:Python 源代码设置(面向开发者 🧑💻)
要运行源代码,必须安装 Python。在您的终端中运行以下命令:
```
# 克隆仓库并安装依赖
git clone https://github.com/masterking32/MasterDnsVPN.git
cd MasterDnsVPN
pip install -r requirements.txt
# 复制配置模板
cp server_config.toml.simple server_config.toml
cp client_config.toml.simple client_config.toml
cp client_resolvers.simple.txt client_resolvers.txt
# 编辑配置,然后运行 server 或 client
python server.py
python client.py
```
# 第 3 部分:配置结构 (Config) ⚙️
## 第 3.1 部分:快速客户端设置与运行 🚀
如果您使用快速安装脚本(步骤 2.1)启动了服务器,您只需在客户端机器上编辑 `client_config.toml`。您必须配置的三个主要参数是:
1. **`ENCRYPTION_KEY`**:粘贴服务器终端中显示的加密密钥(或在服务器上的 `encrypt_key.txt` 中找到)。没有此密钥,连接将被拒绝!
2. **`DOMAINS`**:准确输入您的隧道子域(例如 `["v.example.com"]`)。**注意:** 目前仅提供**一个**域名。多域名支持将在未来的更新中完成。
3. **`client_resolvers.txt`**:解析器列表文件。支持的行格式为 `IP`、`IP:PORT`、`CIDR` 和 `CIDR:PORT`(例如 `8.8.8.8`、`8.8.8.8:5353`、`1.1.1.0/24`、`1.1.1.0/24:99`)。空行/无效行将被跳过。如果文件丢失或没有有效条目,客户端启动将失败。
## 第 3.2 部分:服务器配置(手动安装) ⚙️
如果您**没有**使用步骤 2.1 中的脚本,并且想手动配置服务器,请编辑 `server_config.toml` 文件。确保加密方法和域名等关键参数在服务器和客户端上**完全**匹配。
## 第 3.3 部分:客户端配置变量 (`client_config.toml`) 📄
下表解释了客户端中所有可用的设置及其功能:
| 参数 | 默认值 | 接受值 | 描述 |
|---------|--------------|------------------|-------|
| `PROTOCOL_TYPE` | `"SOCKS5"` | `"SOCKS5"`, `"TCP"` | **隧道协议类型:**
• `"SOCKS5"`:
强烈推荐。此项目中的 SOCKS 代码经过高度优化,可实现最大速度。
• `"TCP"`:
用于转发原始端口/协议,如 VLESS 或 OpenVPN(开销较高)。
**注意**:必须与服务器设置匹配。 | | `DOMAINS` | `["v.domain.com"]` | 数组列表 (e.g., `["sub.site.com"]`) | 在第 1 部分中配置的
NS
子域。这在客户端和服务器上必须完全相同。
目前避免添加多个域名! | | `DATA_ENCRYPTION_METHOD` | `1` | `0` 到 `5` | **加密算法:**
`0`: 禁用(无安全性)
`1`: XOR 算法(推荐 - 高速度,中等安全性)
`2`: ChaCha20
`3`: AES-128-GCM
`4`: AES-192-GCM
`5`: AES-256-GCM(最高安全性,最低速度) | | `ENCRYPTION_KEY` | `""` | 字符串 与服务器匹配的加密密钥。没有此密钥连接将失败。 | | `BASE_ENCODE_DATA` | `false` | `true` 或 `false` | 在数据包传输前添加 DNS 安全的基编码。通常保持 `false`;启用它会增加开销并可能降低吞吐量。 | | `LISTEN_IP` | `"0.0.0.0"` | 有效 IP (e.g., `127.0.0.1`) | 客户端监听的本地 IP 地址。
• `"127.0.0.1"`: 仅限本地设备(更安全)
• `"0.0.0.0"`: 本地网络上的所有设备均可访问 | | `LISTEN_PORT` | `1080` | 端口号 (e.g., `1080`) | 客户端监听的端口,以便您的应用程序(浏览器, Telegram)可以连接。 | | `SOCKS5_AUTH` | `true` | `true` 或 `false` | 启用本地
SOCKS5
身份验证。(如果为 `false`,连接到您的代理不需要用户/密码)。**注意:** 此设置仅用于您本地机器的安全,与隧道连接无关。它仅在协议设置为
SOCKS5
时有效。 | | `SOCKS5_USER` | `"master_dns_vpn"` | 自定义字符串 | 本地 SOCKS 代理的用户名(如果 `SOCKS5_AUTH` 处于活动状态)。 | | `SOCKS5_PASS` | `"master_dns_vpn"` | 自定义字符串 | 本地 SOCKS 代理的密码(如果 `SOCKS5_AUTH` 处于活动状态)。 | | `SOCKS_HANDSHAKE_TIMEOUT` | `300.0` | 浮点数 (秒) | 本地 SOCKS 流在客户端中止之前完成激活所允许的最大时间。在慢速/丢包链路上增加此值以避免握手期间的误判关闭。 | | `client_resolvers.txt` (文件) | 包含在发布 ZIP 中 | `IP`, `IP:PORT`, `CIDR`, `CIDR:PORT` 每行一个 | 解析器源已从配置移至文件。空行/无效行将被跳过。如果文件丢失或未包含有效条目,客户端将退出并报错。 | | `PACKET_DUPLICATION_COUNT` | `2` | 正整数 (`1` 表示关闭, `2`, `3`+) | 数据包复制的次数。对于不稳定链路,`2` 是推荐的起始点。较高的值会迅速增加带宽和 CPU 压力。 | | `STREAM_RESOLVER_FAILOVER_RESEND_THRESHOLD` | `2` | 正整数 | 在同一个流连续发生此数量的 `STREAM_RESEND` 事件后,如果存在另一个健康的解析器,客户端将切换该流的首选解析器。 | | `STREAM_RESOLVER_FAILOVER_COOLDOWN` | `1.0` | 浮点数 (秒) | 同一流的首选解析器切换之间的最短时间。防止在丢包情况下解析器频繁抖动。 | | `MAX_PACKETS_PER_BATCH` | `100` | 正整数 | 合并到一个 DNS 操作中的最大小控制包数量。`1` 表示禁用批处理。有效运行时限制也受协商 MTU 的上限约束。 | | `RESOLVER_BALANCING_STRATEGY` | `2` | `1`, `2`, `3`, `4` | **负载均衡策略:**
`1`: **随机**
`2`: **轮询**
`3`: **最少丢包**
`4`: **最低延迟** | | `DNS_QUERY_TIMEOUT` | `5.0` | 浮点数 (秒) | 在认为标准 DNS 响应丢失并重试之前等待的时间。 | | `UPLOAD_COMPRESSION_TYPE` | `0` | `0`, `1`, `2`, `3` | 客户端到服务端的有效载荷压缩:
`0`: 关闭
`1`: ZSTD
`2`: LZ4
`3`: ZLIB | | `DOWNLOAD_COMPRESSION_TYPE` | `0` | `0`, `1`, `2`, `3` | 服务端到客户端的有效载荷压缩。使用与上传压缩相同的枚举。 | | `MIN_UPLOAD_MTU` | `70` | 整数 (字节) | 解析器必须具备的最小上传
MTU
才能被利用。低于此阈值的解析器将被丢弃。设置为 `0` 以禁用。详情请参阅第 3.5 部分。 | | `MIN_DOWNLOAD_MTU` | `150` | 整数 (字节) | 解析器必须具备的最小下载
MTU
才能被利用。低于此阈值的解析器将被丢弃。设置为 `0` 以禁用。请参阅第 3.5 部分。 | | `MAX_UPLOAD_MTU` | `150` | 整数 (字节) | 自动探测阶段使用的最大上传
MTU
。应低于您网络上最大可靠 MTU。请参阅第 3.5 部分。 | | `MAX_DOWNLOAD_MTU` | `200` | 整数 (字节) | 自动探测阶段使用的最大下载
MTU
。应低于您网络上最大可靠下游 MTU。请参阅第 3.5 部分。 | | `MTU_TEST_RETRIES` | `2` | 整数 (e.g., `1`, `2`, `3`+) | 如果 MTU 测试失败的重试次数。对于严重过滤的网络,建议增加到 3 或 4,以防止丢弃暂时延迟的服务器。
**警告:** 会显著增加初始启动时间,但能极大提高准确性。 | | `MTU_TEST_TIMEOUT` | `2.0` | 浮点数 (秒) | 等待 MTU 响应的超时时间(秒)。在非常高延迟的网络上进一步增加此值。
**警告:** 较高的超时意味着如果数据包丢失,启动过程会变慢。 | | `AUTO_SCALE_PROFILES` | `true` | `true` 或 `false` | 根据解析器/域名列表的大小自动调整启动 MTU 扫描和非活动解析器重新检查行为。 | | `MTU_TEST_PARALLELISM` | `6` | 正整数 | 初始 MTU 扫描期间并行测试的解析器-域名对数量。较高的值可加快启动速度,但会增加临时的 CPU/网络负载。 | | `SAVE_MTU_SERVERS_TO_FILE` | `false` | `true` 或 `false` | 如果启用,将成功的 MTU 测试解析器写入文本文件。 | | `MTU_SERVERS_FILE_NAME` | `"masterdnsvpn_success_test_{time}.txt"` | 字符串 | 保存 MTU 结果的输出文件名。如果存在,`{time}` 将被替换为时间戳。 | | `MTU_SERVERS_FILE_FORMAT` | `"{IP} - UP: {UP_MTU} DOWN: {DOWN-MTU}"` | 字符串 | 成功进行 MTU 测试的解析器的每行模板。支持占位符,如 `{IP}`, `{UP_MTU}`, `{DOWN-MTU}`, `{DOMAIN}` 和 `{TIME}`。 | | `MTU_USING_SECTION_SEPARATOR_TEXT` | `"---- Active MTU Testing Results ----"` | 字符串 | 初始 MTU 扫描完成后追加一次的可选分隔符文本。空字符串表示禁用。 | | `MTU_REMOVED_SERVER_LOG_FORMAT` | `"IP {IP} removed from list at {TIME} due to {CAUSE}"` | 字符串 | 当服务器在运行时被自动禁用时,追加到 MTU 输出文件的可选行。空字符串表示禁用。 | | `MTU_ADDED_SERVER_LOG_FORMAT` | `"Server {IP} re-added at {TIME} (UP MTU: {UP_MTU}, DOWN MTU: {DOWN_MTU})"` | 字符串 | 当非活动服务器被重新添加时,追加到 MTU 输出文件的可选行。空字符串表示禁用。 | | `AUTO_DISABLE_TIMEOUT_SERVERS` | `true` | `true` 或 `false` | 如果在配置的观察窗口内某个解析器-域名对显示 100% 超时,而其他活动解析器仍然存在,则在运行时自动禁用该对。 | | `AUTO_DISABLE_TIMEOUT_WINDOW_SECONDS` | `120` | 浮点数/整数 (秒) | 运行时超时健康卫士使用的滑动观察窗口。 | | `AUTO_DISABLE_TIMEOUT_MIN_OBSERVATIONS` | `3` | 正整数 | 在客户端禁用解析器-域名对之前所需的最小超时/成功观察次数。 | | `AUTO_DISABLE_CHECK_INTERVAL_SECONDS` | `1.0` | 浮点数 (秒) | 评估解析器超时窗口的运行时健康工作线程的轮询间隔。 | | `RECHECK_INACTIVE_SERVERS_ENABLED` | `true` | `true` 或 `false` | 启用对未通过 MTU 验证或在运行时被禁用的解析器进行定期后台重新检查。 | | `RECHECK_INACTIVE_INTERVAL_SECONDS` | `300` | 浮点数/整数 (秒) | 完整非活动解析器重新检查周期之间的间隔。 | | `RECHECK_SERVER_INTERVAL_SECONDS` | `3.0` | 浮点数 (秒) | 后台重新检查工作线程中探测两个非活动解析器-域名对之间的延迟。 | | `RECHECK_BATCH_SIZE` | `5` | 正整数 | 每个后台重新检查周期测试的最大非活动解析器-域名对数量。 | | `MAX_CONNECTION_ATTEMPTS` | `10` | 整数 (e.g., `10`, `20`, `30`) | 客户端尝试建立会话的最大次数。在严重中断的网络上,可能需要将此值增加到 20 或 30 才能强制连接。 | | `ARQ_WINDOW_SIZE` | `1000` | 整数 (e.g., `300`, `1000`, `3000`) | 窗口大小(允许在飞行的未确认数据包数量)。必须随客户端
RAM
扩展。`1000` 是当前的保守默认值。 | | `ARQ_INITIAL_RTO` | `0.5` | 浮点数 (秒) |
ARQ
的初始重传超时。客户端在重发之前等待 ACK 的时间。在高延迟网络上增加此值,但这会减慢丢失数据包的恢复速度。 | | `ARQ_MAX_RTO` | `3.0` | 浮点数 (秒) | 重传期间退避 RTO 的最大上限。在糟糕的网络上可能需要将此值设置为 5.0 或 10.0,但极端值会显著延迟恢复。 | | `ARQ_CONTROL_INITIAL_RTO` | `0.5` | 浮点数 (秒) | 控制平面数据包(如 SYN/FIN/RST/SOCKS 控制消息)的初始重传超时。 | | `ARQ_CONTROL_MAX_RTO` | `3.0` | 浮点数 (秒) | 控制平面重传的最大退避上限。 | | `ARQ_CONTROL_MAX_RETRIES` | `80` | 正整数 | 可靠控制数据包在 ARQ 放弃并中止流/会话路径之前的重试上限。 | | `NUM_RX_WORKERS` | `2` | 整数 (e.g., `1`, `2`, `4`) | 处理传入数据包的接收 (RX) 工作线程数量。较高的数值在快速网络上有帮助,但会使用更多的 CPU。 | | `NUM_DNS_WORKERS` | `2` | 整数 (e.g., `1`, `2`, `4`) | 发送 DNS 查询的 TX 工作线程数量。较高的数值可提高并发性,但会使用更多的 CPU。 | | `CPU_WORKER_THREADS` | `0` | `-1`, `0`, 正整数 | 用于解析器/编解码器卸载的 CPU 线程池大小。`0` 表示自动检测确切的 CPU 核心数,`-1` 表示禁用线程池。 | | `RX_SEMAPHORE_LIMIT` | `256` | 正整数 | 最大进行中的 RX 数据包处理操作数。较高的数值可减少背压,但会消耗更多内存。 | | `MAX_CLOSED_STREAM_RECORDS` | `2000` | 正整数 | 用于抑制重复关闭处理和晚期流清理竞争的已关闭流记录上限。 | | `SOCKET_BUFFER_SIZE` | `8388608` | 整数 (字节) | UDP Socket 缓冲区大小。决定操作系统在丢弃数据包之前缓冲多少传入数据。对于高流量环境推荐使用高值,需要足够的 RAM。 | | `LOG_LEVEL` | `"INFO"` | `"DEBUG"`, `"INFO"`, `"WARNING"`, `"ERROR"`, `"CRITICAL"` | 客户端日志详细程度。`DEBUG` 有助于故障排除,但会生成大量日志。`INFO` 或 `WARNING` 最适合日常使用。 | | `CONFIG_VERSION` | `5.0` | 浮点数数字 | 用于与当前客户端默认值进行兼容性检查的配置模式版本。 | ## 第 3.4 部分:服务器配置变量 (`server_config.toml`) 📄 | 参数 | 默认值 | 接受值 | 描述 | |---------|--------------|------------------|-------| | `UDP_HOST` | `"0.0.0.0"` | 有效 IP | 服务器绑定以监听 DNS 查询的 IP 地址。 | | `UDP_PORT` | `53` | 端口号 | 服务器监听的端口。**注意:** 对于真实世界的 DNS 解析,必须是 53。 | | `DOMAIN` | `["v.domain.com"]` | 数组列表 | 此服务器具有权威性的域。必须与您的
NS
记录匹配。**目前避免配置多个域!** | | `DATA_ENCRYPTION_METHOD` | `1` | `0` 到 `5` | **加密算法:**
`0`: 禁用
`1`: XOR (推荐)
`2`: ChaCha20
`3`: AES-128-GCM
`4`: AES-192-GCM
`5`: AES-256-GCM
**重要:** 必须严格匹配客户端的 `DATA_ENCRYPTION_METHOD`。 | | `PROTOCOL_TYPE` | `"SOCKS5"` | `"SOCKS5"`, `"TCP"` | **隧道协议类型:**
• `"SOCKS5"`:
强烈推荐(已优化)。
• `"TCP"`:
原始 TCP 转发。
**注意**:必须与客户端设置匹配。 | | `USE_EXTERNAL_SOCKS5` | `false` | `true` 或 `false` | **使用外部 SOCKS5 代理:**
• `false`
(内部代理):Python 服务器原生直接处理到目的地的 SOCKS 代理(最快/资源最低)。
• `true`
(外部):服务器连接到运行在
`FORWARD_IP:FORWARD_PORT`
的第三方代理(Xray, Tor, Dante)。
**推荐:** `PROTOCOL_TYPE="SOCKS5"` 且 `USE_EXTERNAL_SOCKS5=false`。 | | `FORWARD_IP` | `"127.0.0.1"` | 有效 IP | 外部代理或原始 TCP 目的地的 IP 地址。仅在
`USE_EXTERNAL_SOCKS5=true`
或协议为
`TCP`
时使用。 | | `FORWARD_PORT` | `1080` | 端口号 | 外部代理/目标的端口。 | | `SOCKS5_AUTH` | `false` | `true` 或 `false` | 启用 *外部* SOCKS5 代理的验证逻辑。仅在 `USE_EXTERNAL_SOCKS5=true` 时使用。 | | `SOCKS5_USER` | `"admin"` | 自定义字符串 | 外部 SOCKS 代理的用户名。 | | `SOCKS5_PASS` | `"123456"` | 自定义字符串 | 外部 SOCKS 代理的密码。 | | `SUPPORTED_UPLOAD_COMPRESSION_TYPES` | `[0, 1, 2, 3]` | `0..3` 列表 | 服务器允许的上传压缩类型。无效值将被丢弃;`0` (OFF) 始终作为回退强制执行。 | | `SUPPORTED_DOWNLOAD_COMPRESSION_TYPES` | `[0, 1, 2, 3]` | `0..3` 列表 | 服务器允许的下载压缩类型。无效值将被丢弃;`0` (OFF) 始终作为回退强制执行。 | | `ARQ_INITIAL_RTO` | `0.5` | 浮点数 (秒) | 初始 ARQ 超时。详情请参阅客户端配置表。 | | `ARQ_MAX_RTO` | `3.0` | 浮点数 (秒) | 最大 ARQ 重传限制。请参阅客户端配置表。 | | `ARQ_CONTROL_INITIAL_RTO` | `0.5` | 浮点数 (秒) | 服务端可靠控制数据包(如 SYN/FIN/RST/SOCKS 控制消息)重传的初始超时。 | | `ARQ_CONTROL_MAX_RTO` | `3.0` | 浮点数 (秒) | 服务端控制平面数据包重传的最大退避上限。 | | `ARQ_CONTROL_MAX_RETRIES` | `80` | 正整数 | 可靠控制数据包在服务器放弃并拆除路径之前的重试上限。 | | `SOCKS_HANDSHAKE_TIMEOUT` | `180.0` | 浮点数 (秒) | SOCKS 流激活在服务器中止待处理连接/握手之前所允许的最大时间。 | | `MAX_CONCURRENT_SOCKS_CONNECTS` | `16` | 整数 | 同时处于 CONNECTING / SOCKS_CONNECTING 阶段的最大流数量。已连接的流不受此限制限制。 | | `INVALID_COOKIE_ERROR_THRESHOLD` | `10` | 整数 | 滑动窗口内无效 cookie 命中次数,超过此次数服务器将发出 `ERROR_DROP` 并强制客户端重新启动会话。 | | `INVALID_COOKIE_WINDOW_SECONDS` | `2.0` | 浮点数 (秒) | 用于无效 cookie 限流的滑动窗口。 | | `ARQ_WINDOW_SIZE` | `1000` | 整数 | 服务端窗口大小。必须随服务器
RAM
扩展。 | | `MAX_SESSIONS` | `255` | 最大为 `255` 的正整数 | 服务器接受的最大同时活动会话数。协议硬上限为 `255`。 | | `MAX_CONCURRENT_REQUESTS` | `500` | 整数 | 等待请求工作线程的最大排队 DNS 请求数。 | | `DNS_REQUEST_WORKERS` | `4` | 整数 | 消耗有界服务器请求队列的固定 DNS 请求工作线程数。 | | `MAX_PACKETS_PER_BATCH` | `1000` | 整数 | 在一个响应周期中合并的最大小控制包数量。 | | `SOCKET_BUFFER_SIZE` | `8388608` | 整数 (字节) | 服务器 UDP Socket 缓冲区大小。推荐使用高值。 | | `LOG_LEVEL` | `"INFO"` | `"DEBUG"`, `"INFO"`, `"WARNING"`, `"ERROR"`, `"CRITICAL"` | 服务器日志详细程度。 | | `SESSION_TIMEOUT` | `300` | 整数 (秒) | 会话在被视为过期并被终止之前的非活动持续时间。300(5 分钟)是一个很好的平衡。 | | `SESSION_CLEANUP_INTERVAL` | `30` | 整数 (秒) | 后台工作线程扫描并清除死会话以释放内存的频率。 | | `CPU_WORKER_THREADS` | `0` | `-1`, `0`, 正整数 | 用于解析器/编解码器卸载的 CPU 线程池大小。`0` 表示自动检测确切的 CPU 核心数,`-1` 表示禁用线程池。 | | `CONFIG_VERSION` | `5.0` | 浮点数/数字 | 用于与当前服务器默认值进行兼容性检查的配置模式版本。 | ## 第 3.5 部分:深入理解 MTU 与快速启动黄金设置 ⚠️ ### 第 3.5.1 部分:DNS 隧道中的 MTU 概念 📦 **MTU** 代表 **最大传输单元**——通过网络发送的数据包的最大大小。 在严重过滤或干扰的网络中,大数据包极易被丢弃。降低 MTU 可保证稳定性。相反,MTU 设置得过低会将数据分割成微小的片段,从而大量增加协议开销并严重拖慢您的速度。 DNS 协议承载着严格的有效载荷限制: - **上传 (DNS 查询):** 极其受限。取决于您的域名长度,安全平均值在 `50` 到 `200` 字节之间。 - **下载 (DNS 响应):** 空间更大。通常在 `100` 到 `450` 字节之间,如果解析器支持 EDNS,可达 `4000` 字节。 本项目的客户端在启动时利用智能 *二分查找* 算法来探测每个解析器支持的最大 MTU。然后计算 **最小公倍数**,以确保流量成功穿越 *所有* 健康的解析器而不会出现分片错误。 ### 第 3.5.2 部分:逐步 MTU 优化指南 🚀 探测每个解析器需要时间。请按照以下步骤找到最佳值,并将客户端启动时间缩短至几分之一秒: #### 步骤 1:初始启动与发现 MTU 上限 🕵️♂️ 启动服务器后,使用默认设置运行客户端。在第一秒内,客户端将根据您的域名长度和加密开销计算理论最大 MTU,打印类似如下的日志: ``` Domain: v.example.com -> MIN and MAX_UPLOAD_MTU = 133 | MIN and MAX_DOWNLOAD_MTU = 129 ``` 看到此行后,立即终止程序!这是您的绝对上限值。 打开 `client_config.toml` 并将 `MAX_UPLOAD_MTU` 准确设置为建议的数字(例如 `133`)。这可以防止客户端在未来的启动中浪费时间探测不可能达到的大尺寸。 #### 步骤 2:全解析器探测 🧪 现在将所有所需的 DNS 解析器添加到配置文件中,并让客户端完全运行。这可能需要一段时间;请耐心等待系统测试每个解析器。 一旦完成,将打印一个表格,显示每个成功解析器的独特上传和下载 MTU 能力。 #### 步骤 3:建立基线(过滤弱解析器)🧹 分析打印的表格以找到一个逻辑平均值。假设大多数解析器通过了 `133` 的上传,但少数弱解析器仅达到了 `50`。 由于系统全局强制在整个隧道中使用 *最低公共 MTU*,那些弱解析器将成为您整个连接的瓶颈! 要解决此问题,请在配置中将 `MIN_UPLOAD_MTU` 设置为 `133`。客户端现在将自动丢弃任何未通过此基线的解析器,从而防止瓶颈。对 `MIN_DOWNLOAD_MTU` 应用相同的逻辑。 ### 第 3.5.3 部分:快速启动的黄金技巧 ⚡ 如果您希望客户端 **立即** 启动而不花费时间搜索 MTU 值,请应用此技术: 将配置中的 MIN 和 MAX 值设置为 **完全相等**! 例如,如果您的测试证明 `133` 上传和 `129` 下载在大多数解析器上效果良好,请像这样编辑您的配置: ``` MIN_UPLOAD_MTU = 133 MAX_UPLOAD_MTU = 133 MIN_DOWNLOAD_MTU = 129 MAX_DOWNLOAD_MTU = 129 ``` **会发生什么?** 客户端的二分查找算法注意到下限和上限相同。它将中止搜索并 *仅一次* 测试该确切数字。如果解析器回复,则验证通过;如果没有,则立即丢弃。这极大地提高了启动速度! 计算和分配正确的 MTU 值对于本项目的速度和稳定性至关重要。请仔细完成此步骤,以匹配您特定的网络环境。 ## 第 4 部分:紧急情况与故障排除 🚨 ### 第 4.1 部分:严重网络中断(国家级内联网)⚠️ 当互联网完全切断,丢包率极高,且仅允许 DNS 流量时,请在 `client_config.toml` 中进行以下调整以保证连接: 1. **最大化解析器:** 找到尽可能多的有效公共 DNS 解析器并将它们添加到 `client_resolvers.txt`。支持的格式包括 `IP`, `IP:PORT`, `CIDR`, 和 `CIDR:PORT`。混合多种解析器(如 Google `8.8.8.8`, Cloudflare `1.1.1.1`, Quad9 `9.9.9.9`, OpenDNS `208.67.222.222`)可最大化路由多样性。 2. **增加数据包复制:** 提高 `PACKET_DUPLICATION_COUNT` 参数。这定义了每个有效载荷块通过不同路由 **同时** 发送的次数。 - **示例:** 将此设置为 `5` 意味着一个数据包同时发送给 5 个解析器。即使 4 条路由被阻止或丢弃数据包,第 5 条也会将其送达!服务器的 ARQ 层原生检测并丢弃重复数据包,保持流量平滑。 - **建议:** 在极端干扰期间,`3` 到 `6` 之间的值是理想的。然而,如果没有足够的实际解析器,鲁莽的复制将使仅有的几个解析器过载并降低性能。 ### 第 4.2 部分:端口 53 冲突(Linux 服务器)🛑 在大多数 Linux 发行版(如 Ubuntu)中,默认情况下端口 `53` 被 `systemd-resolved` 服务占用。如果服务器抛出端口绑定错误,您必须禁用 stub 监听器。在您的服务器上依次运行这些命令: 1. 打开配置文件进行编辑: ``` sudo nano /etc/systemd/resolved.conf ``` 2. 找到 `#DNSStubListener=yes`,删除 `#`,并将其更改为 `no`(像这样:`DNSStubListener=no`)。保存并退出(`Ctrl+O`, `Enter`, `Ctrl+X`)。 3. 重启服务以应用更改: ``` sudo systemctl restart systemd-resolved ``` 4. **至关重要:** 为确保服务器本身仍具有互联网访问权限并能解析外部目标,请更新 `resolv.conf` 的符号链接: ``` sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf ``` ## 第 5 部分:架构与工作流程 🛠️ **DnsVPN** 通过在无连接的 UDP/DNS 协议上完全结合会话多路复用和自定义自动重传请求 (ARQ) 可靠性层,打破了标准 DNS 隧道的限制。 ### 第 5.1 部分:高层架构图 ``` graph TD subgraph Client_Side ["🖥️ User System (Client)"] App["📱 Apps (Browser, Telegram, etc.)"] Client["🐍 MasterDnsVPN Client
(SOCKS5/TCP Proxy)"] end subgraph DNS_Network ["🌐 Public DNS Network"] R1["📡 Resolver 1 (e.g., 8.8.8.8)"] R2["📡 Resolver 2 (e.g., 1.1.1.1)"] RN["📡 ... Other Resolvers"] end subgraph Server_Side ["🖥️ Remote Server (Server)"] Server["🐍 MasterDnsVPN Server
(Listening on Port 53)"] Target["🌐 Free Internet
(or External Proxy)"] end App -->|"TCP Traffic"| Client Client -->|"DNS TXT Query
(Encryption + Fragmentation)"| R1 Client -->|"DNS TXT Query
(Packet Duplication)"| R2 Client -->|"DNS TXT Query
(Load Balancing)"| RN R1 -->|"Forward to NS Server"| Server R2 -->|"Forward to NS Server"| Server RN -->|"Forward to NS Server"| Server Server -->|"Rebuild Packets (ARQ)
Forward to Target"| Target Target -->|"Target Response"| Server Server -->|"DNS TXT Response
(Encrypted)"| R1 R1 -->|"DNS Response"| Client Client -->|"Deliver Intact Data"| App ``` ### 第 5.2 部分:数据包生命周期 🔄 ``` sequenceDiagram participant App as 📱 User App participant Client as 🐍 Client (ARQ Layer) participant DNS as 📡 DNS Resolvers participant Server as 🖥️ Server (ARQ Layer) participant Target as 🌐 Final Destination App->>Client: Send continuous TCP data Note over Client: 1. Fragment data based on MTU
2. Encrypt & add custom header
3. Assign Sequence Number Client->>DNS: Broadcast query to multiple resolvers (Duplication) DNS->>Server: Forward queries (Since Server is domain NS) Note over Server: 1. ARQ drops duplicate packets
2. Out-of-order packets are sequenced
3. Request is decrypted Server->>Target: SOCKS5 / TCP connection to target Target-->>Server: Receive response data Note over Server: Fragment, Encrypt, and queue for transmission Server-->>DNS: Send response embedded in TXT records (with ACKs) DNS-->>Client: Deliver DNS response to Client Note over Client: Reorder data, Acknowledge receipt, Rebuild TCP Client-->>App: Deliver intact data to User App ``` ### 第 5.3 部分:核心概念解释 🧠 | 概念 | 系统功能 | | :--- | :--- | | **Session (会话)** | 客户端和服务器之间的总体链接。每个服务器最多可同时处理 255 个独立会话。 | | **Stream (流)** | 每个单独的 TCP 连接(例如,加载一个新的网站标签页)都是一个流,通过单个会话进行高效多路复用。 | | **ARQ 协议** | 一种轻量级的 QUIC 替代品。它通过跟踪序列号和 ACK,处理重传,来保证不可靠 UDP/DNS 上的数据交付。 | | **Balancing (均衡)** | 客户端使用随机、轮询 或最少丢包等智能算法将负载分散到多个解析器上。 | | **Packed Control Blocks (压缩控制块)** | 为了节省带宽,服务器将多个确认 (ACK) 收据紧密地打包成一个有效载荷。 | ## 第 6 部分:高级技术说明 ⚙️ - ⚡ **直接 SOCKS5 (Fast-Connect):** 在服务器中将 `USE_EXTERNAL_SOCKS5` 设置为 `false` 允许原生 Python 后端直接将客户端流量路由到目的地,无需中间件(如 Dante 或 Xray),从而大大减少延迟。 - 🔄 **自适应轮询:** 客户端具有智能退避系统(Ping 管理器)。在空闲期间,它会降低 Keep-Alive 传输频率,显著减少 DNS 网络垃圾和负载。 - 🔒 **加密库:** 安装此库是高级加密 (AES-GCM/ChaCha20) 所必需的。然而,对于像基础路由器这样的低资源硬件,内置的高度优化的 `XOR`(方法 1)零依赖且原生执行速度极快。 ## 🤝 贡献 非常欢迎贡献!如果您有想法、错误修复或性能调整,请 Fork 项目并提交 Pull Request。请仅在 [Issues](https://github.com/masterking32/MasterDnsVPN/issues) 部分报告错误或问题。 ## 📄 许可证 本项目在 **MIT** 许可证下发布。在许可条款下,使用、修改和分发是免费的。有关完整详细信息,请参阅 `LICENSE` 文件。 ## 👨💻 开发者 由 [**MasterkinG32**](https://github.com/masterking32) 用 ❤️ 开发
• `"SOCKS5"`:
强烈推荐。此项目中的 SOCKS 代码经过高度优化,可实现最大速度。
• `"TCP"`:
用于转发原始端口/协议,如 VLESS 或 OpenVPN(开销较高)。
**注意**:必须与服务器设置匹配。 | | `DOMAINS` | `["v.domain.com"]` | 数组列表 (e.g., `["sub.site.com"]`) | 在第 1 部分中配置的
NS
子域。这在客户端和服务器上必须完全相同。
目前避免添加多个域名! | | `DATA_ENCRYPTION_METHOD` | `1` | `0` 到 `5` | **加密算法:**
`0`: 禁用(无安全性)
`1`: XOR 算法(推荐 - 高速度,中等安全性)
`2`: ChaCha20
`3`: AES-128-GCM
`4`: AES-192-GCM
`5`: AES-256-GCM(最高安全性,最低速度) | | `ENCRYPTION_KEY` | `""` | 字符串 与服务器匹配的加密密钥。没有此密钥连接将失败。 | | `BASE_ENCODE_DATA` | `false` | `true` 或 `false` | 在数据包传输前添加 DNS 安全的基编码。通常保持 `false`;启用它会增加开销并可能降低吞吐量。 | | `LISTEN_IP` | `"0.0.0.0"` | 有效 IP (e.g., `127.0.0.1`) | 客户端监听的本地 IP 地址。
• `"127.0.0.1"`: 仅限本地设备(更安全)
• `"0.0.0.0"`: 本地网络上的所有设备均可访问 | | `LISTEN_PORT` | `1080` | 端口号 (e.g., `1080`) | 客户端监听的端口,以便您的应用程序(浏览器, Telegram)可以连接。 | | `SOCKS5_AUTH` | `true` | `true` 或 `false` | 启用本地
SOCKS5
身份验证。(如果为 `false`,连接到您的代理不需要用户/密码)。**注意:** 此设置仅用于您本地机器的安全,与隧道连接无关。它仅在协议设置为
SOCKS5
时有效。 | | `SOCKS5_USER` | `"master_dns_vpn"` | 自定义字符串 | 本地 SOCKS 代理的用户名(如果 `SOCKS5_AUTH` 处于活动状态)。 | | `SOCKS5_PASS` | `"master_dns_vpn"` | 自定义字符串 | 本地 SOCKS 代理的密码(如果 `SOCKS5_AUTH` 处于活动状态)。 | | `SOCKS_HANDSHAKE_TIMEOUT` | `300.0` | 浮点数 (秒) | 本地 SOCKS 流在客户端中止之前完成激活所允许的最大时间。在慢速/丢包链路上增加此值以避免握手期间的误判关闭。 | | `client_resolvers.txt` (文件) | 包含在发布 ZIP 中 | `IP`, `IP:PORT`, `CIDR`, `CIDR:PORT` 每行一个 | 解析器源已从配置移至文件。空行/无效行将被跳过。如果文件丢失或未包含有效条目,客户端将退出并报错。 | | `PACKET_DUPLICATION_COUNT` | `2` | 正整数 (`1` 表示关闭, `2`, `3`+) | 数据包复制的次数。对于不稳定链路,`2` 是推荐的起始点。较高的值会迅速增加带宽和 CPU 压力。 | | `STREAM_RESOLVER_FAILOVER_RESEND_THRESHOLD` | `2` | 正整数 | 在同一个流连续发生此数量的 `STREAM_RESEND` 事件后,如果存在另一个健康的解析器,客户端将切换该流的首选解析器。 | | `STREAM_RESOLVER_FAILOVER_COOLDOWN` | `1.0` | 浮点数 (秒) | 同一流的首选解析器切换之间的最短时间。防止在丢包情况下解析器频繁抖动。 | | `MAX_PACKETS_PER_BATCH` | `100` | 正整数 | 合并到一个 DNS 操作中的最大小控制包数量。`1` 表示禁用批处理。有效运行时限制也受协商 MTU 的上限约束。 | | `RESOLVER_BALANCING_STRATEGY` | `2` | `1`, `2`, `3`, `4` | **负载均衡策略:**
`1`: **随机**
`2`: **轮询**
`3`: **最少丢包**
`4`: **最低延迟** | | `DNS_QUERY_TIMEOUT` | `5.0` | 浮点数 (秒) | 在认为标准 DNS 响应丢失并重试之前等待的时间。 | | `UPLOAD_COMPRESSION_TYPE` | `0` | `0`, `1`, `2`, `3` | 客户端到服务端的有效载荷压缩:
`0`: 关闭
`1`: ZSTD
`2`: LZ4
`3`: ZLIB | | `DOWNLOAD_COMPRESSION_TYPE` | `0` | `0`, `1`, `2`, `3` | 服务端到客户端的有效载荷压缩。使用与上传压缩相同的枚举。 | | `MIN_UPLOAD_MTU` | `70` | 整数 (字节) | 解析器必须具备的最小上传
MTU
才能被利用。低于此阈值的解析器将被丢弃。设置为 `0` 以禁用。详情请参阅第 3.5 部分。 | | `MIN_DOWNLOAD_MTU` | `150` | 整数 (字节) | 解析器必须具备的最小下载
MTU
才能被利用。低于此阈值的解析器将被丢弃。设置为 `0` 以禁用。请参阅第 3.5 部分。 | | `MAX_UPLOAD_MTU` | `150` | 整数 (字节) | 自动探测阶段使用的最大上传
MTU
。应低于您网络上最大可靠 MTU。请参阅第 3.5 部分。 | | `MAX_DOWNLOAD_MTU` | `200` | 整数 (字节) | 自动探测阶段使用的最大下载
MTU
。应低于您网络上最大可靠下游 MTU。请参阅第 3.5 部分。 | | `MTU_TEST_RETRIES` | `2` | 整数 (e.g., `1`, `2`, `3`+) | 如果 MTU 测试失败的重试次数。对于严重过滤的网络,建议增加到 3 或 4,以防止丢弃暂时延迟的服务器。
**警告:** 会显著增加初始启动时间,但能极大提高准确性。 | | `MTU_TEST_TIMEOUT` | `2.0` | 浮点数 (秒) | 等待 MTU 响应的超时时间(秒)。在非常高延迟的网络上进一步增加此值。
**警告:** 较高的超时意味着如果数据包丢失,启动过程会变慢。 | | `AUTO_SCALE_PROFILES` | `true` | `true` 或 `false` | 根据解析器/域名列表的大小自动调整启动 MTU 扫描和非活动解析器重新检查行为。 | | `MTU_TEST_PARALLELISM` | `6` | 正整数 | 初始 MTU 扫描期间并行测试的解析器-域名对数量。较高的值可加快启动速度,但会增加临时的 CPU/网络负载。 | | `SAVE_MTU_SERVERS_TO_FILE` | `false` | `true` 或 `false` | 如果启用,将成功的 MTU 测试解析器写入文本文件。 | | `MTU_SERVERS_FILE_NAME` | `"masterdnsvpn_success_test_{time}.txt"` | 字符串 | 保存 MTU 结果的输出文件名。如果存在,`{time}` 将被替换为时间戳。 | | `MTU_SERVERS_FILE_FORMAT` | `"{IP} - UP: {UP_MTU} DOWN: {DOWN-MTU}"` | 字符串 | 成功进行 MTU 测试的解析器的每行模板。支持占位符,如 `{IP}`, `{UP_MTU}`, `{DOWN-MTU}`, `{DOMAIN}` 和 `{TIME}`。 | | `MTU_USING_SECTION_SEPARATOR_TEXT` | `"---- Active MTU Testing Results ----"` | 字符串 | 初始 MTU 扫描完成后追加一次的可选分隔符文本。空字符串表示禁用。 | | `MTU_REMOVED_SERVER_LOG_FORMAT` | `"IP {IP} removed from list at {TIME} due to {CAUSE}"` | 字符串 | 当服务器在运行时被自动禁用时,追加到 MTU 输出文件的可选行。空字符串表示禁用。 | | `MTU_ADDED_SERVER_LOG_FORMAT` | `"Server {IP} re-added at {TIME} (UP MTU: {UP_MTU}, DOWN MTU: {DOWN_MTU})"` | 字符串 | 当非活动服务器被重新添加时,追加到 MTU 输出文件的可选行。空字符串表示禁用。 | | `AUTO_DISABLE_TIMEOUT_SERVERS` | `true` | `true` 或 `false` | 如果在配置的观察窗口内某个解析器-域名对显示 100% 超时,而其他活动解析器仍然存在,则在运行时自动禁用该对。 | | `AUTO_DISABLE_TIMEOUT_WINDOW_SECONDS` | `120` | 浮点数/整数 (秒) | 运行时超时健康卫士使用的滑动观察窗口。 | | `AUTO_DISABLE_TIMEOUT_MIN_OBSERVATIONS` | `3` | 正整数 | 在客户端禁用解析器-域名对之前所需的最小超时/成功观察次数。 | | `AUTO_DISABLE_CHECK_INTERVAL_SECONDS` | `1.0` | 浮点数 (秒) | 评估解析器超时窗口的运行时健康工作线程的轮询间隔。 | | `RECHECK_INACTIVE_SERVERS_ENABLED` | `true` | `true` 或 `false` | 启用对未通过 MTU 验证或在运行时被禁用的解析器进行定期后台重新检查。 | | `RECHECK_INACTIVE_INTERVAL_SECONDS` | `300` | 浮点数/整数 (秒) | 完整非活动解析器重新检查周期之间的间隔。 | | `RECHECK_SERVER_INTERVAL_SECONDS` | `3.0` | 浮点数 (秒) | 后台重新检查工作线程中探测两个非活动解析器-域名对之间的延迟。 | | `RECHECK_BATCH_SIZE` | `5` | 正整数 | 每个后台重新检查周期测试的最大非活动解析器-域名对数量。 | | `MAX_CONNECTION_ATTEMPTS` | `10` | 整数 (e.g., `10`, `20`, `30`) | 客户端尝试建立会话的最大次数。在严重中断的网络上,可能需要将此值增加到 20 或 30 才能强制连接。 | | `ARQ_WINDOW_SIZE` | `1000` | 整数 (e.g., `300`, `1000`, `3000`) | 窗口大小(允许在飞行的未确认数据包数量)。必须随客户端
RAM
扩展。`1000` 是当前的保守默认值。 | | `ARQ_INITIAL_RTO` | `0.5` | 浮点数 (秒) |
ARQ
的初始重传超时。客户端在重发之前等待 ACK 的时间。在高延迟网络上增加此值,但这会减慢丢失数据包的恢复速度。 | | `ARQ_MAX_RTO` | `3.0` | 浮点数 (秒) | 重传期间退避 RTO 的最大上限。在糟糕的网络上可能需要将此值设置为 5.0 或 10.0,但极端值会显著延迟恢复。 | | `ARQ_CONTROL_INITIAL_RTO` | `0.5` | 浮点数 (秒) | 控制平面数据包(如 SYN/FIN/RST/SOCKS 控制消息)的初始重传超时。 | | `ARQ_CONTROL_MAX_RTO` | `3.0` | 浮点数 (秒) | 控制平面重传的最大退避上限。 | | `ARQ_CONTROL_MAX_RETRIES` | `80` | 正整数 | 可靠控制数据包在 ARQ 放弃并中止流/会话路径之前的重试上限。 | | `NUM_RX_WORKERS` | `2` | 整数 (e.g., `1`, `2`, `4`) | 处理传入数据包的接收 (RX) 工作线程数量。较高的数值在快速网络上有帮助,但会使用更多的 CPU。 | | `NUM_DNS_WORKERS` | `2` | 整数 (e.g., `1`, `2`, `4`) | 发送 DNS 查询的 TX 工作线程数量。较高的数值可提高并发性,但会使用更多的 CPU。 | | `CPU_WORKER_THREADS` | `0` | `-1`, `0`, 正整数 | 用于解析器/编解码器卸载的 CPU 线程池大小。`0` 表示自动检测确切的 CPU 核心数,`-1` 表示禁用线程池。 | | `RX_SEMAPHORE_LIMIT` | `256` | 正整数 | 最大进行中的 RX 数据包处理操作数。较高的数值可减少背压,但会消耗更多内存。 | | `MAX_CLOSED_STREAM_RECORDS` | `2000` | 正整数 | 用于抑制重复关闭处理和晚期流清理竞争的已关闭流记录上限。 | | `SOCKET_BUFFER_SIZE` | `8388608` | 整数 (字节) | UDP Socket 缓冲区大小。决定操作系统在丢弃数据包之前缓冲多少传入数据。对于高流量环境推荐使用高值,需要足够的 RAM。 | | `LOG_LEVEL` | `"INFO"` | `"DEBUG"`, `"INFO"`, `"WARNING"`, `"ERROR"`, `"CRITICAL"` | 客户端日志详细程度。`DEBUG` 有助于故障排除,但会生成大量日志。`INFO` 或 `WARNING` 最适合日常使用。 | | `CONFIG_VERSION` | `5.0` | 浮点数数字 | 用于与当前客户端默认值进行兼容性检查的配置模式版本。 | ## 第 3.4 部分:服务器配置变量 (`server_config.toml`) 📄 | 参数 | 默认值 | 接受值 | 描述 | |---------|--------------|------------------|-------| | `UDP_HOST` | `"0.0.0.0"` | 有效 IP | 服务器绑定以监听 DNS 查询的 IP 地址。 | | `UDP_PORT` | `53` | 端口号 | 服务器监听的端口。**注意:** 对于真实世界的 DNS 解析,必须是 53。 | | `DOMAIN` | `["v.domain.com"]` | 数组列表 | 此服务器具有权威性的域。必须与您的
NS
记录匹配。**目前避免配置多个域!** | | `DATA_ENCRYPTION_METHOD` | `1` | `0` 到 `5` | **加密算法:**
`0`: 禁用
`1`: XOR (推荐)
`2`: ChaCha20
`3`: AES-128-GCM
`4`: AES-192-GCM
`5`: AES-256-GCM
**重要:** 必须严格匹配客户端的 `DATA_ENCRYPTION_METHOD`。 | | `PROTOCOL_TYPE` | `"SOCKS5"` | `"SOCKS5"`, `"TCP"` | **隧道协议类型:**
• `"SOCKS5"`:
强烈推荐(已优化)。
• `"TCP"`:
原始 TCP 转发。
**注意**:必须与客户端设置匹配。 | | `USE_EXTERNAL_SOCKS5` | `false` | `true` 或 `false` | **使用外部 SOCKS5 代理:**
• `false`
(内部代理):Python 服务器原生直接处理到目的地的 SOCKS 代理(最快/资源最低)。
• `true`
(外部):服务器连接到运行在
`FORWARD_IP:FORWARD_PORT`
的第三方代理(Xray, Tor, Dante)。
**推荐:** `PROTOCOL_TYPE="SOCKS5"` 且 `USE_EXTERNAL_SOCKS5=false`。 | | `FORWARD_IP` | `"127.0.0.1"` | 有效 IP | 外部代理或原始 TCP 目的地的 IP 地址。仅在
`USE_EXTERNAL_SOCKS5=true`
或协议为
`TCP`
时使用。 | | `FORWARD_PORT` | `1080` | 端口号 | 外部代理/目标的端口。 | | `SOCKS5_AUTH` | `false` | `true` 或 `false` | 启用 *外部* SOCKS5 代理的验证逻辑。仅在 `USE_EXTERNAL_SOCKS5=true` 时使用。 | | `SOCKS5_USER` | `"admin"` | 自定义字符串 | 外部 SOCKS 代理的用户名。 | | `SOCKS5_PASS` | `"123456"` | 自定义字符串 | 外部 SOCKS 代理的密码。 | | `SUPPORTED_UPLOAD_COMPRESSION_TYPES` | `[0, 1, 2, 3]` | `0..3` 列表 | 服务器允许的上传压缩类型。无效值将被丢弃;`0` (OFF) 始终作为回退强制执行。 | | `SUPPORTED_DOWNLOAD_COMPRESSION_TYPES` | `[0, 1, 2, 3]` | `0..3` 列表 | 服务器允许的下载压缩类型。无效值将被丢弃;`0` (OFF) 始终作为回退强制执行。 | | `ARQ_INITIAL_RTO` | `0.5` | 浮点数 (秒) | 初始 ARQ 超时。详情请参阅客户端配置表。 | | `ARQ_MAX_RTO` | `3.0` | 浮点数 (秒) | 最大 ARQ 重传限制。请参阅客户端配置表。 | | `ARQ_CONTROL_INITIAL_RTO` | `0.5` | 浮点数 (秒) | 服务端可靠控制数据包(如 SYN/FIN/RST/SOCKS 控制消息)重传的初始超时。 | | `ARQ_CONTROL_MAX_RTO` | `3.0` | 浮点数 (秒) | 服务端控制平面数据包重传的最大退避上限。 | | `ARQ_CONTROL_MAX_RETRIES` | `80` | 正整数 | 可靠控制数据包在服务器放弃并拆除路径之前的重试上限。 | | `SOCKS_HANDSHAKE_TIMEOUT` | `180.0` | 浮点数 (秒) | SOCKS 流激活在服务器中止待处理连接/握手之前所允许的最大时间。 | | `MAX_CONCURRENT_SOCKS_CONNECTS` | `16` | 整数 | 同时处于 CONNECTING / SOCKS_CONNECTING 阶段的最大流数量。已连接的流不受此限制限制。 | | `INVALID_COOKIE_ERROR_THRESHOLD` | `10` | 整数 | 滑动窗口内无效 cookie 命中次数,超过此次数服务器将发出 `ERROR_DROP` 并强制客户端重新启动会话。 | | `INVALID_COOKIE_WINDOW_SECONDS` | `2.0` | 浮点数 (秒) | 用于无效 cookie 限流的滑动窗口。 | | `ARQ_WINDOW_SIZE` | `1000` | 整数 | 服务端窗口大小。必须随服务器
RAM
扩展。 | | `MAX_SESSIONS` | `255` | 最大为 `255` 的正整数 | 服务器接受的最大同时活动会话数。协议硬上限为 `255`。 | | `MAX_CONCURRENT_REQUESTS` | `500` | 整数 | 等待请求工作线程的最大排队 DNS 请求数。 | | `DNS_REQUEST_WORKERS` | `4` | 整数 | 消耗有界服务器请求队列的固定 DNS 请求工作线程数。 | | `MAX_PACKETS_PER_BATCH` | `1000` | 整数 | 在一个响应周期中合并的最大小控制包数量。 | | `SOCKET_BUFFER_SIZE` | `8388608` | 整数 (字节) | 服务器 UDP Socket 缓冲区大小。推荐使用高值。 | | `LOG_LEVEL` | `"INFO"` | `"DEBUG"`, `"INFO"`, `"WARNING"`, `"ERROR"`, `"CRITICAL"` | 服务器日志详细程度。 | | `SESSION_TIMEOUT` | `300` | 整数 (秒) | 会话在被视为过期并被终止之前的非活动持续时间。300(5 分钟)是一个很好的平衡。 | | `SESSION_CLEANUP_INTERVAL` | `30` | 整数 (秒) | 后台工作线程扫描并清除死会话以释放内存的频率。 | | `CPU_WORKER_THREADS` | `0` | `-1`, `0`, 正整数 | 用于解析器/编解码器卸载的 CPU 线程池大小。`0` 表示自动检测确切的 CPU 核心数,`-1` 表示禁用线程池。 | | `CONFIG_VERSION` | `5.0` | 浮点数/数字 | 用于与当前服务器默认值进行兼容性检查的配置模式版本。 | ## 第 3.5 部分:深入理解 MTU 与快速启动黄金设置 ⚠️ ### 第 3.5.1 部分:DNS 隧道中的 MTU 概念 📦 **MTU** 代表 **最大传输单元**——通过网络发送的数据包的最大大小。 在严重过滤或干扰的网络中,大数据包极易被丢弃。降低 MTU 可保证稳定性。相反,MTU 设置得过低会将数据分割成微小的片段,从而大量增加协议开销并严重拖慢您的速度。 DNS 协议承载着严格的有效载荷限制: - **上传 (DNS 查询):** 极其受限。取决于您的域名长度,安全平均值在 `50` 到 `200` 字节之间。 - **下载 (DNS 响应):** 空间更大。通常在 `100` 到 `450` 字节之间,如果解析器支持 EDNS,可达 `4000` 字节。 本项目的客户端在启动时利用智能 *二分查找* 算法来探测每个解析器支持的最大 MTU。然后计算 **最小公倍数**,以确保流量成功穿越 *所有* 健康的解析器而不会出现分片错误。 ### 第 3.5.2 部分:逐步 MTU 优化指南 🚀 探测每个解析器需要时间。请按照以下步骤找到最佳值,并将客户端启动时间缩短至几分之一秒: #### 步骤 1:初始启动与发现 MTU 上限 🕵️♂️ 启动服务器后,使用默认设置运行客户端。在第一秒内,客户端将根据您的域名长度和加密开销计算理论最大 MTU,打印类似如下的日志: ``` Domain: v.example.com -> MIN and MAX_UPLOAD_MTU = 133 | MIN and MAX_DOWNLOAD_MTU = 129 ``` 看到此行后,立即终止程序!这是您的绝对上限值。 打开 `client_config.toml` 并将 `MAX_UPLOAD_MTU` 准确设置为建议的数字(例如 `133`)。这可以防止客户端在未来的启动中浪费时间探测不可能达到的大尺寸。 #### 步骤 2:全解析器探测 🧪 现在将所有所需的 DNS 解析器添加到配置文件中,并让客户端完全运行。这可能需要一段时间;请耐心等待系统测试每个解析器。 一旦完成,将打印一个表格,显示每个成功解析器的独特上传和下载 MTU 能力。 #### 步骤 3:建立基线(过滤弱解析器)🧹 分析打印的表格以找到一个逻辑平均值。假设大多数解析器通过了 `133` 的上传,但少数弱解析器仅达到了 `50`。 由于系统全局强制在整个隧道中使用 *最低公共 MTU*,那些弱解析器将成为您整个连接的瓶颈! 要解决此问题,请在配置中将 `MIN_UPLOAD_MTU` 设置为 `133`。客户端现在将自动丢弃任何未通过此基线的解析器,从而防止瓶颈。对 `MIN_DOWNLOAD_MTU` 应用相同的逻辑。 ### 第 3.5.3 部分:快速启动的黄金技巧 ⚡ 如果您希望客户端 **立即** 启动而不花费时间搜索 MTU 值,请应用此技术: 将配置中的 MIN 和 MAX 值设置为 **完全相等**! 例如,如果您的测试证明 `133` 上传和 `129` 下载在大多数解析器上效果良好,请像这样编辑您的配置: ``` MIN_UPLOAD_MTU = 133 MAX_UPLOAD_MTU = 133 MIN_DOWNLOAD_MTU = 129 MAX_DOWNLOAD_MTU = 129 ``` **会发生什么?** 客户端的二分查找算法注意到下限和上限相同。它将中止搜索并 *仅一次* 测试该确切数字。如果解析器回复,则验证通过;如果没有,则立即丢弃。这极大地提高了启动速度! 计算和分配正确的 MTU 值对于本项目的速度和稳定性至关重要。请仔细完成此步骤,以匹配您特定的网络环境。 ## 第 4 部分:紧急情况与故障排除 🚨 ### 第 4.1 部分:严重网络中断(国家级内联网)⚠️ 当互联网完全切断,丢包率极高,且仅允许 DNS 流量时,请在 `client_config.toml` 中进行以下调整以保证连接: 1. **最大化解析器:** 找到尽可能多的有效公共 DNS 解析器并将它们添加到 `client_resolvers.txt`。支持的格式包括 `IP`, `IP:PORT`, `CIDR`, 和 `CIDR:PORT`。混合多种解析器(如 Google `8.8.8.8`, Cloudflare `1.1.1.1`, Quad9 `9.9.9.9`, OpenDNS `208.67.222.222`)可最大化路由多样性。 2. **增加数据包复制:** 提高 `PACKET_DUPLICATION_COUNT` 参数。这定义了每个有效载荷块通过不同路由 **同时** 发送的次数。 - **示例:** 将此设置为 `5` 意味着一个数据包同时发送给 5 个解析器。即使 4 条路由被阻止或丢弃数据包,第 5 条也会将其送达!服务器的 ARQ 层原生检测并丢弃重复数据包,保持流量平滑。 - **建议:** 在极端干扰期间,`3` 到 `6` 之间的值是理想的。然而,如果没有足够的实际解析器,鲁莽的复制将使仅有的几个解析器过载并降低性能。 ### 第 4.2 部分:端口 53 冲突(Linux 服务器)🛑 在大多数 Linux 发行版(如 Ubuntu)中,默认情况下端口 `53` 被 `systemd-resolved` 服务占用。如果服务器抛出端口绑定错误,您必须禁用 stub 监听器。在您的服务器上依次运行这些命令: 1. 打开配置文件进行编辑: ``` sudo nano /etc/systemd/resolved.conf ``` 2. 找到 `#DNSStubListener=yes`,删除 `#`,并将其更改为 `no`(像这样:`DNSStubListener=no`)。保存并退出(`Ctrl+O`, `Enter`, `Ctrl+X`)。 3. 重启服务以应用更改: ``` sudo systemctl restart systemd-resolved ``` 4. **至关重要:** 为确保服务器本身仍具有互联网访问权限并能解析外部目标,请更新 `resolv.conf` 的符号链接: ``` sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf ``` ## 第 5 部分:架构与工作流程 🛠️ **DnsVPN** 通过在无连接的 UDP/DNS 协议上完全结合会话多路复用和自定义自动重传请求 (ARQ) 可靠性层,打破了标准 DNS 隧道的限制。 ### 第 5.1 部分:高层架构图 ``` graph TD subgraph Client_Side ["🖥️ User System (Client)"] App["📱 Apps (Browser, Telegram, etc.)"] Client["🐍 MasterDnsVPN Client
(SOCKS5/TCP Proxy)"] end subgraph DNS_Network ["🌐 Public DNS Network"] R1["📡 Resolver 1 (e.g., 8.8.8.8)"] R2["📡 Resolver 2 (e.g., 1.1.1.1)"] RN["📡 ... Other Resolvers"] end subgraph Server_Side ["🖥️ Remote Server (Server)"] Server["🐍 MasterDnsVPN Server
(Listening on Port 53)"] Target["🌐 Free Internet
(or External Proxy)"] end App -->|"TCP Traffic"| Client Client -->|"DNS TXT Query
(Encryption + Fragmentation)"| R1 Client -->|"DNS TXT Query
(Packet Duplication)"| R2 Client -->|"DNS TXT Query
(Load Balancing)"| RN R1 -->|"Forward to NS Server"| Server R2 -->|"Forward to NS Server"| Server RN -->|"Forward to NS Server"| Server Server -->|"Rebuild Packets (ARQ)
Forward to Target"| Target Target -->|"Target Response"| Server Server -->|"DNS TXT Response
(Encrypted)"| R1 R1 -->|"DNS Response"| Client Client -->|"Deliver Intact Data"| App ``` ### 第 5.2 部分:数据包生命周期 🔄 ``` sequenceDiagram participant App as 📱 User App participant Client as 🐍 Client (ARQ Layer) participant DNS as 📡 DNS Resolvers participant Server as 🖥️ Server (ARQ Layer) participant Target as 🌐 Final Destination App->>Client: Send continuous TCP data Note over Client: 1. Fragment data based on MTU
2. Encrypt & add custom header
3. Assign Sequence Number Client->>DNS: Broadcast query to multiple resolvers (Duplication) DNS->>Server: Forward queries (Since Server is domain NS) Note over Server: 1. ARQ drops duplicate packets
2. Out-of-order packets are sequenced
3. Request is decrypted Server->>Target: SOCKS5 / TCP connection to target Target-->>Server: Receive response data Note over Server: Fragment, Encrypt, and queue for transmission Server-->>DNS: Send response embedded in TXT records (with ACKs) DNS-->>Client: Deliver DNS response to Client Note over Client: Reorder data, Acknowledge receipt, Rebuild TCP Client-->>App: Deliver intact data to User App ``` ### 第 5.3 部分:核心概念解释 🧠 | 概念 | 系统功能 | | :--- | :--- | | **Session (会话)** | 客户端和服务器之间的总体链接。每个服务器最多可同时处理 255 个独立会话。 | | **Stream (流)** | 每个单独的 TCP 连接(例如,加载一个新的网站标签页)都是一个流,通过单个会话进行高效多路复用。 | | **ARQ 协议** | 一种轻量级的 QUIC 替代品。它通过跟踪序列号和 ACK,处理重传,来保证不可靠 UDP/DNS 上的数据交付。 | | **Balancing (均衡)** | 客户端使用随机、轮询 或最少丢包等智能算法将负载分散到多个解析器上。 | | **Packed Control Blocks (压缩控制块)** | 为了节省带宽,服务器将多个确认 (ACK) 收据紧密地打包成一个有效载荷。 | ## 第 6 部分:高级技术说明 ⚙️ - ⚡ **直接 SOCKS5 (Fast-Connect):** 在服务器中将 `USE_EXTERNAL_SOCKS5` 设置为 `false` 允许原生 Python 后端直接将客户端流量路由到目的地,无需中间件(如 Dante 或 Xray),从而大大减少延迟。 - 🔄 **自适应轮询:** 客户端具有智能退避系统(Ping 管理器)。在空闲期间,它会降低 Keep-Alive 传输频率,显著减少 DNS 网络垃圾和负载。 - 🔒 **加密库:** 安装此库是高级加密 (AES-GCM/ChaCha20) 所必需的。然而,对于像基础路由器这样的低资源硬件,内置的高度优化的 `XOR`(方法 1)零依赖且原生执行速度极快。 ## 🤝 贡献 非常欢迎贡献!如果您有想法、错误修复或性能调整,请 Fork 项目并提交 Pull Request。请仅在 [Issues](https://github.com/masterking32/MasterDnsVPN/issues) 部分报告错误或问题。 ## 📄 许可证 本项目在 **MIT** 许可证下发布。在许可条款下,使用、修改和分发是免费的。有关完整详细信息,请参阅 `LICENSE` 文件。 ## 👨💻 开发者 由 [**MasterkinG32**](https://github.com/masterking32) 用 ❤️ 开发
标签:ARQ协议, censorship circumvention, DNS解析器, DNS隧道, EVTX分析, Python安全, SOCKS5, TCP封装, VPN, 免流, 多路复用, 封装协议, 抗丢包, 流量伪装, 科学上网, 网络安全, 网络安全, 网络审查绕过, 网络工具, 负载均衡, 逆向工具, 防火墙穿透, 隐私保护, 隐私保护, 隧道技术