0xXyc/SwizGuard
GitHub: 0xXyc/SwizGuard
将 WireGuard 隧道封装在 VLESS+REALITY+Vision 协议中,使 VPN 流量对 DPI 系统完全隐形的自建隐身 VPN 方案。
Stars: 109 | Forks: 11
# SwizGuard
自建的隐身 VPN。你的流量看起来就像是在访问某个主流网站的正常 HTTPS 流量。你的 ISP 完全不知道你在进行隧道传输。支持 Mac、Linux、Windows、iPhone 和 Android。只需一条命令即可部署服务器,另一条命令即可为你拥有的每台设备生成配置。
## 为什么我要开发这个工具
我经常出差。酒店 Wi-Fi、不安全的机场网络、那些屏蔽了一半互联网或进行实时监控的国家。我厌倦了一次又一次遇到同样的三个问题。
第一个问题:常规 VPN 会被封锁。不仅仅是在中国或伊朗这种明显的地方。在企业网络里,在有着奇怪过滤规则的咖啡店里,在弹了强制认证门户然后标记你的 WireGuard 流量的酒店 Wi-Fi 里。你打开 NordVPN,然后它就……连不上。或者它能用上十分钟,然后网络就识破了你在干什么并把你断开。
第二个问题:商业 VPN 需要你信任他们。无论是 Nord、Express,还是 Mullvad,随便哪家。他们都承诺“不记录日志”,但你只能相信他们的一面之词。他们的整个商业模式都建立在你对那些根本无法验证的事情的信任之上。我不愿意把我的流量交给一家我无法审计的公司,尤其是当这家公司掌握着我在网上所有活动的出口点时。
第三个问题:我的家人。我的伴侣,我的父母,那些根本不会 SSH 登录到 VPS 去折腾配置的人。我想要一种我只需设置一次,然后直接发给他们一个文件,就能让他们的手机在任何地方都能安全上网的方案。不需要按月订阅,没有满屏广告的 App,也不需要把他们浏览记录托付给某家巴拿马的空壳公司。
现有的各种方案在不同方面都挺糟糕的。单用 WireGuard 虽然快速简洁,但极易被检测——任何现代的 DPI 系统都能在几毫秒内提取它的特征。OpenVPN 既慢又容易被检测。商业 VPN 会被封锁且需要信任。Tor 虽然具有匿名性,但对于日常使用来说太慢了,而且它也不是为了“让我在酒店 Wi-Fi 查一下邮件”这种场景而设计的。
所以我开发了我真正想要的东西。一款具备以下特点的工具:
- 在任何监视者看来就像是在访问 microsoft.com 的 HTTPS 流量,因为在线路上实际传输的字节就是这样显示的
- 运行在我自己那每月 5 美元的 VPS 上,因此只有我才能访问密钥和日志(默认情况下根本不存在日志)
- 在 iPhone 上只需导入一个配置文件即可使用,而不需要“侧载这个自定义的 IPA 并且越狱你的手机”
- 只需一条命令即可部署,这样如果我需要更换司法管辖区,可以在 60 秒内建立一台新服务器
- 不需要我的家人去理解什么是 VLESS 或 REALITY,或者任何底层的协议——他们只需要拿到一个文件,导入,点击连接
SwizGuard 就是最终的结果。我每天都在我的 Mac 和 iPhone 上使用它。我的伴侣也在用它。我还为那些我信任但无法指望他们自己去维护配置的家人安装了它。如果你有类似的理由——经常出差、不信任商业 VPN、想要真正的隐私而不受那些忽悠——那么这款工具适合你。
## 它的实际工作原理
普通的 VPN 在网络线路上显示为“这是一个 VPN”。Wireshark 能看到它,DPI 能提取它的特征,企业防火墙能封锁它。WireGuard 的握手模式是独一无二的。OpenVPN 的 TLS 握手与真实浏览器不匹配。甚至 Nord 和 Express 使用的 IP 范围也早已被所有防火墙厂商标记。
SwizGuard 则不同。它将你的 WireGuard 隧道包装在带有 Vision 流的 VLESS+REALITY 中,这是一个被设计为在密码学上与访问真实网站的真实 HTTPS 连接无法区分的协议栈。当有人探测你的服务器时,他们会获得一个真实的 Microsoft 证书——因为 REALITY 会将握手代理到 microsoft.com 真实的边缘服务器,并返回它发回的所有内容。没有任何伪装可供检测。
你的 ISP 看到的内容:
```
your device → TLS 1.3 → www.microsoft.com
```
实际发生的情况:
```
your device → Xray/sing-box (WireGuard → VLESS → REALITY → Vision) → your VPS → real internet
```
三层加密。没有任何表明存在 VPN 的迹象。除了你自己的 VPS 提供商之外,信任链中不存在任何第三方。
## 线路上的实际数据包样貌
这是最关键的部分。以下是观察者(你的 ISP、企业防火墙、执行审查的政府)在 Wireshark 中实际看到的内容。
### 原始的 WireGuard

