OpenVPN入門 Dockerで学ぶ安全なVPN構築

Docker

はじめに

インターネットを利用する上で欠かせないのが「セキュリティ」と「安全な通信」です。特に外出先や公共のWi-Fiを利用する際には、通信内容が第三者に盗み見られるリスクがあります。そこで活躍するのが VPN(Virtual Private Network) です。VPNを利用すると、インターネット上に暗号化された専用の通信経路を作り出すことができ、セキュリティを確保しながらリモートアクセスや社内ネットワークへの安全な接続が可能になります。

その中でも OpenVPN は、オープンソースとして提供されている柔軟で高機能なVPNソフトウェアです。商用利用から学習目的まで幅広く利用されており、自分で構築・カスタマイズできる点が大きな魅力です。特にエンジニアの学習環境としては、VPNの仕組みを理解しながら手を動かして実際に体験できるため、ネットワークやセキュリティの基礎を学ぶのに最適なツールといえます。

OpenVPNの基本概念

OpenVPNを学ぶ上でまず理解しておきたいのが、VPNを構成する仕組みとその動き方です。ここではサーバーとクライアントの関係や、認証方式、設定ファイルの役割などを解説します。

サーバーとクライアントの関係

VPNは「サーバー」と「クライアント」の2つの役割で構成されます。

  • サーバー:VPNの中心として待ち受けを行い、クライアントからの接続を受け付ける。
  • クライアント:サーバーに接続して暗号化された通信経路を利用する。

例えるなら「社内ネットワークへの玄関口がサーバー」で「外出先から入る社員がクライアント」です。

鍵認証と証明書の仕組み

OpenVPNでは通信を安全にするために 公開鍵暗号方式 を利用します。

  • サーバーとクライアントは、それぞれ証明書(公開鍵と秘密鍵)を持ちます。
  • 接続時にサーバーとクライアントは証明書を交換し、相手が正しい相手かどうかを確認します。
  • 秘密鍵は絶対に外部に漏らしてはいけません。

この仕組みにより、なりすましや盗聴を防ぐことができます。

設定ファイル(.conf)の役割

OpenVPNは設定ファイル(.conf もしくは .ovpn)を用いて動作します。

  • サーバー側設定例:待ち受けポート、暗号化方式、証明書の場所
  • クライアント側設定例:接続先サーバーのアドレス、使用する証明書、プロトコル(UDP/TCP)

クライアントは .ovpn ファイルを読み込むことで簡単に接続を開始できます。

トンネリング(TUN/TAP)の違い

VPNは「仮想的なネットワークインターフェース」を作り出して通信を行います。OpenVPNでは TUNTAP という2種類のモードがあります。

  • TUNモード
    • IPパケット単位でトンネリング
    • 一般的なVPNで多用される
    • 遠隔地LANへのルーティング向き
  • TAPモード
    • Ethernetフレーム単位でトンネリング
    • LANを丸ごと延長するイメージ
    • ブロードキャストやマルチキャストを必要とする場合に有効

学習用や実務でのリモートアクセスVPNでは、通常 TUNモード が使われます。

ローカルでのOpenVPN構築

windows×dockerで学習用に構築していきます。

ゴール

  • Docker コンテナで OpenVPN サーバーを起動
  • クライアント用 .ovpn を作成・取り出し
  • クライアントから接続

ここでは実績のある kylemanna/openvpn イメージを使います

サーバー側セットアップ(鍵生成・設定)

イメージ取得 & データ永続化ボリューム

docker pull kylemanna/openvpn
docker volume create ovpn-data
  • docker pull ...:OpenVPNイメージを取得
    • 確認 → docker images | findstr openvpn
  • docker volume create ovpn-data:証明書や設定を保存する永続ボリューム作成
    • 確認 → docker volume ls | findstr ovpn-data

※ 以降のコマンドで -v ovpn-data:/etc/openvpn と指定するので、ボリューム名は必ず ovpn-data にしてください(名前が違うと設定が消えたり、毎回初期化になります)。

サーバー設定の生成(サブネット/DNS/プロトコルなど)

docker run --rm -v ovpn-data:/etc/openvpn kylemanna/openvpn \
  ovpn_genconfig \
  -u udp://127.0.0.1:1194 \
  -n 1.1.1.1 -n 8.8.8.8 \
  -e 'topology subnet' \
  -E 'push "redirect-gateway def1 bypass-dhcp"'
  • ovpn-data ボリュームに OpenVPN サーバー設定が生成される
  • サーバーは 127.0.0.1:1194/UDP で待ち受け
  • クライアント接続時は DNS=1.1.1.1/8.8.8.8 に強制
  • 全トラフィックをVPN経由に切り替わる

PKI 初期化(CA/サーバー証明書の作成)

docker run --rm -it -v ovpn-data:/etc/openvpn kylemanna/openvpn ovpn_initpki
  • PKI初期化 = 鍵と証明書の「土台」を作る工程
  • これをやらないとクライアント証明書を発行できない
  • 入力はパスフレーズやCommon Nameなどを求められるが、学習用なら適当でOK
  • 生成物は ovpn-data ボリュームに保存されるので、次の「サーバー起動」や「クライアント証明書作成」で使われる

OpenVPN サーバー起動

docker run -d --name openvpn \
  --restart unless-stopped \
  -v ovpn-data:/etc/openvpn \
  -p 1194:1194/udp \
  --cap-add=NET_ADMIN \
  kylemanna/openvpn
  • OpenVPNサーバーがコンテナ内で常駐
  • UDP/1194ポートでクライアント接続を受け付け
  • 証明書ベースでセキュアなVPN通信を提供

