mmalmi/nostr-vpn

GitHub: mmalmi/nostr-vpn

基于 Nostr 协议和 FIPS 数据平面的跨平台私有 mesh VPN,通过邀请机制和 Nostr 身份实现设备间的去中心化安全组网。

Stars: 1103 | Forks: 103

# nostr-vpn

nostr-vpn logo

`nostr-vpn` 是一个 Tailscale 风格的私有 mesh VPN,构建在基于 [FIPS] 的数据平面之上。它包含 `nvpn` CLI/daemon、一个共享的 native app core,以及适用于桌面和移动平台的 native shell。 ## 下载 - [git.iris.to 上的最新版本](https://git.iris.to/#/npub1xdhnr9mrv47kkrn95k6cwecearydeh8e895990n3acntwvmgk2dsdeeycm/nostr-vpn?tab=releases) - [GitHub 镜像版本](https://github.com/mmalmi/nostr-vpn/releases/latest) - 来自 crates.io 的 CLI:`cargo install nvpn` - [iOS TestFlight 测试版](https://testflight.apple.com/join/58sg4agv) 正在等待 Beta App 审核 发布的构件目前涵盖原生 Apple Silicon macOS、Linux x64、Windows x64、Android arm64,以及适用于 Apple Silicon macOS、Windows x64、Linux x86_64 和 Linux arm64 的无头 CLI 压缩包。Intel macOS 目前仅提供源代码。 ## 快速开始 ``` cargo install nvpn --force nvpn init MY_NPUB='' nvpn set --participant "$MY_NPUB" nvpn create-invite nvpn start --daemon --connect ``` 在另一台设备上使用打印出来的邀请码;请勿粘贴示例占位符: ``` INVITE='' nvpn init nvpn import-invite "$INVITE" nvpn start --daemon --connect ``` 对于桌面应用使用的后台 daemon 流程: ``` nvpn start --daemon --connect nvpn status nvpn stop ``` 用于持久化启动: ``` sudo nvpn service install nvpn service status ``` 在 Windows 上,请从具有管理员权限的 shell 中运行 `nvpn service install`,而不是使用 `sudo`。 ## 原生 Apps native apps 共享 Rust app-core 的状态/操作契约,并使用适用于 macOS、Linux、Windows、Android 和 iOS 的平台 shell。 ``` just build just run ``` 当你需要特定的桌面目标时,请使用 `just run-macos` 或 `just run-linux`。

Nostr VPN desktop app showing a connected Home Mesh network, device status badges, and join request controls.

