VPNの作り方
はじめに
個人的に,VPNを実装しようと思ったのですが,特に,OS上のネットワークの処理周りを含めてどのように実装すれば良いのか分からず詰まったため,ここにまとめます.
特にOSが深く絡んでくるL2/L3 VPNについて解説していきます.
また,OSは基本的にLinuxを想定しています.他のOSでも基本的には同じ手法で,実装できると思います.
OS上でのネットワークの処理について主に解説します.
トンネリングのセッション等の中身の仕組み等については解説はしません.
また,この記事は「一関高専 Advent Calendar 2024」12/1の記事です.
記事の投稿が遅れました,すみません.
用語
この文章の中で使う用語について定義します.
- トンネル
VPNの仮想的な通信経路そのもの
VPNプログラム間の通信のことを指す - オーバーレイネットワーク
VPNのトンネル内のネットワーク,
論理的に構成されたネットワークであり,アンダーレイネットワーク上に構築される - アンダーレイネットワーク
VPNのトンネルが構築されるネットワーク
物理的なネットワークであり,オーバーレイネットワークを転送する
概要
基本的なアプローチとしては,以下のような考えで実装するのが一般的です.
- 基本的に,OSのネットワークスタックをできる限り利用する
ネットワークの処理は実装項目が多く,OSのネットワークスタックを利用することで,実装コストを下げることができます.
独自のネットワークスタックでは,互換性の問題やセキュリティの問題が発生する可能性があります. - 送信
- 仮想インターフェースを利用して,オーバレイネットワークのパケットを取得する
OSのネットワークスタックを利用するためには,アンダーレイネットワークは通常通り処理される必要があります.
そのため,オーバレイネットワークのパケットのみを流れる仮想インターフェースを作成し,そこからパケットを取得します.
ルーティングテーブルを適切に設定すると,オーバレイネットワークのパケットのみを仮想インターフェースに流すことができます. - 取得したパケットを処理し,アンダーレイネットワークに送信する
トンネルに流すための処理(ヘッダーの修正等)を行い,アンダーレイネットワークにあるトンネルにパケットを送信します.
- 仮想インターフェースを利用して,オーバレイネットワークのパケットを取得する
- 受信
基本的に,送信の逆の処理を行います.
そのため,説明を省略します.
処理の流れ
先ほどの概要を踏まえて,送信の処理の流れを以下に示します.
🟥赤線はオーバレイネットワークの処理フローです
🟦青線は通常のアンダーレイネットワークの処理フローです
オーバーレイネットワークの送信の処理フローについて処理ごとに解説します.
- なんらかしらのプログラムから,オーバーレイネットワークのパケットが送信される
- 1.で送信されたパケットは,OSのネットワーク処理を通り,仮想インターフェースに送信される
この時,ルーティングテーブル等に等によって,オーバーレイネットワークのパケットを仮想インターフェースに流すように設定されている - 仮想インターフェースに流れたパケットは,VPNのプログラムに取得される
- VPNのプログラムは,パケットを処理を行い,パケットを送信する
パケットの送信から,アンダーレイネットワークになっていると言え,通常のアンダーレイネットワークの処理フローとなる.
また,このところから,トンネルの中を流れるパケットとなる - 送信されたパケットは,アンダーレイネットワークインターフェースに送信される
- アンダーレイネットワークインターフェースに流れたパケットは,物理デバイスに送信され,アンダーレイネットワークに送信される
仮想インターフェース
VPNのプログラムとOSのネットワークスタックをつなぐために,仮想インターフェースを利用します.
仮想インターフェースは,OS上で物理インターフェースと同じように扱うことができるインターフェースです.
一般に,tun/tapデバイスを利用することが多いです.
さまざまなOSで実装されいているデファクトスタンダードな仮想インターフェースです.
/dev/net/tun
経由でやり取りを行います.
tunはL3のデバイスで,tapはL2のデバイスです.
まとめ
VPNの実装について,特にOS上のネットワークの処理について解説しました.
この中で,L2/L3にそれぞれについては,解説していません.しかしながら,ルーティング等を理解し,オーバーレイが,アンダーレイネットワーク特に,トンネルの経路を干渉しないように設定することが重要です.
また,複数のVPNプログラムが同時に動作する場合,トンネルの経路が干渉しないように設定することも重要です.
Discussion