mmalmi/nostr-vpn

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

それは何か

nostr-vpn は、Tailscale のようなプライベートメッシュ VPN で、自分のデバイス、サーバー、エージェントをプライベートネットワークに接続できます。Nostr アイデンティティ(公開鍵/秘密鍵ペア)と署名付きデバイス名簿を使用して、参加者を制御します。メールアドレス、電話番号、VPN プロバイダーのアカウントは不要です。

データプレーンは、元の FIPS プロジェクトに基づく、独立に進化した FIPS プロトコル(VPN トンネリングプロトコル)の実装によって駆動されます。このプロジェクトには、バイト単位で価格設定され、Cashu を介して Bitcoin で支払われる、パブリック出口ノード帯域幅を売買できる実験的なマーケットプレイスも含まれています。

仕組み

  • 登録: デバイスが鍵ペアを生成し、署名付き参加要求を送信し、管理者が明示的に承認する必要があります。管理者のアプリが更新された名簿に署名し、配布します。承認が自動的に行われることはありません。
  • 接続: 可能な場合はピアが直接接続します(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 から。

クイックスタート(2 台のデバイス)

最初のデバイス(ネットワークを作成):

nvpn init
DEVICE_ID='<nvpn init の nostr_pubkey を貼り付け>'
nvpn set --device "$DEVICE_ID"
nvpn start --daemon --connect

2 台目のデバイス(参加):

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 では、昇格したシェルから実行します。

コンテナとヘッドレスノード

  • コンテナアーキテクチャに一致する Linux CLI アーカイブを使用します。設定ディレクトリ(キーサイドカーを含む)を永続化し、すべてのコマンドに同じ --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 はミラーです)。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト