はじめに
インターネットを利用する上で欠かせないのが「セキュリティ」と「安全な通信」です。特に外出先や公共の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では TUN と TAP という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)」をクリックしてダウンロードしてください。
インストール
- ダウンロードした
OpenVPN-xxxx-I601-amd64.msi
(バージョンは異なる場合あり)をダブルクリック。 - セットアップウィザードが開くので「Next」を押す。
- ライセンスに同意し、インストール先を確認(デフォルトのままでOK)。
- インストールが完了したら「Finish」で終了。
クライアント設定ファイルの配置
- サーバー側で作成した
client1.ovpn
ファイルをコピーします。 - 下記のディレクトリに保存してください:
C:\Program Files\OpenVPN\config\
config
フォルダに配置すると、自動でOpenVPN GUIに認識されます。
(複数ファイルを置いておくことも可能)
OpenVPN GUI の起動
- スタートメニューから 「OpenVPN GUI」 を起動。
- タスクトレイ(右下の隠れているアイコンのところ)に パソコンのモニターに南京錠のアイコン が表示されます。
- アイコンを右クリック → 接続したい
.ovpn
を選択 → 「接続」をクリック。
上手くいかない場合
- ovpnファイルをpower shell経由で吐き出させると、文字コードの関係でうまくいきません。
cmdかbashを利用しましょう 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が追加されます。
確認方法
- コマンドプロンプトを管理者で起動
ipconfig
- 出力の中に次のような項目が出れば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技術の学習にも応用が効きます。
コメント