每个数据包都被标记为 `WireGuard`。Wireshark 能立即识别出该协议,因为其握手模式是独一无二的,且传输头极具特征。任何 DPI 系统、任何现代防火墙、任何拥有基础工具的网络运营商都能在几毫秒内标记这些数据包。他们不需要解密任何东西——协议识别本身就是特征。
“Info”列甚至会显示数据包类型:`Transport Data, receiver=0x..., counter=...`。这是 WireGuard 内部会话结构的泄露。对于审查者来说,这就像是一个闪烁的霓虹灯招牌,上面写着“这里有 VPN,请屏蔽我”。
### SwizGuard

每个数据包都被标记为 `TLSv1.2` 或 `TCP`,端口为 443,“Application Data”。这就是访问任何普通网站的 HTTPS 在 Wireshark 中的样貌。与 Safari 加载 microsoft.com、Mail 检查 iCloud 或手机更新应用时的数据包形态一模一样。
任何地方都看不到 `WireGuard` 标签,因为 WireGuard 正在加密的 TLS 会话**内部**运行。Wireshark 不知道它的存在。DPI 不知道它的存在。你的 ISP 也不知道它的存在。暴露普通 WireGuard 的特征之所以不可见,是因为它被包裹在 REALITY 的外层 TLS 中,并且 Vision 流对内部握手进行了填充,从而击败了能捕获拙劣嵌套 TLS 代理的 TLS-in-TLS 检测技术。
### 为什么这很重要
在美国一个普通的家庭网络中过上平常的一天,这两个数据包捕获结果之间的差异多半只是理论上的——你的 ISP 并没有主动屏蔽 VPN,所以普通的 WireGuard 运行得很好。但是,一旦你脱离了那种环境,这种差异就会变成“我有网”和“我没网”的天壤之别。
- **酒店和机场 Wi-Fi。**其中许多会封锁已知的 VPN 协议,以强制执行强制门户条款或限制“非商业”流量。普通的 WireGuard 会被直接丢弃。SwizGuard 则能畅通无阻,因为它看起来就是纯粹的 HTTPS。
- **企业网络。**大多数企业防火墙默认配置为识别并屏蔽 VPN。普通的 WireGuard 会失效。SwizGuard 看起来就像在浏览 microsoft.com——具有讽刺意味的是,在 Microsoft 365 环境中,这种流量模式非常普遍,以至于根本不会引起注意。
- **国家级审查。**中国的 GFW、俄罗斯的 TSPU、伊朗的过滤系统——所有这些都使用深度包检测来提取 VPN 协议的特征。普通的 WireGuard 在你越过边境的那一刻就死了。SwizGuard 则能正常工作,因为其线路格式中没有任何内容会暴露 VPN 的存在。
- **监控环境。**即使你没有被屏蔽,“Jake 正在使用 VPN”这个简单的事实本身也是元数据。你的 ISP 可以将其出售、记录在案、随传票移交,或者将其作为自动化系统中的标记。有了 SwizGuard,这种元数据就不复存在了——没有任何迹象能告诉你的 ISP 正在发生任何不同寻常的事情。
Wireshark 中的这种差异正是 SwizGuard 存在的全部原因。普通的 WireGuard 就像在宣告:“我是一个 VPN,请据此做出拦截决定。”而 SwizGuard 就像在说:“我是一个正在阅读 microsoft.com 的普通用户,请忽略我。”
## 实际表现如何
我在真实条件下对此进行了测试。在我从廉价提供商那里租用的 VPS 上进行日常使用,在启用了系统代理的 Mac 上以及通过 SFI 使用 sing-box 的 iPhone 上运行。以下是我可以验证的内容:
- 我的 ISP 看到的是发往 microsoft.com 的 HTTPS 流量。仅此而已。我是通过同一局域网上的另一台机器使用 Wireshark 进行检查的。
- 对我的 VPS 进行主动探测会返回由 Akamai CDN 提供服务的真实 Microsoft 证书。我通过运行 `curl --resolve www.microsoft.com:443:MY_VPS_IP https://www.microsoft.com` 并从 AkamaiGHost 获得带有有效 DigiCert 证书的真实 HTTP/2 200 响应,证实了这一点。
- WireGuard 层在底层运行。我通过 SSH 登录到 VPS 并运行 `sudo wg show wg1` 确认了这一点,该命令显示我的客户端正在以 `endpoint: 127.0.0.1:xxxxx` 进行连接——这是环回地址,意味着 WG 数据包是通过 REALITY 解包路径到达的。
- 如果我直接在 Firefox 中访问我的 VPS IP,浏览器会抛出“证书与 IP 不匹配”的警告。这与直接通过 IP 访问任何 Akamai 边缘服务器时收到的警告相同——这是功能,不是 bug。
这些都不是我盲目相信别人的营销说辞。这些都是我可以直接用 Wireshark 指出来并亲眼验证的东西。
## 功能特性
- **全平台支持完整的 WireGuard + VLESS + REALITY + Vision 链路**——桌面端和移动端架构一致,均可由一条命令生成
- **Vision 流 (`xtls-rprx-vision`)**——消除了会暴露普通 VLESS+REALITY 的 TLS-in-TLS 指纹特征
- **客户端单进程运行**——不需要 wg-quick,不需要内核隧道,不需要 sudo 来启动隧道
- **桌面端使用 Xray-core**,通过 `sockopt.dialerProxy` 进行链式出站
- **移动端通过 SFI/SFA 使用 sing-box**,通过 `detour` 进行端点链式代理
- **服务器端零访问日志**——VPS 不会记录你的去向
- **配套 VPS 加固脚本**——自动检测 UFW 并仅开放 443 端口
- **microsoft.com 是默认伪装目标**——Xray 特别警告不要使用 apple.com 和 icloud.com,因此我避开了它们
- **在 5 美元的 VPS 上即可运行**——我在最便宜的套餐上运行我的节点,完全应付自如
## 系统要求
### 服务器
- Debian 12 或 13,或 Ubuntu 22.04 或 24.04(amd64 或 arm64)
- Root 权限
- 任何廉价 VPS —— Vultr、Linode、Hetzner、DigitalOcean,随便哪家都可以
- 面向互联网开放的 443/tcp 端口
### 桌面端
- `xray-core` v1.8 或更高版本,推荐 v26.x
- macOS:`brew install xray`
- Linux:从 `github.com/XTLS/Xray-core/releases` 下载二进制文件
- Windows:同上述发布页面,将 `xray.exe` 添加到 PATH
### iPhone
- iOS 15 或更高版本
- App Store 中的 **SFI (Sing-Box For iOS)**
- 如果 App Store 版本过旧,TestFlight 构建版本通常包含最新的 sing-box 核心
### Android
- Play 商店中的 **SFA (Sing-Box For Android)**,或者
- **v2rayNG**,如果你更倾向于原生使用 Xray
## 快速入门
### 步骤 1 — 设置服务器
在一台全新的 VPS 上,最好在运行了加固脚本(见下文)之后执行:
```
git clone https://github.com/YOUR_USER/swizguard.git
cd swizguard
sudo ./swizguard setup
```
这样就完成了。六十秒后,你将拥有:
- Xray-core 已安装并在 443 端口上使用 VLESS + REALITY + Vision 运行
- 一个运行在 localhost:51821 的 WireGuard 服务器(不对外暴露)
- 伪装设置为 `www.microsoft.com`
- REALITY 密钥、WireGuard 密钥、客户端 UUID、short ID——全部已生成并保存
- Systemd 服务已启用,一切操作在重启后依然生效
### 步骤 2 — 为你的所有设备添加客户端
```
sudo ./swizguard add macbook
sudo ./swizguard add iphone
sudo ./swizguard add partner-laptop
sudo ./swizguard add mom-phone
```
每个客户端都会获得一个包含以下内容的配置包:
- `xray-client.json`——用于桌面端的全链路配置
- `singbox-client.json`——用于 iOS SFI 或 Android SFA 的全链路配置
- `connect-
.sh`——桌面端的启动脚本
- VLESS 分享链接和二维码(作为不支持导入原始 JSON 的客户端的后备方案)
### 步骤 3 — 连接桌面端
```
# 在你的 Mac 或 Linux 主机上
scp -P 13337 -i YOUR_KEY YOUR_USER@YOUR_VPS:/etc/swizguard/clients/macbook ./
cd macbook
bash connect-macbook.sh
```
进行验证:
```
curl --socks5 127.0.0.1:10808 -4 ifconfig.me
```
这应该会返回你的 VPS IP。如果你想让所有 Mac 流量都通过隧道路由(而不仅仅是你手动配置的应用):
```
bash connect-macbook.sh enable-system-proxy
```
### 步骤 4 — 连接 iPhone(全链路)
1. 从 App Store 安装 **SFI (Sing-Box For iOS)**
2. 将 VPS 上的 `singbox-client.json` 传到你的 iPhone 上。最简单的方法:通过 SCP 传到 Mac,然后 AirDrop 给 iPhone,保存到“文件”
3. SFI 中:Profiles 选项卡 → `+` → Local → 选择该 JSON 文件
4. Dashboard 选项卡 → 选择新配置 → Start → 允许 VPN 权限
5. 打开 Safari 并访问 `ifconfig.me`。你应该会看到你的 VPS IP
### 步骤 5 — 连接 Android
同样是基于文件的导入,只是使用的 App 不同。可以使用 SFA(sing-box 原生)或 v2rayNG(Xray 原生)。两者都支持全链路。
## 命令列表
| 命令 | 功能 |
|---|---|
| `./swizguard setup` | 在全新的 VPS 上进行新安装 |
| `./swizguard add ` | 生成新的客户端配置包 |
| `./swizguard regen ` | 为现有客户端重新生成配置(在服务器更改后使用) |
| `./swizguard share ` | 打印现有客户端的二维码和 VLESS 链接 |
| `./swizguard list` | 列出所有客户端 |
| `./swizguard remove ` | 吊销某客户端 |
| `./swizguard status` | 服务器健康状况,已连接的节点 |
| `./swizguard upgrade-vision` | 在较早的部署上启用 Vision 流 |
| `./swizguard rekey` | 轮换 REALITY 密钥(在重新生成配置前会使所有现有客户端失效) |
| `./swizguard nuke` | 卸载所有内容 |
| `./swizguard help` | 显示帮助信息 |
## 推荐的部署顺序
我在每台机器上都把 SwizGuard 和我的 [VPS-Lock-Figuration](https://github.com/0xXyc/VPS-Lock-Figuration) 脚本搭配使用。那个加固脚本是我配置每台全新 VPS 时首先运行的——它会创建一个非 root 用户,强制仅使用 SSH 密钥认证,将 SSH 移至自定义端口,启用具有严格默认规则的 UFW,安装 fail2ban,并开启自动安全更新。在安装任何其他软件之前,请先运行该脚本。
然后以非 root 用户身份通过 sudo 部署 SwizGuard。它会自动检测 UFW 并仅开放 443 端口。这两个脚本可以完美结合——Lock-Figuration 设定安全基线,SwizGuard 在此基础上添加隐身 VPN。从全新 VPS 到可正常工作的隧道,总耗时不到五分钟。
## 自行验证伪装效果
不要只听我的一面之词。自己测试一下。在一台未连接到该隧道的机器上执行:
```
curl -I --resolve www.microsoft.com:443:YOUR_VPS_IP https://www.microsoft.com
```
你应该会看到类似这样的内容:
```
HTTP/2 200
server: AkamaiGHost
content-type: text/html
```
该响应来自由 REALITY 通过你的 VPS 代理的真实 Akamai 基础设施。TLS 握手中的证书是经 DigiCert 签发的真实 `*.microsoft.com` 证书。你的服务器表现得与 Microsoft 边缘节点一模一样,因为在机制上,这正是 REALITY 在被探测时让它执行的操作。
如果你直接在 Firefox 中访问 `https://YOUR_VPS_IP`,你会收到一个“证书与 IP 不匹配”的警告。这是预期行为。真实的 Microsoft 证书,错误的hostname——这与直接通过 IP 访问任何 Akamai 边缘时遇到的行为相同。证书匹配是基于域名的,而不是基于 IP 的。Firefox 正在验证伪装的有效性。
## 文档
- [工作原理](docs/how-it-works.md)——关于链路、REALITY、Vision 流及威胁模型的技术深入剖析
- [安装指南](docs/setup-guide.md)——逐步的服务器部署、客户端生成和移动端设置说明
- [故障排除](docs/troubleshooting.md)——我在开发过程中遇到的每一个奇怪问题及其解决方法
## 防护范围
- ISP、网络运营商、企业防火墙的被动检查
- 对你的服务器进行的主动扫描和探测
- TLS-in-TLS 指纹识别(GFW 用来捕获普通 VLESS+REALITY 的技术)
- 基于 DPI 的 VPN 检测
- 商业 VPN 屏蔽列表
- 酒店、机场、咖啡店、学校的普通防火墙
## 不防护的范围
我打算坦诚地说明这一点,因为有太多 VPN 工具过度夸大了它们自己的能力。
- **执行端到端时序关联的全局被动对手。**如果国家级行为者能够同时看到你的 ISP 流量和你的 VPS 的上游提供商,他们就可以通过分析数据包时序来推断你的访问目标。没有任何低延迟 VPN 能抵御这种情况。Tor 才是应对这种威胁模型的答案。
- **VPS 提供商的妥协或法律强制。**如果你的 VPS 提供商被传唤或被攻陷,攻击者将获得该主机的 root 权限。请根据你实际的威胁模型来挑选你的提供商和司法管辖区。如果你想将你的身份与服务器解绑,请使用 Monero 进行支付。
- **端点被攻陷。**你手机或笔记本上的恶意软件会在流量加密前读取它。任何 VPN 都帮不上忙。请保持你的设备清洁。
- **行为去匿名化。**如果你在连接 VPN 的同时使用真实姓名登录 Google,Google 依然知道你是谁。VPN 隐藏的是你的网络位置,而不是你的身份。这是两码事。
完整威胁模型请参见 [docs/how-it-works.md](docs/how-it-works.md)。
## 鸣谢
这个工具建立在许多其他人的工作基础之上。所有的协议和底层原语均来自上游:
- **[Xray-core / XTLS 团队](https://github.com/XTLS/Xray-core)**——REALITY 协议、Vision 流、WireGuard 出站,以及让这一切成为可能的 `sockopt.dialerProxy` 链式代理模式
- **[sing-box / SagerNet](https://github.com/SagerNet/sing-box)**——sing-box 本身、`wireguard` 端点,以及用于移动端链式代理的 `detour` 字段
- **[WireGuard](https://www.wireguard.com/)**——负责实际执行内部加密的 VPN 协议
- **[Xray 的 Warp-over-proxy 指南](https://xtls.github.io/en/document/level-2/warp.html)**——关于 `dialerProxy` 链式代理应如何工作的权威参考资料
SwizGuard 是自动化和打包层。它将这些工具拼凑成可部署的方案,处理密钥生成和配置模板化,从单一的真相来源生成匹配的 Xray 和 sing-box 配置,并为你提供管理命令,这样你就不必每次添加设备时都手动编辑 JSON。底层所有与密码学相关的内容都是我作为库来使用的其他人的成果。
## 许可证
MIT。请参见 [LICENSE](LICENSE)。
## 免责声明
SwizGuard 是一款隐私和抗审查工具。请在您所在的司法管辖区合法使用。我不提供任何担保,也不对滥用行为承担责任。我开发它是因为我自己的旅行和隐私需要它,我将其公开发布是因为其他人可能也需要类似的东西。完整的免责声明请参见 [DISCLAIMER.md](DISCLAIMER.md)。标签:Cutter, HTTPS伪装, TLS流量伪装, V2Ray, WireGuard, Xray, Xray-core, 全平台VPN, 加密隧道, 反监控, 安全合规, 安全通信, 安全防护, 开源VPN, 抗审查, 抗封锁VPN, 流量伪装, 深度包检测绕过, 私有VPN, 绕过DPI, 网络代理, 网络安全, 网络安全, 翻墙工具, 自托管VPN, 规避审查, 跨平台支持, 防窃听, 隐私保护, 隐私保护, 隐身VPN, 隧道代理