Slide 1

Slide 1 text

© NTT Communications Corporation All Rights Reserved. プロキシを 作って学ぶ WireGuard 2025年03月05日 NTTコミュニケーションズ株式会社 上田 高寛

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

© NTT Communications Corporation All Rights Reserved. 3 自己紹介 普段の業務分野 ・OT(制御)ネットワークセキュリティ 趣味 • 時々自宅NWをいじって遊ぶ(小規模) • 稀に電子工作や3Dプリンタで何かを作る (積み部品だけが増えていく状態...)

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

© 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.

Slide 6

Slide 6 text

© 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と読み替え

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

© 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メッセージ)

Slide 9

Slide 9 text

© 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で鍵交換が終わる

Slide 10

Slide 10 text

© 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]より)

Slide 11

Slide 11 text

© 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.

Slide 12

Slide 12 text

© 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]より)

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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