## 当前可用功能 - 自动生成 Nostr 身份密钥 - 通过邀请以及 roster/admin 同步来共享网络 - 存储多个命名网络,同时一次仅激活一个网络 - 为私有网络流量建立 [FIPS] 私有 mesh 隧道 - 在条件允许时直接路由私有流量,并在直接 UDP 被阻止时通过 [FIPS] 邻居进行路由 - 支持 MagicDNS、路由通告、exit-node 选择以及 WireGuard 上游出口 - 提供 native 桌面应用、JSON 状态、网络诊断、doctor bundle、桌面更新,以及专注于 Linux 的 Docker e2e 覆盖 ## 平台状态 | 平台 | 状态 | | --- | --- | | Apple Silicon macOS | 原生 SwiftUI/AppKit 应用、CLI 压缩包、在配置凭据后提供签名/公证的发布构件 | | Linux x64 | 原生 GTK/libadwaita 应用、`.deb`、CLI 压缩包、Docker e2e 覆盖 | | Windows x64 | 原生 WPF 应用、安装程序、CLI zip、WinTun 隧道路径 | | Android arm64 | 原生 app-core UI、在配置签名后提供签名的 APK/AAB 构件,VPN runtime 仍在加固中 | | iOS | 原生 SwiftUI 应用和 NetworkExtension 目标从源码和模拟器构建;公开 TestFlight 访问尚在等待中 | | Umbrel / StartOS | Web 控制面板和服务包 | | Intel macOS | 仅提供源代码 | ## 延伸阅读 - [协议](docs/protocol.md):邀请、admin roster 同步以及 [FIPS] mesh 数据平面 - [实验](docs/EXPERIMENTS.md):按时间顺序排列的基准测试和可靠性日志 - [Native UI 对齐矩阵](docs/native-ui-parity-matrix.md):native 应用重写状态 - [贡献](CONTRIBUTING.md):维护者命令和包说明 - [更新日志](CHANGELOG.md):版本发布历史 ## 维护者说明 本节特意设计得紧凑且以命令为导向。请将面向用户的产品详细信息保留在上方;将 agent/operator 的参考资料保留在此处。 ### 配置模型 `nvpn init` 会自动创建配置和密钥。默认情况下,配置位于操作系统的应用配置目录中: - Linux: `~/.config/nvpn/config.toml` - macOS: `~/Library/Application Support/nvpn/config.toml` - 在没有配置目录时的回退方案:`./nvpn.toml` 该配置包含全局应用设置、Nostr relay/identity 设置、NAT 设置、node 设置以及一个 `[[networks]]` 列表。每个网络都有其自身稳定的 `network_id`;只有处于活动状态的网络才会参与到实际运行时的进程中。 ### 验证 常规 Rust 检查流程: ``` cargo fmt --check cargo clippy --workspace --all-targets -- -D warnings cargo test --workspace ``` 在版本号升级和打 tag 之前的发布检查流程: ``` just release-gate ``` 有用的针对性检查: ``` pnpm --dir web/control-panel check ( cd linux && cargo check ) dotnet build windows\NostrVpn.Windows\NostrVpn.Windows.csproj -p:EnableWindowsTargeting=true ``` 当本地没有可用的 `dotnet` 时,请在已配置的 Windows 开发虚拟机上运行 Windows 构建。 ### 软件包与 E2E - StartOS 包:[`startos`](startos) - Umbrel 包:[`umbrel`](umbrel) - Umbrel 本地 Web 检查: ``` docker compose -f umbrel/docker-compose.local.yml up --build just e2e-umbrel-web ``` 针对性的安全回归测试套件: ``` just security-regressions ``` Docker e2e 和桌面更新脚本位于 [`scripts`](scripts) 下。最常见的入口点包括 `scripts/e2e-docker.sh`、`scripts/e2e-fips-routed-udp-docker.sh`、`scripts/e2e-fips-nat-safe-mtu-docker.sh`、`scripts/e2e-wireguard-exit-docker.sh` 和 `scripts/e2e-update-desktop.sh`。 ### 发布 1. 将 `CHANGELOG.md` 中的 `## Unreleased` 更改为 `## X.Y.Z - YYYY-MM-DD`。 2. 更新 `Cargo.toml` 中根目录下的 `[workspace.package].version`。 3. 运行 `node scripts/sync-versions.mjs` 并使用 `node scripts/sync-versions.mjs --check` 进行验证。 4. 运行 `just release-gate`。 5. 提交代码,创建 `git tag vX.Y.Z`,将 tag 推送到 `github`,并将 `master` 推送到 `github` 和 htree `origin`。 6. 观察 `.github/workflows/release.yml` 的运行状态。 对于本地构件的暂存,请使用: ``` cp .env.release.example .env.release.local $EDITOR .env.release.local just release-publish ``` ### 工作区布局 - [`crates/nostr-vpn-cli`](crates/nostr-vpn-cli):`nvpn` CLI 和 daemon 实现 - [`crates/nostr-vpn-core`](crates/nostr-vpn-core):配置、[FIPS] 控制状态、诊断、MagicDNS 和 NAT 辅助工具 - [`crates/nostr-vpn-app-core`](crates/nostr-vpn-app-core):native app 状态/操作契约和 UniFFI 桥接 - [`macos`](macos)、[`linux`](linux)、[`windows`](windows)、[`android`](android)、[`ios`](ios):native 平台 shell - [`umbrel`](umbrel)、[`startos`](startos):打包的 service/web-control-panel 目标 - [`scripts`](scripts):构建、发布、Docker e2e 和桌面更新程序的入口点
标签:Nostr, Rust, VPN, 可视化界面, 组网, 网络流量审计, 请求拦截, 通知系统