作品 20
P2P Minecraft Tunnel
ポート開放も専用サーバーもなしに、STUN と UDP ホールパンチで NAT を越え、Discord サーバーのメンバーだけに参加を限定する Rust/Tauri デスクトップアプリ
- 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 を判別する簡易判定(複数サーバーへのフェイルオーバー付き)