skip to content
barorin&?

DockerでOpenVPNサーバーを構築する完全ガイド

/ 5 min read

Table of Contents

はじめに

セキュアなリモートアクセス環境を構築したい場合、OpenVPNは信頼性の高い選択肢です。本記事では、Dockerを使用してOpenVPNサーバーを簡単に構築する方法を紹介します。

kylemanna/openvpnイメージを利用することで、複雑な設定を最小限に抑え、UDP/TCP両方のプロトコルに対応したVPNサーバーを立ち上げることができます。

前提条件

  • Dockerがインストールされている環境
  • Docker Composeが利用可能
  • 外部からアクセス可能なドメイン名またはIPアドレス
  • ファイアウォール設定の変更権限

手順

1. OpenVPNイメージの取得

まず、公式のOpenVPNイメージをDockerレジストリから取得します。

Terminal window
docker pull kylemanna/openvpn

2. 作業ディレクトリの準備

OpenVPNの設定ファイルやデータを保存するディレクトリを作成します。

Terminal window
mkdir ovpn
cd ovpn

3. OpenVPN設定の初期化

VPNサーバーの基本設定を生成します。YOUR-DOMAIN.COMは実際のドメイン名またはIPアドレスに置き換えてください。

Terminal window
docker run --rm -v ./ovpn-data:/etc/openvpn \
kylemanna/openvpn ovpn_genconfig \
-u udp://YOUR-DOMAIN.COM:1194 \
-e 'topology subnet'

4. 設定ファイルのカスタマイズ

生成された設定ファイルを編集します。

Terminal window
sudo vim ovpn-data/openvpn.conf

以下の変更を行います。

  • route 192.168.254.0 255.255.255.0の行をコメントアウト(既存のネットワークとの競合を避けるため)
  • duplicate-cnを追加(同じ証明書で複数のクライアントが同時接続できるようにする)

5. PKI(公開鍵基盤)の初期化

認証局(CA)とサーバー証明書を生成します。

Terminal window
docker run --rm -it -v ./ovpn-data:/etc/openvpn \
kylemanna/openvpn ovpn_initpki

実行中に以下の入力を求められます。

  • Enter New CA Key Passphrase: CAのパスフレーズを入力
  • Re-Enter New CA Key Passphrase: 上記を再度入力
  • Common Name (eg: your user, host, or server name) [Easy-RSA CA]: Returnキーを押してデフォルトを使用
  • Enter pass phrase for /etc/openvpn/pki/private/ca.key: CAのパスフレーズを再度入力
  • Enter pass phrase for /etc/openvpn/pki/private/ca.key: CAのパスフレーズを再度入力

※ CAのパスフレーズは安全に保管してください。今後、クライアント証明書の発行時に必要になります。

6. クライアント証明書の生成

各クライアント用の証明書を作成します。以下の例ではhogehogeというクライアント名を使用していますが、識別しやすい名前に変更してください。

Terminal window
export CLIENT="hogehoge"
docker run --rm -it -v ./ovpn-data:/etc/openvpn \
kylemanna/openvpn easyrsa build-client-full $CLIENT

ここでも実行中に以下の入力を求められます。

  • Enter PEM pass phrase: クライアントのパスフレーズを入力
  • Verifying - Enter PEM pass phrase: 上記を再度入力
  • Enter pass phrase for /etc/openvpn/pki/private/ca.key: CAのパスフレーズを入力

7. クライアント設定ファイルのエクスポート

生成した証明書を含むクライアント設定ファイル(.ovpn)を出力します。

Terminal window
docker run --rm -v ./ovpn-data:/etc/openvpn \
kylemanna/openvpn ovpn_getclient $CLIENTNAME > ~/$CLIENTNAME.ovpn

8. ファイアウォール設定

必要なポートを開放します。

Terminal window
sudo ufw allow 1194/udp # OpenVPN UDP用
sudo ufw allow 443/tcp # OpenVPN TCP用(HTTPSポートを利用)

9. Docker Composeでのサービス起動

作業ディレクトリに戻り、Docker Compose設定ファイルを作成します。

Terminal window
cd ..
vim docker-compose.yml

以下の内容でdocker-compose.ymlを作成します。

services:
openvpn-udp:
image: kylemanna/openvpn
container_name: openvpn-udp
ports:
- "1194:1194/udp"
volumes:
- "./ovpn-data:/etc/openvpn"
cap_add:
- NET_ADMIN
restart: unless-stopped
openvpn-tcp:
image: kylemanna/openvpn
container_name: openvpn-tcp
ports:
- "443:1194/tcp"
volumes:
- "./ovpn-data:/etc/openvpn"
cap_add:
- NET_ADMIN
command: ovpn_run --proto tcp
restart: unless-stopped

この設定により、UDP(ポート1194)とTCP(ポート443)の両方のプロトコルでOpenVPNサーバーが起動します。

サービスを起動します。

Terminal window
docker compose up -d

10. クライアント設定ファイルの準備

~/hogehoge.ovpnファイルをクライアント端末にダウンロードします。

UDP用とTCP用の2つの設定ファイルを用意するため、ファイルをコピーします:

Terminal window
cp ~/hogehoge.ovpn ~/hogehoge-udp.ovpn
cp ~/hogehoge.ovpn ~/hogehoge-tcp.ovpn

hogehoge-tcp.ovpnをテキストエディタで開き、以下の行を変更します:

変更前:

Terminal window
remote YOUR-DOMAIN.COM 1194 udp

変更後:

Terminal window
remote YOUR-DOMAIN.COM 443 tcp

11. クライアント側の設定

クライアント端末に OpenVPN Connect をインストールし、作成した.ovpnファイルをインポートして接続します。

  • 通常はUDP版(hogehoge-udp.ovpn)を使用することで、より高速な通信が可能です
  • ファイアウォール等でUDPがブロックされる環境では、TCP版(hogehoge-tcp.ovpn)を使用します