補足(Linuxのみ・LAN到達性)
VPN 経由でさらに別ネットワークへ抜けたい場合は、ホストで IP 転送と NAT を有効化します。

# 一時的にIP転送ON
sudo sysctl -w net.ipv4.ip_forward=1
# NAT(eth0 は外向きIFに置換)
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

クライアント用プロファイル作成(.ovpn)

クライアント証明書を発行

docker run --rm -it -v ovpn-data:/etc/openvpn kylemanna/openvpn \
  easyrsa build-client-full client1 nopass

nopass は鍵にパスフレーズを付けない指定(学習用には楽)。運用では付与推奨。

.ovpn を取り出す

docker run --rm -v ovpn-data:/etc/openvpn kylemanna/openvpn \
  ovpn_getclient client1 > client1.ovpn

クライアント接続

OpenVPN GUI

ダウンロード
  • 公式サイトからインストーラを入手します。
    OpenVPN Community Downloads
  • 「Windows Installer(64-bit)」をクリックしてダウンロードしてください。
インストール
  1. ダウンロードした OpenVPN-xxxx-I601-amd64.msi(バージョンは異なる場合あり)をダブルクリック。
  2. セットアップウィザードが開くので「Next」を押す。
  3. ライセンスに同意し、インストール先を確認(デフォルトのままでOK)。
  4. インストールが完了したら「Finish」で終了。
クライアント設定ファイルの配置
  1. サーバー側で作成した client1.ovpn ファイルをコピーします。
  2. 下記のディレクトリに保存してください:
    C:\Program Files\OpenVPN\config\
    config フォルダに配置すると、自動でOpenVPN GUIに認識されます。
    (複数ファイルを置いておくことも可能)
OpenVPN GUI の起動
  1. スタートメニューから 「OpenVPN GUI」 を起動。
  2. タスクトレイ(右下の隠れているアイコンのところ)に パソコンのモニターに南京錠のアイコン が表示されます。
  3. アイコンを右クリック → 接続したい .ovpn を選択 → 「接続」をクリック。
上手くいかない場合
  1. ovpnファイルをpower shell経由で吐き出させると、文字コードの関係でうまくいきません。
    cmdかbashを利用しましょう
  2. OpenVPN 2.6 ではセキュリティ上の理由(VORACLE)で圧縮が基本禁止、かつ DCO有効時は圧縮がさらに不可 です。
    client1.ovpn の末尾に次を追記して暫定回避します。
# Windows/OpenVPN 2.6 での暫定回避
disable-dco
allow-compression yes

VPNインターフェースの確認

OpenVPN に接続すると、Windows では 「TAP-Windows Adapter V9」 または 「OpenVPN TAP-Windows6」 という仮想NICが追加されます。

確認方法

  1. コマンドプロンプトを管理者で起動
    ipconfig
  2. 出力の中に次のような項目が出ればOKです
イーサネット アダプター TAP-Windows Adapter V9:

   接続固有の DNS サフィックス . . . :
   IPv4 アドレス . . . . . . . . . . .: 10.8.0.6
   サブネット マスク . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . .: 

ユースケース

OpenVPN を使った VPN 環境は、学習用途だけでなく実際のシステム構築や運用にも応用できます。ここでは代表的なユースケースを紹介します。

ローカルVMやDocker間をVPNでつなぐ

開発環境で複数の VM(仮想マシン)Dockerコンテナ を立ち上げ、それらを同じVPNネットワークに参加させることで、実際の拠点間ネットワークに近い環境を再現できます。

  • 異なるホスト上にあるVM同士を「同じLANにいる」かのように通信させられる
  • テスト環境で「複数拠点をVPNで接続した状態」を手軽に再現できる
  • Dockerコンテナ間でVPN経由の通信を試すことで、マイクロサービス間のセキュリティ実験も可能

学習環境としては、小規模な社内ネットワークの疑似体験に役立ちます。

自宅PCとクラウド(AWS EC2など)をVPN接続

自宅からクラウド上のサーバーへセキュアにアクセスする用途でもOpenVPNは使われます。

  • AWS EC2 や VPS に OpenVPN サーバーを立てる
  • 自宅PC(クライアント)から接続すれば、クラウドサーバーに対してプライベートIP経由でアクセス可能
  • セキュアなリモート管理や、外部公開せずにクラウド内リソースへ安全に接続できる

特に AWSの管理用踏み台サーバー(Bastion Host)の代替 として活用できるため、実務でも役立つシナリオです。

まとめと次のステップ

ここまでの手順で、OpenVPN を使った VPN 環境の構築を一通り体験しました。

  • VPNの基本概念(サーバーとクライアント、証明書認証、トンネリング方式)
  • Dockerを用いた構築手順(イメージ取得、サーバー設定、PKI 初期化、サーバー起動、クライアント接続)
  • 疎通確認(VPNインターフェースの確認、ping・curlでのテスト)

近年は OpenVPN 以外にも VPN ソリューションが登場しています。特に WireGuard はシンプルな設定と高いパフォーマンスが特徴です。

  • OpenVPN:歴史が長く、多機能で広く利用されている。学習や既存システムとの互換性に強い。
  • WireGuard:軽量・高速・シンプル。Linuxカーネルに統合されており、今後の主流候補。

どちらを選ぶかは利用シーンによりますが、OpenVPN を理解しておくと他のVPN技術の学習にも応用が効きます。

コメント

タイトルとURLをコピーしました