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 客户端。因此,它竭尽全力阻止流量 泄露。基本上所有设置都默认为更安全/私密的选项。如果需要,用户必须 明确允许更宽松的规则。有关详细信息,请参阅 [专用安全文档],了解应用阻止和允许的内容 及其实现方式。 ## 安全开发 由于应用用户的安全性是重中之重,因此开发和发布流程的安全性 也成为了重中之重。这是我们积极致力解决的问题。 [![OpenSSF 最佳实践](https://www.bestpractices.dev/projects/9411/badge)](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客户端, 代理服务, 匿名上网, 可视化界面, 图形用户界面, 服务器监控, 桌面应用, 流量加密, 移动应用, 系统服务, 网络安全, 网络安全, 网络流量审计, 翻墙, 远程访问, 通知系统, 通知系统, 通知系统, 隐私保护, 隐私保护, 隐私工具, 隧道技术