Upgrade to Pro — share decks privately, control downloads, hide ads and more …

プロキシを作って学ぶ WireGuard / Learning WireGuard by Cr...

プロキシを作って学ぶ WireGuard / Learning WireGuard by Creating a Proxy

2025年3月5日のLightning Talksで発表した「プロキシを 作って学ぶ WireGuard」の講演資料です。
講演詳細についてはこちらを御覧ください:https://ntt-developers.github.io/ntt-tech-conference/2025/

NTT Communications

April 20, 2025
Tweet

More Decks by NTT Communications

Other Decks in Technology

Transcript

  1. © NTT Communications Corporation All Rights Reserved. プロキシを 作って学ぶ WireGuard

    2025年03月05日 NTTコミュニケーションズ株式会社 上田 高寛
  2. © NTT Communications Corporation All Rights Reserved. 2 目次 1.

    自己紹介 2. この発表で話すこと、話さないこと 3. WireGuardとは? 4. やりたかったこと 5. 作ったもの 6. 通常のWireGuardの動作 7. プロキシの動作 8. なぜ使わなかったのか? 9. おわりに
  3. © NTT Communications Corporation All Rights Reserved. 3 自己紹介 普段の業務分野

    ・OT(制御)ネットワークセキュリティ 趣味 • 時々自宅NWをいじって遊ぶ(小規模) • 稀に電子工作や3Dプリンタで何かを作る (積み部品だけが増えていく状態...)
  4. © NTT Communications Corporation All Rights Reserved. 4 この発表で話すこと、話さないこと 要約

    • NginxなどにあるVirtualHosts機能ぽいものを作ってみた • プロキシと書いたけど、動作としてはL2スイッチやARPのほうがイメージしやすいかも • 実用には向かないが、WireGuardの通信を理解するきっかけにはなりそうなので共有してみる 話すこと • 作ったプロキシに関して • WireGuardの通信の流れとメッセージ構造(の一部) 話さないこと • WireGuardの使い方 • Cookie Replyメッセージに関しては省略 ※今回紹介するプロキシは実用を想定していません(業務での利用も予定していません)
  5. © NTT Communications Corporation All Rights Reserved. 5 WireGuardとは? WireGuardはシンプルで高速なオープンソースのVPN

    特徴を一部抜粋[1] • UDPを利用 • NAT超えが可能 • IPアドレスの変化や再接続に強い • 公開鍵を利用した認証(SSHの公開鍵認証と似ている) • Cryptokey Routing • 認証に失敗したメッセージ(パケット)は無視する • メッセージの種類は4種類とシンプル • クリプトアジリティを意図的に欠いている • 4,000行未満のコードで実装できるため、監査や検証が容易 [1] Jason A. Donenfeld, “WireGuard: Next Generation Kernel Network Tunnel”, 2020. https://www.wireguard.com/papers/wireguard.pdf.
  6. © NTT Communications Corporation All Rights Reserved. 6 やりたかったこと 諸事情により、複数のWireGuardクライアントから複数サーバへの接続を単一のIPアドレスとポートで受け

    付けられると嬉しい場面があった rox セ メント lient lient 2 lient n er er er er 2 er er n 接続 N rox 接続 N ココ ※ InitiatorをClient、ResponderをServerと読み替え
  7. © NTT Communications Corporation All Rights Reserved. 7 作ったもの ブロードキャストを利用したシンプルで

    不完全なプロキシ どのくらいシンプルなの? → 右のQRコードに収まるくらい 下記コマンドを実行するとソースコードが見えるはず $ echo "[QRコードのbase64文字列]" | base64 -d | gunzip > main.go ※今回紹介するプロキシは実用を想定していません (業務環境での利用もしていません) デコードには CyberChefが便利かも
  8. © NTT Communications Corporation All Rights Reserved. 8 通常のWireGuardの動作 下記の流れで鍵交換(セッション作成)を行う

    1. Handshake Initiaion 2. Handshake Response 3. Transport Data(Initiatorから送信) 4. Transport Data セッションの作成は、2分が経過もしくは、 一定数のメッセージを送信したタイミン で再度行う • REKEY-AFTER-MESSAGES: 260messages • REJECT-AFTER-MESSAGES: 264 − 213 − 1messages • REKEY-AFTER-TIME: 120 seconds • REJECT-AFTER-TIME: 180 seconds lient er er 1RTTで鍵交換が終わる ※負荷がかかっている状態では動作が変わるが、今回は省略(Cookie Replyメッセージ)
  9. © NTT Communications Corporation All Rights Reserved. 9 通常のWireGuardの動作 下記の流れで鍵交換(セッション作成)を行う

    1. Handshake Initiaion 2. Handshake Response 3. Transport Data(Initiatorから送信) 4. Transport Data セッションの作成は、2分が経過もしくは、 一定数のメッセージを送信したタイミン で再度行う • REKEY-AFTER-MESSAGES: 260messages • REJECT-AFTER-MESSAGES: 264 − 213 − 1messages • REKEY-AFTER-TIME: 120 seconds • REJECT-AFTER-TIME: 180 seconds ココを追加 ※負荷がかかっている状態では動作が変わるが、今回は省略(Cookie Replyメッセージ) lient er er rox 1RTTで鍵交換が終わる
  10. © NTT Communications Corporation All Rights Reserved. 10 プロキシの動作 1.

    Handshake Initiation ClientはServerへ、セッションを確立するための Handshake initiationメッセージを送る プロキシはtypeフィールドを確認し下記処理を行う 1. Sendrフィールドをキーに送信元情報をテーブル に格納 2. 宛 アドレスProxyセ メントのブロードキャス トアドレスに変更し送信 3. Proxyセ メント内の全Serverにメッセージが届 く ※ InitiatorをClient、ResponderをServerと読み替え [1] Jason A. Donenfeld, “WireGuard: Next Generation Kernel Network Tunnel”, 2020. https://www.wireguard.com/papers/wireguard.pdf, p. 10. Handshake initiationメッセージの構造([1]より)
  11. © NTT Communications Corporation All Rights Reserved. 11 プロキシの動作 2.

    Responder to Initiator 正規のクライアントからパケットを受け取ったサーバ のみが、レスポンスを返す(WireGuardの仕様) プロキシはtypeフィールドを確認し下記処理を行う 1. sendrフィールドをキーに送信元情報をテーブル に格納 2. receiverフィールドをキーに宛 情報を検索 3. パケットの宛 情報を書き換えてユニキャスト 4. クライアントにパケットが届きセッション確立 Initiator e on er rox Handshake responseメッセージの構造([1]より) ※ InitiatorをClient、ResponderをServerと読み替え [1] Jason A. Donenfeld, “WireGuard: Next Generation Kernel Network Tunnel”, 2020. https://www.wireguard.com/papers/wireguard.pdf, p. 11.
  12. © NTT Communications Corporation All Rights Reserved. 12 ※ InitiatorをClient、ResponderをServerと読み替え

    [1] Jason A. Donenfeld, “WireGuard: Next Generation Kernel Network Tunnel”, 2020. https://www.wireguard.com/papers/wireguard.pdf, p. 12. プロキシの動作 3. Transport Data recieverフィールドの情報をもとにデータを転送する プロキシはtypeフィールドを確認し下記処理を行う 1. receiverフィールドをキーに宛 情報を検索 2. パケットの宛 情報を書き換えてユニキャスト 3. 宛 のClient or Serverに届く Initiator e on er rox Transport dataメッセージの構造([1]より)
  13. © NTT Communications Corporation All Rights Reserved. 13 なぜ使わなかったのか? 一番の理由

    • 無くてもそこまで困らなかった 単一障害点になる • 思い付きで作ったは良いが、クオリティも低く信頼性にも欠けていた 仕組上の課題 • Client側のIPアドレスの変化に弱くなる (テーブル情報をセキュアにどう更新するか?) • Clientが増えるにしたがって、 ブロードキャストパケットが増え システム全体の負荷が上がる • など... 既存のプロキシの存在(未検証) • mwgp(Multiple WireGuard Proxy) • 設定ファイルが必要ぽい
  14. © NTT Communications Corporation All Rights Reserved. 14 おわりに WireGuardはシンプルで高速なVPN

    • UDPを利用 • NAT超えが可能 • IPアドレスの変化や再接続に強い • 公開鍵を利用した認証(SSHの公開鍵認証と似ている) • Cryptokey Routing • 認証に失敗したメッセージ(パケット)は無視する • メッセージの種類は4種類とシンプル 作ったプロキシに関して • 実用には向かないが、WireGuardの通信を理解するきっかけにはなりそうなので共有してみた