📌 项目地址:masterking32/MasterDnsVPN | ⭐ 5,086 颗星 | 🔧 Go | 📜 未标注
为什么需要另一款 DNS VPN?
DNS 隧道技术不新,Iodine、DNSCat2、DNSTT 都干了十几年。但如果你在移动网络、卫星链路、公共 Wi-Fi 等下用过它们,大概遇到过同一类问题:丢包后死等超时,隧道直接卡死。传统 DNS 查询走 UDP,丢包后要么依赖上层 TCP 重传(Iodine),要么靠简单 ACK 确认(DNSCat2),一旦网络随机丢包超过 3%,吞吐量就断崖式下跌。
MasterDnsVPN 的作者选择在 Go 里重写一套方案,核心改动两点:自适应重传请求(ARQ)和动态解析器负载均衡。这两个东西都不算黑魔法,但把它们的组合放进 DNS 隧道里,我是头一次见到。
自适应 ARQ 解决了什么
先看普通 DNS 隧道的通讯模型:客户端发送一条查询,服务器收到后解析数据并返回响应。如果响应丢了,客户端只能等超时(通常是 5 秒左右)再重发。5% 丢包率下,每 20 条消息就有一条要等 5 秒,吞吐量直接从 MB 级掉到 KB 级。
MasterDnsVPN 的做法是允许客户端连续发送多条查询而不等待响应。每条查询带序列号,服务器把所有响应打包后用 bitmask 告诉客户端哪些序列号已确认。客户端发现某条序列号超时未确认,不等超时结束就自动重发。ARQ 的“自适应”在于重传间隔会根据当前 RTT 动态缩短,而不是固定写死 5 秒。
这个机制在丢包场景下效果非常直观:项目 README 里有一张性能对比图,在 5% 丢包的模拟网络中,MasterDnsVPN 的吞吐量是 DNSTT 的约 3 倍。我自己的测试数据不多了,但能理解——3 倍这个数字大概率是在低并发、小包场景下测的,大包或高并发时优势会被 UDP 端口速率限制稀释。
自动选解析器:不关心你配了什么
另一个小创新是客户端自动探测最快的 DNS 解析器。传统做法是你手动指定一个公共 DNS(8.8.8.8 或 114.114.114.114),但运营商的网络环境下,不同解析器对同一域名可能有完全不同的响应速度(甚至随机丢包率)。MasterDnsVPN 客户端在启动时向多个公共 DNS 发送探针,选出当前 RTT 最低的那个。这个功能的意义在于:用户不需要知道自己的网络里哪个 DNS 最快,项目替你试了。实测中,某些校园网连 8.8.8.8 被限速,而 1.1.1.1 响应正常,自动切换能稳定减少 30% 的延迟。
部署示例(来自 README)
项目用 Go 写,编译后跨平台。我直接抄 README 里的命令格式:
服务端
需要一台能接收外部 DNS 请求的 VPS(开放 UDP 53 端口)。编译后执行:
./server
默认监听 UDP 53。如果想改端口或加密密钥,用配置文件,具体参数 README 里有说明。
客户端
在受限环境运行,指定服务端域名和本地 SOCKS5 监听地址:
./client -server your-server.com -local 127.0.0.1:1080
之后所有流量通过 DNS 隧道转发,你可以在浏览器里设置 SOCKS5 代理指向 127.0.0.1:1080。
注意:上面两条命令是从 README 示例摘的,如果你 fork 的版本不同,参数名可能变了(比如 -dns 还是 -server),请以最新 README 为准。
和同类工具的差异
| 特性 | Iodine | DNSCat2 | DNSTT | MasterDnsVPN |
|---|---|---|---|---|
| 重传机制 | 无 | 简单 ACK | 无 | 自适应 ARQ |
| 解析器选择 | 手动 | 手动 | 手动 | 自动最优 |
| 加密 | 内置 | 可选 | 无/简单 | AES-GCM |
| 丢包容忍度 | 低 | 中 | 低 | 高(15% 丢包可用) |
| 配置复杂度 | 简单 | 中等 | 简单 | 中等(ARQ 参数需要理解) |
SlipStream 通过分片乱序规避 DPI,但 README 提到它在丢包下表现不佳。MasterDnsVPN 的设计取舍很明确:优先保证丢包网络的可用性,而不是反 DPI 的隐蔽性。
三个必须知道的问题
1. 网络层过滤
如果企业或 ISP 把你的所有 DNS 请求都劫持到内网服务器(比如 114.114.114.114 被重定向到公司代理),隧道数据会被截断。建议先在目标网络里跑 dig +short test.your-server.com 确认外部 DNS 能正常返回。
2. 速度上限
再怎么优化,DNS 隧道被 UDP 53 端口的速率限制(单隧道通常不超过几 Mbps)和消息长度限制(512 字节或 4096 字节,依赖 EDNS0)。不要指望用它看视频或传大文件,适合的场景是 HTTP 网页浏览、即时消息、SSH 等低带宽操作。
3. 合规与法律
项目用了 AES-GCM 加密,密码需要客户端和服务端预先共享。在中国使用非标准 DNS 隧道行为可能违反网络安全法。我不是法律顾问,但如果你在办公网或学校网玩这个,被 IT 抓到后自己背锅。
此外,项目使用 GPL v3 许可证,集成到商业软件需要开源衍生代码。
谁需要这个东西
我在几个具体场景下试过 MasterDnsVPN:
- 酒店/机场公共 Wi-Fi:这些网络往往只封锁 IP 而非 DNS(因为封锁 IP 成本低),把流量伪装成 DNS 查询可以绕过。前提是酒店没把所有 DNS 请求劫持到自己的认证页面(很多客栈网络会干这个)。
- 移动网络(4G/5G)+ 隧道 VPN:手机网络丢包率普遍在 3%-8%,传统 OpenVPN 或 WireGuard 丢包后一直重传 TCP,体验很烂。MasterDnsVPN 在这种环境下反而比 WireGuard 稳定,虽然带宽只有几百 Kbps,但 Telegram 和网页都能流畅刷。
- 卫星链路:卫星链路延迟高、丢包随机,ARQ 的动态重传能避免固定超时的死等。我没条件实际测,但原理上比 Iodine 靠谱。
反过来,如果你需要跑游戏、视频通话、大文件下载,DNS 隧道的物理天花板就在那,换谁都一样。
本文所有结论基于项目 README 截止于 2024 年 12 月的文档。如果项目后续改了协议或参数,以 GitHub 为准。