手当たり次第に書くんだ

飽きっぽいのは本能

OpenVPN のパケット構造 – TLS 制御チャネルとデータチャネルを理解する

OpenVPN のパケットフォーマットは、普段の設定作業ではあまり意識しません。接続できるか、認証できるか、ルーティングできるかを見るだけなら、設定ファイルとログを確認する方が早いからです。

ただし、OpenVPN が内部で何をしているのかを理解するには、パケットを「外側の TCP / UDP」「TLS 制御チャネル」「データチャネル」に分けて見ると整理しやすくなります。

この記事では、OpenVPN のパケット構造を、制御チャネルとデータチャネルの違いから整理します。

  • OpenVPN の外側は TCP または UDP でカプセル化される。
  • TLS モードでは、opcode と key_id によってメッセージ種別と鍵世代を扱う。
  • P_CONTROL / P_ACK は制御チャネル、P_DATA は実際のトンネルデータとして見る。
  • パケットフォーマットを読む目的は、暗号の中身を見ることではなく、どの層で何が起きているかを理解することにある。

OpenVPN は TCP / UDP の上に独自の層を持つ

OpenVPN のプロトコル資料では、OpenVPN パケットは TCP または UDP の上にカプセル化され、その中に opcode、key_id、payload が含まれる形で説明されています。参考: OpenVPN Protocol

ここで重要なのは、OpenVPN が単に TCP や UDP で暗号化データを流しているだけではない、という点です。TLS セッションの確立、鍵の更新、制御メッセージの確認応答、実際のトンネルデータが、それぞれ別の意味を持って扱われます。

要素 意味 見るポイント
TCP / UDP OpenVPN パケットを運ぶ外側のトランスポート UDP では OpenVPN 自身が制御チャネルの再送を扱う。TCP ではストリームを区切るための長さ情報が使われる。
opcode P_CONTROL、P_ACK、P_DATA などのメッセージ種別 制御系の通信なのか、実データなのかを切り分ける入口になる。
key_id 既にネゴシエートされた TLS セッションや鍵世代を示す識別子 再ネゴシエーション中に古い鍵と新しい鍵が一時的に併存することを理解する。
payload 制御メッセージ、ACK、または暗号化されたトンネルデータ 中身は暗号化されているため、外側の種別と流れを見る。

制御チャネルとデータチャネルを分けて考える

OpenVPN では、TLS を使って認証や鍵交換を行う制御チャネルと、実際のトンネル通信を運ぶデータチャネルを分けて考えると分かりやすいです。

メッセージ 役割
P_CONTROL TLS 制御チャネルのメッセージ。TLS の暗号文を OpenVPN の信頼性レイヤーに載せる。
P_ACK P_CONTROL に対する確認応答。制御チャネルの再送制御に関係する。
P_DATA 実際のトンネルデータ。内側の IP パケットや Ethernet フレームが暗号化されて運ばれる。

P_CONTROL と P_ACK は、TLS 制御チャネルを成立させるための通信です。制御チャネルは信頼性が必要なため、ACK と再送の考え方を持ちます。一方、P_DATA は実際の VPN トンネルの中身を運びます。ここには内側の IP パケットや Ethernet フレームが暗号化されて入ります。

key_id は再ネゴシエーションを理解する手がかりになる

OpenVPN は、TLS セッションを再ネゴシエーションしながら通信を継続できます。その時に重要になるのが key_id です。key_id は、どの鍵世代で処理するパケットなのかを示すための識別子として使われます。

再ネゴシエーション中は、古いセッションと新しいセッションが短時間重なることがあります。これは通信を止めずに鍵を更新するためです。OpenVPN のパケット構造を見ると、VPN が単に暗号化トンネルを張って終わりではなく、鍵更新を含めて継続運用できるように設計されていることが分かります。

tls-auth は初期パケットの扱いにも関係する

tls-auth を使う場合、TLS ハンドシェイクの初期段階から HMAC による保護が入ります。これは、正しい共有鍵を持たない相手からの不正なパケットを早い段階で捨てやすくするためです。

この点は、OpenVPN をインターネット側に公開する時に重要です。ポートが開いていること自体を完全に隠せるわけではありませんが、TLS ハンドシェイクに進む前の段階で不要なパケットを落としやすくなります。

パケットフォーマットを読む意味

OpenVPN のパケットフォーマットを読んでも、暗号化された中身を直接読むことはできません。むしろ見るべきなのは、通信がどの段階にいるのか、制御チャネルなのかデータチャネルなのか、鍵更新や ACK がどのように関係しているのかです。

パケットキャプチャを見る場合は、暗号化された payload の中身ではなく、外側の UDP / TCP、パケットサイズ、送受信方向、再送、セッション開始時の流れ、通信断時の変化を見る方が実用的です。

VPN のトラブルでは、認証、証明書、暗号設定、MTU、経路、NAT、ファイアウォールなど複数の層が絡みます。パケットフォーマットを知っておくと、ログだけでは分かりにくい通信の段階を切り分けやすくなります。

まとめ

OpenVPN のパケット構造は、TCP / UDP の上に、制御チャネルとデータチャネルを重ねたものとして理解すると見通しがよくなります。

P_CONTROL と P_ACK は TLS 制御チャネル、P_DATA は実際のトンネルデータです。key_id は鍵世代や再ネゴシエーションを理解する手がかりになります。

OpenVPN のパケットフォーマットを読む目的は、暗号化された中身を覗くことではありません。VPN がどの層で何をしているのかを分けて理解し、接続不良や通信不安定の切り分けに使える視点を持つことです。

参考情報

参考
書籍
参考書籍

暗号技術入門 第3版 秘密の国のアリス

公開鍵暗号、電子署名、証明書など、TLS や VPN の前提になる暗号技術を確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

関連する記事

OpenVPN のパケット構造 – TLS 制御チャネルとデータチャネルを理解する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る