mullvad/mullvadvpn-app
GitHub: mullvad/mullvadvpn-app
Mullvad VPN客户端是一个开源多平台VPN软件,通过加密隧道和高级混淆技术强化网络隐私与安全,抵御流量分析和审查。
Stars: 6818 | Forks: 449
# Mullvad VPN 桌面和移动应用
欢迎使用 Mullvad VPN 客户端应用源代码仓库。
这是 Mullvad VPN 服务的 VPN 客户端软件。
欲了解更多关于该服务的信息,请访问我们的网站,
[mullvad.net](https://mullvad.net)(也可通过 Tor 在我们的
[onion 服务](http://o54hon2e2vj6c7m3aqqu6uyece65by3vgoxxhlqlsvkmacw6a7m7kiad.onion/)上访问)。
本仓库包含该应用桌面版和移动版的所有源代码。对于桌面端,这包括系统服务/daemon
([`mullvad-daemon`](mullvad-daemon/))、一个图形用户界面 ([GUI](desktop/)) 和一个命令
行界面 ([CLI](mullvad-cli/))。Android 应用使用相同的后端系统服务进行
隧道传输和安全处理,但在 [android/](android/) 中有专门的前端。iOS 则包含一个
完全独立的实现,位于 [ios/](ios/) 中。
## 发布版本
macOS、Windows、Linux 和 Android 的构建和签名版本可在
[我们的网站](https://mullvad.net/download/)和
[GitHub](https://github.com/mullvad/mullvadvpn-app/releases/)上获取。Android 应用也可在
[Google Play] 和 [F-Droid] 上获取,iOS 版本可在 [App Store] 获取。
您可以在 [Mullvad 的开源页面] 上找到我们的代码签名密钥以及关于如何通过加密方式验证
您下载内容的说明。
### 平台/操作系统支持
以下是该应用官方支持的操作系统及其版本。它可能
适用于更多版本,但我们不对这些版本进行测试,也无法保证质量或
安全性。
| 操作系统/平台 | 支持的版本 |
|-------------|--------------------|
| Windows | 10 和 11 |
| macOS | 三个最新的主要版本 |
| Linux (Ubuntu)| 两个最新的 LTS 版本和最新的非 LTS 版本 |
| Linux (Fedora) | 尚未 [EOL](https://fedoraproject.org/wiki/End_of_life) 的版本 |
| Linux (Debian) | 12 及更新版本 |
| Android | 8 及更新版本 |
| iOS | 17.0 及更新版本 |
在 Linux 上,我们使用 Gnome 桌面环境进行测试。该应用应该,而且很可能在
其他桌面环境下也能工作,但我们不定期测试这些环境。
## 功能
下表包含该应用跨平台的功能。这旨在反映
git 中最新代码的当前状态,而不一定是任何现有发布版本的状态。
| | Windows | Linux | macOS | Android | iOS |
|-----------------------------------------|:-------:|:-----:|:-----:|:-------:|:---:|
| WireGuard | ✓ | ✓ | ✓ | ✓ | ✓ |
| 抗量子隧道 | ✓ | ✓ | ✓ | ✓ | ✓ |
| [DAITA] | ✓ | ✓ | ✓ | ✓ | ✓ |
| WireGuard 多跳 | ✓ | ✓ | ✓ | ✓ | ✓ |
| WireGuard over TCP | ✓ | ✓ | ✓ | ✓ | ✓ |
| WireGuard over Shadowsocks | ✓ | ✓ | ✓ | ✓ | ✓ |
| WireGuard over QUIC | ✓ | ✓ | ✓ | ✓ | ✓ |
| 轻量级 WireGuard 混淆 (LWO) | ✓ | ✓ | ✓ | ✓ | |
| 分流隧道 | ✓ | ✓ | ✓ | ✓ | |
| 自定义 DNS 服务器 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 内容拦截器 (广告等) | ✓ | ✓ | ✓ | ✓ | ✓ |
| 可选的本地网络访问 | ✓ | ✓ | ✓ | ✓ | ✓\* |
| [外部审计](./audits) | ✓ | ✓ | ✓ | ✓ | ✓ |
\* 在当前的实现中,iOS 上的本地网络始终可访问
## 用户安全、隐私和匿名性
此应用是一个保护隐私的 VPN 客户端。因此,它竭尽全力阻止流量
泄露。基本上所有设置都默认为更安全/私密的选项。如果需要,用户必须
明确允许更宽松的规则。有关详细信息,请参阅 [专用安全文档],了解应用阻止和允许的内容
及其实现方式。
## 安全开发
由于应用用户的安全性是重中之重,因此开发和发布流程的安全性
也成为了重中之重。这是我们积极致力解决的问题。
[](https://www.bestpractices.dev/projects/9411)
### Git 签名
所有合并到 main 分支的合并提交必须在 git 中进行 PGP (gpg) 签名。这将签署整个
特性分支。特性分支中的单个提交不需要签名,
除非它们更改了一个或多个被视为特别重要的文件。
需要签名以更改它们的文件列表定义在
[`verify-locked-down-signatures`](.github/workflows/verify-locked-down-signatures.yml)
工作流中。
### 审计、渗透测试和外部安全审查
此应用每两年由外部安全专家和渗透测试人员进行一次审计。
我们还对某些关键安全功能和更改进行特定功能的审计。
这些审计的结果始终以其未删节的原始形式公开,以
向用户保持完全透明。请参阅 [审计自述文件](./audits/README.md)。
此外,我们欢迎任何个人审查此应用的安全性,并将发现的任何
问题提交给我们。更多信息请参阅 [SECURITY.md](SECURITY.md)。
## 检出代码
此仓库包含构建应用所需的子模块。但是,其中一些子模块
还有更深层的子模块,这些子模块非常大且构建应用时不需要。因此,除非
您想要所有子模块的源代码,否则应避免递归克隆仓库。
而是正常克隆仓库,然后获取一级子模块:
```
git clone https://github.com/mullvad/mullvadvpn-app.git
cd mullvadvpn-app
git submodule update --init
```
在 Android、Windows、Linux 和 macOS 上,您还需要检出 wireguard-go 子模块:
```
git submodule update --init wireguard-go-rs/libwg/wireguard-go
```
有关为何必要的更多详细信息,请参阅 [wireguard-go-rs crate](./wireguard-go-rs/README.md)。
我们对 `main` 分支的每个合并提交以及我们的发布标签进行签名。
如果您想验证您的检出,您可以在
[Mullvad 的开源页面] 上找到我们的开发者密钥。
### 二进制文件子模块
此仓库在 `dist-assets/binaries` 处有一个 git 子模块。此子模块包含二进制文件和
我们需要与应用捆绑的第三方代码(如 Wintun)的构建脚本。
此子模块遵循与此仓库相同的完整性/安全标准。每个合并
提交都应签名。并且此主仓库应仅指向二进制文件子模块的已签名合并提交。
有关该仓库的更多详细信息,请参阅
[二进制文件子模块的](https://github.com/mullvad/mullvadvpn-app-binaries) README。
## 构建应用
请参阅 [构建说明](BuildInstructions.md) 以获取在桌面平台上构建应用的帮助。
要构建 Android 应用,请参阅 Android 的[说明](./android/docs/BuildInstructions.md)。
要构建 iOS 应用,请参阅 iOS 的[说明](./ios/BuildInstructions.md)。
## 发布应用
有关如何制作新版本的说明,请参阅 [此链接](Release.md)。
## 服务使用的环境变量
* `TALPID_FIREWALL_DEBUG` - 帮助调试防火墙。根据平台执行不同的操作:
* Linux: 设置为 `"1"` 以向所有防火墙规则添加数据包计数器。
* macOS: 使规则将它们匹配的数据包记录到 `pflog0` 接口。
* 设置为 `"all"` 以向所有规则添加日志记录。
* 设置为 `"pass"` 以向允许数据包的规则添加日志记录。
* 设置为 `"drop"` 以向阻止数据包的规则添加日志记录。
* `TALPID_FIREWALL_DONT_SET_SRC_VALID_MARK` - 将此变量设置为 `1` 以阻止 daemon 在建立隧道时
在 Linux 上将 `net.ipv4.conf.all.src_valid_mark` 内核参数设置为 `1`。
设置内核配置参数是默认行为,否则严格反向路径过滤
可能会阻止中继流量到达 daemon。如果在将接收中继流量的接口上
`rp_filter` 设置为 `1`,并且 `src_valid_mark` 未设置为 `1`,daemon 将
无法接收中继流量。
* `TALPID_FIREWALL_DONT_SET_ARP_IGNORE` - 将此变量设置为 `1` 以阻止 daemon 在建立隧道时
在 Linux 上将 `net.ipv4.conf.all.arp_ignore` 内核参数设置为 `2`。
设置内核配置参数是默认行为,否则能够向运行 Mullvad 的设备发送 ARP 请求的攻击者
可以找出隧道内 IP。
* `TALPID_DNS_MODULE` - 允许更改将用于 DNS 配置的方法。
默认情况下,这是自动检测的,但您可以将其设置为以下选项之一以
选择特定方法。
* Linux
* `"static-file"`: 直接更改 `/etc/resolv.conf` 文件
* `"resolvconf"`: 使用 `resolvconf` 程序
* `"systemd"`: 通过 DBus 使用 systemd 的 `resolved` 服务
* `"network-manager"`: 通过 DBus 使用 `NetworkManager` 服务
* Windows
* `iphlpapi`: 使用 IP helper API
* `netsh`: 使用 `netsh` 程序
* `tcpip`: 在注册表中设置 TCP/IP 参数
* `TALPID_DISABLE_LOCAL_DNS_RESOLVER` - 将此变量设置为 `1` 以禁用本地 DNS 解析器
(仅限 macOS)。
* `TALPID_NEVER_FILTER_AAAA_QUERIES` - 将此变量设置为 `1` 以从不忽略 DNS AAAA 查询
(仅限 macOS)。
* `TALPID_FORCE_USERSPACE_WIREGUARD` - 强制 daemon 使用 WireGuard 的用户空间实现。
* `TALPID_DISABLE_OFFLINE_MONITOR` - 强制 daemon 始终假定主机处于在线状态。
* `TALPID_CGROUP2_FS` - 在 Linux 上,强制 daemon 在指定路径查找 cgroup2 文件系统,
而不是 `/sys/fs/cgroup`。用于分流隧道的 cgroup2 将创建在此目录中。
* `TALPID_NET_CLS_MOUNT_DIR` - 在 Linux 上,如果尚未挂载,强制 daemon 在指定目录中挂载 `net_cls` 控制器。
这仅在使用 cgroup v1 进行分流隧道的旧系统上有效。
* `MULLVAD_MANAGEMENT_SOCKET_GROUP` - 在 Linux 和 macOS 上,这将限制对管理接口 UDS 套接字的访问仅限于指定组中的用户。这意味着只有该组中的用户可以使用 CLI 和 GUI。默认情况下,每个人都有权访问该套接字。
* `MULLVAD_BACKTRACE_ON_FAULT` - 启用后,如果 daemon 遇到故障(例如 `SIGSEGV`),它将把回溯信息记录到标准输出和 `daemon.log`。默认情况下,这在发布版本中是禁用的,在调试版本中是启用的。将变量设置为 `1` 或 `0` 以显式启用或禁用此功能。记录回溯会导致堆分配。分配不是信号安全的,但这里它在信号处理程序中运行。这在技术上是未定义的行为,因此默认情况下禁用。这通常有效,但启用风险自负。
### 仅限开发构建
* `MULLVAD_API_HOST` - 设置 API 请求中使用的主机名。例如 `api.mullvad.net`。
* `MULLVAD_API_ADDR` - 设置 API 请求中使用的 IP 地址和端口。例如 `10.10.1.2:443`。
* `MULLVAD_API_DISABLE_TLS` - 对 API 请求使用普通 HTTP。
* `MULLVAD_CONNCHECK_HOST` - 设置连接检查请求中使用的主机名。例如 `am.i.mullvad.net`。
* `MULLVAD_ENABLE_DEV_UPDATES` - 在开发构建中启用版本检查。
### 设置环境变量
#### Windows
在提升的 (管理员) shell 中使用 `setx`:
```
setx TALPID_DISABLE_OFFLINE 1 /m
```
要使更改生效,请重启 daemon:
```
sc.exe stop mullvadvpn
sc.exe start mullvadvpn
```
#### Linux
通过 `systemctl edit mullvad-daemon.service` 编辑 systemd 单元文件:
```
[Service]
Environment="TALPID_DISABLE_OFFLINE_MONITOR=1"
```
要使更改生效,请重启 daemon:
```
sudo systemctl restart mullvad-daemon
```
#### macOS
使用 `plutil`:
```
sudo plutil -replace EnvironmentVariables -json '{"TALPID_DISABLE_OFFLINE_MONITOR": "1"}' /Library/LaunchDaemons/net.mullvad.daemon.plist
```
要使更改生效,请重启 daemon:
```
launchctl unload -w /Library/LaunchDaemons/net.mullvad.daemon.plist
launchctl load -w /Library/LaunchDaemons/net.mullvad.daemon.plist
```
## 桌面前端使用的环境变量
* `MULLVAD_PATH` - 允许更改在开发模式下运行时包含 `mullvad-problem-report` 工具的文件夹的路径。默认为:`/target/debug/`。
* `MULLVAD_DISABLE_UPDATE_NOTIFICATION` - 如果设置为 `1`,当有可用更新时将禁用通知。
## Electron 应用开发的命令行工具
- `$ npm run develop` - 启用实时重载开发应用
- `$ npm run lint` - 检查代码
- `$ npm run pack:` - 为您的平台准备分发应用其中 `` 可以是
`linux`、`mac` 或 `win`
- `$ npm test` - 运行测试
## Linux 上的托盘图标
显示托盘图标的要求因桌面环境而异。如果
托盘图标未出现,请尝试以下方法之一:
### GNOME
如果您使用的是 GNOME,您可能需要安装额外的 GNOME shell 扩展才能正确显示托盘图标。
我们推荐 `AppIndicator and KStatusNotifierItem Support`。可以通过 GNOME 扩展网站安装:
https://extensions.gnome.org/extension/615/appindicator-support/
### 其他桌面环境
尝试使用系统的包管理器安装以下包之一:
- `libappindicator3-1`
- `libappindicator1`
- `libappindicator`
## 仓库结构
### Electron 应用和 electron-builder 打包资源
- **desktop/packages/mullvad-vpn/**
- **assets/** - 图形资源和样式表
- **src/**
- **main/**
- **index.ts** - 主进程的入口文件
- **renderer/**
- **app.tsx** - 渲染进程的入口文件
- **routes.tsx** - 路由配置器
- **transitions.ts** - 视图之间的过渡规则
- **tasks/** - 用于构建应用和在开发期间监视更改的 Gulp 任务
- **distribution.js** - `electron-builder` 的配置
- **test/** - Electron GUI 测试
- **dist-assets/** - 创建安装包时使用的图标、二进制文件和其他文件
- **binaries/** - 包含与应用捆绑的二进制文件的 Git 子模块。有关详细信息,请参阅子模块中的 README
- **linux/** - deb 和 rpm 工件的脚本和配置文件
- **pkg-scripts/** - 与 macOS pkg 安装程序捆绑并由其执行的脚本
- **windows/** - Windows NSIS 安装程序配置和资源
### 构建、测试和杂项
- **build-windows-modules.sh** - 编译 Windows 上所需的 C++ 库
- **build.sh** - 检查工作目录状态的完整性,然后为应用构建安装程序
### Mullvad Daemon
daemon 使用 Rust 实现,并在多个 crate 中实现。构建最终 daemon 二进制文件的主 crate(或顶级
crate)是 `mullvad-daemon`,它依赖于其他 crate。
通常,可以将 daemon 视为分为两部分,以 `talpid` 开头的 crate
和以 `mullvad` 开头的 crate。`talpid` crate 应该与
Mullvad 特定的事物完全无关。例如,`talpid` crate 不允许通过 daemon 获取 Mullvad 账户详细信息或下载 VPN 服务器列表的 API 了解任何信息。
`talpid` 组件应被视为具有额外隐私和匿名保护功能的通用 VPN 客户端。另一方面,名称中包含 `mullvad` 的 crate 利用
`talpid` 组件构建安全且特定于 Mullvad 的 VPN 客户端。
- **Cargo.toml** - 主 Rust 工作区定义。请参阅此文件以了解此处的哪些文件夹是 daemon Rust crate。
- **mullvad-daemon/** - 构建 daemon 二进制文件的主 Rust crate。
- **talpid-core/** - VPN 客户端实现本身的主 crate。完全独立于 Mullvad 的
保护隐私的 VPN 客户端库。
## 词汇表
本仓库中文档和代码使用的一些常见词汇的解释。
- **App (应用)** - 整个产品(此仓库中的所有内容)是 “Mullvad VPN App”,或简称 App。
- **Daemon** - 指 `mullvad-daemon` Rust 程序。这个无头程序暴露一个
可用于控制 daemon 的管理接口
- **Frontend (前端)** - 用于指代连接到 daemon 管理接口并允许用户控制 daemon 的任何程序或组件的术语。
- **GUI** - Electron + React 程序,是 Mullvad VPN 应用的图形前端。
- **CLI** - 名为 `mullvad` 的 Rust 程序,是 Mullvad VPN 应用的基于终端的前端。
## Mullvad VPN 应用使用的文件路径
Mullvad VPN 应用的各种组件写入和读取的文件路径列表
### Daemon
在 Windows 上,当进程作为系统服务运行时,变量 `%LOCALAPPDATA%` 展开为
`C:\Windows\system32\config\systemprofile\AppData\Local`。
所有目录路径都在 `mullvad-paths` crate 中定义并从中获取。
#### 设置
可以通过设置 `MULLVAD_SETTINGS_DIR` 环境变量来更改设置目录。
| 平台 | 路径 |
|----------|------|
| Linux | `/etc/mullvad-vpn/` |
| macOS | `/etc/mullvad-vpn/` |
| Windows | `%LOCALAPPDATA%\Mullvad VPN\` |
| Android | [`getFilesDir()`](https://developer.android.com/reference/android/content/Context#getFilesDir()) |
#### 日志
可以通过设置 `MULLVAD_LOG_DIR` 环境变量来更改日志目录。
| 平台 | 路径 |
|----------|------|
| Linux | `/var/log/mullvad-vpn/` + systemd |
| macOS | `/var/log/mullvad-vpn/` |
| Windows | `C:\ProgramData\Mullvad VPN\` |
| Android | [`getFilesDir()`](https://developer.android.com/reference/android/content/Context#getFilesDir()) |
#### 缓存
可以通过设置 `MULLVAD_CACHE_DIR` 环境变量来更改缓存目录。
| 平台 | 路径 |
|----------|------|
| Linux | `/var/cache/mullvad-vpn/` |
| macOS | `/Library/Caches/mullvad-vpn/` |
| Windows | `C:\ProgramData\Mullvad VPN\cache` |
| Android | [`getCacheDir()`](https://developer.android.com/reference/android/content/Context#getCacheDir()) |
#### RPC 地址文件
可以通过设置 `MULLVAD_RPC_SOCKET_PATH` 环境变量来更改 RPC 地址文件的完整路径。
| 平台 | 路径 |
|----------|------|
| Linux | `/var/run/mullvad-vpn` |
| macOS | `/var/run/mullvad-vpn` |
| Windows | `//./pipe/Mullvad VPN` |
| Android | [`getNoBackupFilesDir()`](https://developer.android.com/reference/android/content/ContextWrapper#getNoBackupFilesDir()) |
### 桌面 Electron 应用
桌面 Electron 应用有一个为每个用户配置的特定设置文件。路径在
`desktop/packages/mullvad-vpn/src/main/gui-settings.ts` 文件中设置。
| 平台 | 路径 |
|----------|------|
| Linux | `$XDG_CONFIG_HOME/Mullvad VPN/gui_settings.json` |
| macOS | `~/Library/Application Support/Mullvad VPN/gui_settings.json` |
| Windows | `%LOCALAPPDATA%\Mullvad VPN\gui_settings.json` |
| Android | 存在于 Android 的 `logcat` 中 |
## 图标
有关图标的信息,请参阅 [图形 README](graphics/README.md)。
## 语言环境和翻译
有关如何处理语言环境和翻译的说明可在
[此处](./desktop/packages/mullvad-vpn/locales/README.md)找到。
有关 Android 应用的具体说明,请参阅 [此处](./android/README.md)。
有关 iOS 应用的具体说明,请参阅 [此处](./ios/translation/README.md)。
# 许可证
版权所有 (C) 2026 Mullvad VPN AB
本程序是自由软件:您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款重新分发和/或修改它,许可证版本为
3 或(您选择的)任何后续版本。
有关完整的许可协议,请参阅 LICENSE.md 文件
iOS 应用的源代码与该仓库中的所有其他内容一样,均采用 GPL-3 许可。
但 Apple App Store 上分发的应用不是 GPL 许可的,
它属于 [Apple App Store EULA] 管辖。
标签:Android, DSL, iOS, JS文件枚举, Mullvad, Rust, VPN, VPN客户端, 代理服务, 匿名上网, 可视化界面, 图形用户界面, 服务器监控, 桌面应用, 流量加密, 移动应用, 系统服务, 网络安全, 网络安全, 网络流量审计, 翻墙, 远程访问, 通知系统, 通知系统, 通知系统, 隐私保护, 隐私保护, 隐私工具, 隧道技术