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 是镜像)。
相关
- 项目
- 项目
- 项目
- 项目