OpenVPNがやってること:仮想NICから出口IP固定までの流れを追ってみた
✅ この記事について
この投稿は、次のような方を想定して書いています:
- VPNを「なんとなく便利」で使っていて、仕組みをちゃんと知りたい人
- 「なぜ出口IPが変わるのか?」にモヤモヤしている人
- OpenVPNの内部動作(tap0, 暗号化, NATなど)をざっくりでも把握したい人
この記事で扱うこと:
- OpenVPNの接続確立後、パケットがどう流れるか
- 仮想NIC(tap0/tun0)と暗号化処理の流れ
- NATによる出口IP固定のしくみ
- 通信レイヤーとの関係(L3〜L7ざっくり)
この記事では扱わないこと:
- OpenVPNの設定手順(証明書の作り方など)
- 各OSごとの実装や挙動の違い(今回は Linux 視点多め)
- WireGuard や IPSec など、他の VPNプロトコルとの比較
🧭 OpenVPNとは?
仮想プライベートネットワーク技術を使って、サイト間・ポイントツーポイント間に安全な通信経路を作るVPNプロトコル。オープンソースで、広く使われています。
「VPNは便利だけど、実際なにしてるの?」
tap0って?出口IPがなぜ変わるの?通信はどう通ってるの?
そんな疑問を、自分で調べながら理解して、整理した内容です。
🛠 OpenVPNの接続が確立するまで
- クライアントとサーバーが、証明書などを使って接続します。
- クライアント側のOSに仮想NIC(例:
tap0
またはtun0
)が作られます。- OpenVPNサーバーが、仮想NICにIPアドレスを割り当てます。
- Windowsでは自動でやってくれました。Linux(私の環境)は手動でした。Macは試してないので不明。
- OpenVPNサーバーが、仮想NICにIPアドレスを割り当てます。
- クライアントの全トラフィックが仮想NICに向くよう、OSがルーティングを書き換えます。
🌐 接続後の通信の流れ (Googleサイトへのアクセスを例に)
- Googleのサイトを見たくなった私は、宛先がGoogleなIPパケットを作成(便宜上、元パケットと呼びます)。
- OpenVPNクライアントは、「元パケット」をまるごと暗号化して、パケット(便宜上、包みパケットと呼びます)を作ります。
- 「包みパケット」の宛先IPは会社のVPNサーバー。
- 「元パケット」の中身(宛先IPはGoogle)は、暗号化されて包まれています。
- サーバーが「包みパケット」を受け取り、中身を開梱&復号化。
- サーバーが「元パケット」をGoogleに送信。
- このとき、送信元IPはサーバー自身のIPにNAT変換されるため、Googleから見ると「会社からのアクセス」に見えます。
- Googleが返してきたレスポンスを、サーバーが暗号化し、また「包みパケット」にしてクライアントへ戻します。
- クライアントは包みを開けて、中身のパケットを受信します。
補足:tap0
と tun0
の違い(ざっくり)
-
tap0
:Ethernetフレーム(L2)を扱う仮想NIC。ブリッジ構成や複雑なネットワーク向け -
tun0
:IPパケット(L3)専用の仮想NIC。VPN用途ではtun
が使われることが多い
👉 雰囲気でいうと、tap
は「もっと下」、tun
は「ちょっと上」です。
🧠 レイヤー視点で見ると
- クライアントの仮想NIC(L3)に届いたパケットを、OpenVPNプロセス(L7)がアプリ層として受け取ります。
- それを暗号化して、L4のUDP(またはTCP)セグメントに乗せて送信。
- さらにL3(IPパケット)→ L2(イーサネットフレーム)→ L1(物理)へと、ネットワークスタックに従って流れていきます。
💡 この文脈では、L6/L5は特に活躍する場面が少ないです。
💬 感想:トンネルってなんだっけ
「トンネル」というと、直通の専用道路みたいなイメージを持っていたのですが、
実際は「荷物を再梱包して安全に送るためのルート」という方がしっくりきます。
また、VPNって“ピア接続”のような感覚で語られることがありますが、
物理的には全然ピアではないです。お互いに一生懸命、包んで包んで、ほどいてほどいて、をやっているだけ。
✅ まとめ
- OpenVPNは、「仮想NIC+暗号化通信」で安全なトンネルを作ってくれる
- 出口IPが変わるのは、通信の送信元がVPNサーバーに見えるようNATされるから
- tap0/tun0、パケットの包み構造、レイヤー構造まで理解すると、VPNの仕組みが一気に身近になる
🚪 次の扉?
WireGuard、気になってます。
でもまずはOpenVPNを理解できたので、ようやく次の一歩へ進めそうです。