ITADN
mullvad/mullvadvpn-app
mullvad/mullvadvpn-app · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Mullvad VPN 桌面版和移动应用

欢迎使用 Mullvad VPN 客户端应用的源代码仓库。 这是 Mullvad VPN 服务的 VPN 客户端软件。 有关该服务的更多信息,请访问我们的网站, mullvad.net(也可通过 Tor 访问我们的 onion 服务)。

此仓库包含该应用桌面版和移动版的所有源代码。对于桌面版,这包括系统服务/守护进程 (mullvad-daemon)、图形用户界面(GUI)和命令行 界面(CLI)。Android 应用使用相同的后端系统服务来处理 隧道和安全,但拥有位于 android/ 的专用前端。iOS 版本是一个 完全独立的实现,位于 ios/

发布版本

macOS、Windows、Linux 和 Android 的已构建并签名的发布版本可在 我们的网站GitHub 上获取。Android 应用也可在 Google PlayF-Droid 上获取,iOS 版本可在 App Store 上获取。

您可以在 [Mullvad 的开源页面] 找到我们的代码签名密钥以及如何进行密码学验证 下载的说明。

平台/操作系统支持

有关支持哪些操作系统、版本和架构,以及哪些由我们的自动化测试套件覆盖的详细信息,请参阅 Supported Platforms

Features

下表列出了该应用在各平台上的功能。此表旨在反映 git 中最新代码的当前状态,而不一定反映任何现有版本。

WindowsLinuxmacOSAndroidiOS
WireGuard
抗量子隧道
DAITA
WireGuard 多跳
WireGuard over TCP
WireGuard over Shadowsocks
WireGuard over QUIC
轻量级 WireGuard 混淆 (LWO)
分流
自定义 DNS 服务器
内容拦截器(广告等)
可选的本地网络访问✓*
经过外部审计

* 在当前实现中,iOS 上的本地网络始终可访问

用户安全、隐私与匿名性

本应用是一款注重隐私保护的 VPN 客户端。因此,它采取了大量措施以防止流量 泄露。并且,几乎所有设置默认都采用更安全/私密的选项。如果用户希望 允许更宽松的规则,必须明确进行设置。有关该应用阻止和允许的内容以及如何 实现的详细信息,请参阅[专门的安全文档]。

安全开发

由于应用用户的安全是首要任务,因此开发和发布过程的安全 性同样成为首要任务。这是我们积极致力于改进的方面。

OpenSSF Best Practices

Git 签名

所有合并到主分支的合并提交(merge commits)都必须使用 PGP (gpg) 在 git 中进行签名。这相当于对整个功能分支进行签署。功能分支中的各个提交无需签名,除非它们修改了一个或多个被视为特别重要的文件。

要求对修改它们的每个提交进行签名的文件列表,定义在 verify-locked-down-signatures 工作流中。

审计、渗透测试和外部安全审查

本应用每两年由外部安全专家和渗透测试人员进行一次审计。 我们还会针对某些安全关键的功能和变更进行特定功能的审计。

这些审计的结果始终以未删减的原始形式公开, 以向用户保持完全透明。请参阅此处的 audits readme

此外,我们欢迎任何个人审查本应用的安全性,并向我们提交发现的任何问题。详见 SECURITY.md

检出代码

此仓库包含构建应用所需的子模块。然而,其中一些子模块 还包含其他相当庞大且构建应用时不需要的子模块。因此,除非 您想要所有子模块的源代码,否则应避免递归克隆该仓库。 相反,请正常克隆仓库,然后获取一层子模块:

git clone https://github.com/mullvad/mullvadvpn-app.git
cd mullvadvpn-app
git submodule update --init

我们对 main 分支的每个合并提交以及我们的发布标签进行签名。 如果您希望验证您的检出,您可以在 Mullvad's Open Source page 上找到我们的开发者密钥。

Binaries 子模块

此仓库在 dist-assets/binaries 处有一个 git 子模块。该子模块包含我们需要与应用程序捆绑的第三方代码的二进制文件和 构建脚本,例如 Wintun。

该子模块符合与此仓库相同的完整性/安全标准。每个合并 提交都应经过签名。并且此主仓库应始终仅指向 binaries 子模块的已签名合并提交。

有关该仓库的更多 详细信息,请参阅 binaries submodule's README。

构建应用程序

