mmalmi/nostr-vpn

Private mesh VPN for humans and agents. Local keys, signed enrollment, no provider account. Native apps and CLI.

它是什么

nostr-vpn 是一个私有网状 VPN——类似于 Tailscale——允许你将你自己的设备、服务器和代理连接到一个私有网络。它使用 Nostr 身份(公钥/私钥对)和 签名设备名册 来控制谁可以加入。无需电子邮件、电话号码或 VPN 提供商账户。

数据平面由 FIPS 协议(一种 VPN 隧道协议)的独立演进实现驱动,基于原始 FIPS 项目。该项目还包含一个 实验性市场,你可以按字节定价购买或出售公共出口节点带宽,并通过 Cashu 以比特币支付。

工作原理

  • 注册:设备生成密钥对,发送签名加入请求,管理员必须明确批准。管理员的应用程序签名并分发更新后的名册。批准永远不会自动进行。
  • 连接:对等方在可能时直接连接(UDP)。当直接 UDP 不可用时,流量通过 FIPS 邻居路由。
  • 内置功能:MagicDNS(名称解析)、子网路由、出口节点和 WireGuard 上游出口。
  • 性能:该分支针对高速率 VPN 流量进行了优化。在可比的直接路径基准测试中,它通过将数据包所有权、缓冲区和会话状态保持在一起,批处理 I/O 和加密,重用数据包存储,并避免每数据包队列跳转、分配、复制和重复查找,实现了约 原始实现吞吐量的 3 倍。它保留了 FIPS 协议接口。

付费出口(市场)

  • 提供商通过 Nostr 公布每字节价格;买家为 Cashu Spilman 通道 充值,并在使用带宽时签署支付更新。
  • 上传计为发送;UDP 回复和确认的 TCP 下载也计入,但不会对 TCP 重传重复计费。
  • 提供商选择可以是手动的或自动的(基于连接质量、可信评级和价格)。
  • 通道在 12 小时服务截止前续期;提供商随后开始自动收款。买家可以在 24 小时后收回未收取的资金。
  • DNS 默认加密,但出口节点仍然可以看到目标 IP 和未加密的流量——README 建议对敏感数据使用 HTTPS。

组件和平台

  • CLI 和守护进程:nvpn(可通过 cargo install nvpn 或预构建归档安装)。
  • 原生应用:macOS(Apple Silicon)、Linux(x64)、Windows(x64)、Android(arm64)、iOS(arm64)。Intel macOS 仅提供源代码。
  • 服务器软件包:签名的 StartOS(Start9).s9pk 软件包和多架构 Umbrel 镜像。
  • 下载:git.iris.to 发布或 GitHub 镜像;iOS 通过 App Store/TestFlight;Android 通过 APK 或 Zapstore。

快速开始(两台设备)

第一台设备(创建网络):

nvpn init
DEVICE_ID='<粘贴 nvpn init 中的 nostr_pubkey>'
nvpn set --device "$DEVICE_ID"
nvpn start --daemon --connect

第二台设备(加入):

nvpn init
nvpn start --daemon --connect
nvpn join-request

管理员在应用中批准:设备 → 添加加入请求,扫描/粘贴请求,检查详细信息,确认 添加设备。加入的守护进程必须保持运行直到收到批准。

守护进程生命周期: nvpn start --daemon --connect → nvpn status → nvpn stop。

启动服务: sudo nvpn service install --config <路径>(Linux/macOS)。对 status、set 和 service status 命令使用相同的 --config 路径;如果服务拥有配置/状态文件,请使用 sudo 运行。在 Windows 上,从提升的 shell 运行。

容器和无头节点

  • 使用与容器架构匹配的 Linux CLI 归档;持久化配置目录(包括密钥 sidecar),并将相同的 --config 路径传递给每个命令。
  • 需要:root、/dev/net/tun、NET_ADMIN、iproute2,以及 nftables(出口保护)和 iptables(出口转发和旧规则清理)。
  • 容器限制可能会阻止路由清理(例如,只读的 /proc/sys/net/ipv4/route/flush 会使 ip route flush cache 失败)。特权模式是隔离测试容器的变通方法,不是通用的生产要求。
  • 如果没有 systemd-resolved,拆分 MagicDNS 可能仅在日志中打印的本地地址/端口(通常为 127.0.0.1:1053)上可用——这不会自动使名称通过系统解析器解析。
  • 对于健康检查,使用 nvpn start --daemon --connect 并要求 nvpn status --json 中的 status_source == "daemon"。前台 nvpn connect 会话不会发布守护进程状态。

构建和验证

just build
just run
just verify-fast

(对于特定桌面目标,使用 just run-macos / just run-linux;有关更广泛的检查,请参阅 docs/verification-tiers.md。)

文档链接

  • 协议细节:docs/protocol.md(注册、名册同步、路由、DNS 隐私)
  • StartOS 打包:CONTRIBUTING.md
  • 变更日志:CHANGELOG.md
  • 安全报告:SECURITY.md
  • 性能实验:docs/EXPERIMENTS.md
  • 平台实现状态:docs/native-ui-parity-matrix.md

规范仓库:git.iris.to(GitHub 是镜像)。

相关

  • 项目
  • 项目
  • 项目
  • 项目