RyomaHori

Works

Work 20

P2P Minecraft Tunnel

ポート開放も専用サーバーもなしに、STUN と UDP ホールパンチで NAT を越え、Discord サーバーのメンバーだけに参加を限定する Rust/Tauri デスクトップアプリ

Period
2026-02
Role
個人開発(推定)
Stack
Rust, Tauri, tokio, reqwest (Discord OAuth2), tiny_http (ローカル OAuth コールバック), aes-gcm 0.10, sha2, hmac, pbkdf2, windows crate (Win32 DPAPI), machine-uid, dirs, qrcode, image, parking_lot, dashmap, HTML, CSS, JavaScript
Links
No public link (private)
  • STUN(RFC5389 の Binding Request / XOR-MAPPED-ADDRESS)を外部 crate なしで自前パース・構築。HolePuncher が作った UDP ソケットのまま問い合わせて、NAT のポート保持を利用してパブリック IP:ポートを取得する
  • 双方向 PUNCH / PUNCH_ACK による UDP ホールパンチ(ホスト側は常時受信スレッドから相手にも PUNCH を送り返して NAT 双方を開通させる設計)
  • TCP を UDP 上にカプセル化する独自プロトコル: 1B type + 2B stream_id + 4B seq + 4B ack + 2B length、SYN / SYN-ACK / DATA / ACK / FIN / FIN-ACK / Keepalive。シーケンス番号による並び替えバッファと 200ms 固定 RTO の再送キュー
  • Discord OAuth2 を PKCE で実装し、配布バイナリに CLIENT_SECRET を埋め込まない設計。ローカル HTTP コールバックサーバー(tiny_http)+ state パラメータによる CSRF 対策
  • セッションキャッシュを Windows DPAPI 由来のマシン固有鍵 → PBKDF2 10 万回 → AES-256-GCM で暗号化し、HMAC-SHA256 で改ざん検知(実ログに HMAC 検証失敗の警告が記録されており、検知ロジックが実際に発火した証拠になる)
  • セッション情報を JSON → Base64URL の『共有コード』に変換し、ホスト → クライアント → ホスト(応答コード)の 2 段階でオフバンド交換する UX
  • 同一ソケットで 2 つの STUN サーバーに問い合わせ、返却ポートの一致有無で Cone / Symmetric NAT を判別する簡易判定(複数サーバーへのフェイルオーバー付き)