请参阅 build instructions 以获取在桌面平台上构建应用程序的帮助。

有关构建 Android 应用程序,请参阅 instructions 以获取 Android 的说明。

有关构建 iOS 应用程序,请参阅 instructions 以获取 iOS 的说明。

发布应用程序

请参阅 this 以获取如何创建新发布的说明。

服务使用的环境变量

  • TALPID_FIREWALL_DEBUG - 有助于调试防火墙。根据 平台执行不同的操作:

    • Linux: 设置为 "1" 以向所有防火墙规则添加数据包计数器。
    • macOS: 使规则将其匹配的数据包记录到 pflog0 接口。
      • 设置为 "all" 以向所有规则添加日志记录。
      • 设置为 "pass" 以向允许数据包的规则添加日志记录。
      • 设置为 "drop" 以向阻止数据包的规则添加日志记录。
  • TALPID_FIREWALL_DONT_SET_SRC_VALID_MARK - 将此变量设置为 1 以阻止守护进程在 Linux 上建立隧道时将 net.ipv4.conf.all.src_valid_mark 内核参数设置为 1。 默认情况下会设置该内核配置参数,否则严格反向路径过滤 可能会阻止中继流量到达守护进程。如果接收中继流量的接口上 rp_filter 设置为 1,且 src_valid_mark 未设置为 1,则守护进程将 无法接收中继流量。

  • TALPID_FIREWALL_DONT_SET_ARP_IGNORE - 将此变量设置为 1 以阻止守护进程在 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 - 强制守护进程使用 WireGuard 的用户空间实现。

  • TALPID_DISABLE_OFFLINE_MONITOR - 强制守护进程始终假设主机处于在线状态。

  • TALPID_CGROUP2_FS - 在 Linux 上,强制守护进程在指定路径查找 cgroup2 文件系统,而不是 /sys/fs/cgroup。用于拆分隧道的 cgroup2 将在此目录中创建。

  • TALPID_NET_CLS_MOUNT_DIR - 在 Linux 上,如果 net_cls 控制器尚未挂载,则强制守护进程在指定目录中挂载它。这仅对使用 cgroup v1 进行拆分隧道的旧系统有效。

  • MULLVAD_MANAGEMENT_SOCKET_GROUP - 在 Linux 和 macOS 上,这将管理接口 UDS 套接字的访问权限限制为指定组中的用户。这意味着只有该组中的用户才能使用 CLI 和 GUI。默认情况下,所有人都可以访问该套接字。

  • MULLVAD_BACKTRACE_ON_FAULT - 启用后,如果守护进程遇到故障(例如 SIGSEGV),它将把回溯记录到 stdout 以及 daemon.log。默认情况下,此功能在 release-builds 中禁用,在 debug-builds 中启用。将变量设置为 10 以显式启用或禁用此功能。记录回溯会导致堆分配。分配不是信号安全的,但此处它在信号处理程序中运行。这在技术上是未定义行为,因此默认禁用。这通常可以正常工作,但启用风险自负。

Development builds only

  • MULLVAD_API_HOST - 设置 API 请求中使用的 hostname。例如 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

要使更改生效,请重启守护进程:

sc.exe stop mullvadvpn
sc.exe start mullvadvpn

Linux

通过 systemctl edit mullvad-daemon.service 编辑 systemd 单元文件:

[Service]
Environment="TALPID_DISABLE_OFFLINE_MONITOR=1"

要使更改生效,请重启守护进程:

sudo systemctl restart mullvad-daemon

macOS

使用 plutil

sudo plutil -replace EnvironmentVariables -json '{"TALPID_DISABLE_OFFLINE_MONITOR": "1"}' /Library/LaunchDaemons/net.mullvad.daemon.plist

要使更改生效,请重启守护进程:

launchctl unload -w /Library/LaunchDaemons/net.mullvad.daemon.plist
launchctl load -w /Library/LaunchDaemons/net.mullvad.daemon.plist

桌面前端使用的环境变量

  • MULLVAD_PATH - 允许在开发模式下更改 mullvad-problem-report 工具所在文件夹的路径。 默认值为:<repo>/target/debug/
  • MULLVAD_DISABLE_UPDATE_NOTIFICATION - 如果设置为 1,当有可用更新时将禁用通知。

用于 Electron 应用开发的命令行工具

  • $ npm run develop - 启用热重载进行应用开发
  • $ npm run lint - 对代码进行 lint 检查
  • $ npm run pack:<OS> - 为当前平台准备应用分发。其中 <OS> 可以是 linuxmacwin
  • $ 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 守护进程

守护进程使用 Rust 实现,并分布在多个 crate 中。构建最终守护进程二进制文件的主 crate(或顶层 crate)是 mullvad-daemon,它依赖于其他 crate。

通常可以将守护进程视为分为两部分,即以 talpid 开头的 crate 和以 mullvad 开头的 crate。talpid crate 应当与 Mullvad 特定的事物完全无关。例如,talpid crate 不允许了解守护进程用于获取 Mullvad 账户详情或下载 VPN 服务器列表的 API 的任何信息。talpid 组件应被视为具有额外隐私和匿名保护功能的通用 VPN 客户端。另一方面,名称中包含 mullvad 的 crate 利用 talpid 组件来构建一个安全的、Mullvad 特定的 VPN 客户端。

  • Cargo.toml - 主 Rust 工作区定义。请参阅此文件以了解此处哪些文件夹是守护进程 Rust crate。
  • mullvad-daemon/ - 构建守护进程二进制文件的主 Rust crate。
  • talpid-core/ - VPN 客户端实现本身的主 crate。完全与 Mullvad 无关的隐私保护 VPN 客户端库。

词汇表

对本仓库文档和代码中常用的一些术语的解释。

  • App - 整个产品(本仓库中的所有内容)即为“Mullvad VPN App”,简称 App。
    • Daemon - 指 mullvad-daemon Rust 程序。此无头程序暴露了一个 管理接口,可用于控制守护进程
    • Frontend - 用于指代任何连接到守护进程管理 接口并允许用户控制守护进程的程序或组件。
      • GUI - 作为 Mullvad VPN App 图形前端的 Electron + React 程序。
      • CLI - 名为 mullvad 的 Rust 程序,是 Mullvad VPN app 的基于终端的前端。

Mullvad VPN app 使用的文件路径

Mullvad VPN app 各组件写入和读取的文件路径列表

Daemon

在 Windows 上,当进程作为系统服务运行时,变量 %LOCALAPPDATA% 会展开为 C:\Windows\system32\config\systemprofile\AppData\Local

所有目录路径均在 mullvad-paths crate 中定义并从中获取。

Settings

可通过设置 MULLVAD_SETTINGS_DIR 环境变量来更改设置目录。

PlatformPath
Linux/etc/mullvad-vpn/
macOS/etc/mullvad-vpn/
Windows%LOCALAPPDATA%\Mullvad VPN\
AndroidgetFilesDir()

Logs

可通过设置 MULLVAD_LOG_DIR 环境变量来更改日志目录。

PlatformPath
Linux/var/log/mullvad-vpn/ + systemd
macOS/var/log/mullvad-vpn/
WindowsC:\ProgramData\Mullvad VPN\
AndroidgetFilesDir()

Cache

可通过设置 MULLVAD_CACHE_DIR 环境变量来更改缓存目录。

平台路径
Linux/var/cache/mullvad-vpn/
macOS/Library/Caches/mullvad-vpn/
WindowsC:\ProgramData\Mullvad VPN\cache
AndroidgetCacheDir()

RPC 地址文件

可以通过设置 MULLVAD_RPC_SOCKET_PATH 环境变量来更改 RPC 地址文件的完整路径。

平台路径
Linux/var/run/mullvad-vpn
macOS/var/run/mullvad-vpn
Windows//./pipe/Mullvad VPN
AndroidgetNoBackupFilesDir()

桌面 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

图标

请参阅 graphics README 以获取有关图标的信息。

区域设置和翻译

处理区域设置和翻译的说明位于 此处

有关 Android 应用的特定说明,请参阅 此处

有关 iOS 应用的特定说明,请参阅 此处

许可证

版权所有 (C) 2026 Mullvad VPN AB

本程序是自由软件:您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款重新分发和/或修改它,许可证版本为 3 或 (由您选择)任何更高版本。

完整的许可协议,请参阅 LICENSE.md 文件

iOS 应用的源代码与本仓库中的其他所有内容一样,采用 GPL-3 许可。 但在 Apple App Store 上分发的应用不受 GPL 许可, 它受 Apple App Store EULA 约束。