DockerでOpenVPNサーバーを構築する完全ガイド
/ 5 min read
Table of Contents
はじめに
セキュアなリモートアクセス環境を構築したい場合、OpenVPNは信頼性の高い選択肢です。本記事では、Dockerを使用してOpenVPNサーバーを簡単に構築する方法を紹介します。
kylemanna/openvpnイメージを利用することで、複雑な設定を最小限に抑え、UDP/TCP両方のプロトコルに対応したVPNサーバーを立ち上げることができます。
前提条件
- Dockerがインストールされている環境
- Docker Composeが利用可能
- 外部からアクセス可能なドメイン名またはIPアドレス
- ファイアウォール設定の変更権限
手順
1. OpenVPNイメージの取得
まず、公式のOpenVPNイメージをDockerレジストリから取得します。
docker pull kylemanna/openvpn2. 作業ディレクトリの準備
OpenVPNの設定ファイルやデータを保存するディレクトリを作成します。
mkdir ovpncd ovpn3. OpenVPN設定の初期化
VPNサーバーの基本設定を生成します。YOUR-DOMAIN.COMは実際のドメイン名またはIPアドレスに置き換えてください。
docker run --rm -v ./ovpn-data:/etc/openvpn \ kylemanna/openvpn ovpn_genconfig \ -u udp://YOUR-DOMAIN.COM:1194 \ -e 'topology subnet'4. 設定ファイルのカスタマイズ
生成された設定ファイルを編集します。
sudo vim ovpn-data/openvpn.conf以下の変更を行います。
route 192.168.254.0 255.255.255.0の行をコメントアウト(既存のネットワークとの競合を避けるため)duplicate-cnを追加(同じ証明書で複数のクライアントが同時接続できるようにする)
5. PKI(公開鍵基盤)の初期化
認証局(CA)とサーバー証明書を生成します。
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というクライアント名を使用していますが、識別しやすい名前に変更してください。
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)を出力します。
docker run --rm -v ./ovpn-data:/etc/openvpn \ kylemanna/openvpn ovpn_getclient $CLIENTNAME > ~/$CLIENTNAME.ovpn8. ファイアウォール設定
必要なポートを開放します。
sudo ufw allow 1194/udp # OpenVPN UDP用sudo ufw allow 443/tcp # OpenVPN TCP用(HTTPSポートを利用)9. Docker Composeでのサービス起動
作業ディレクトリに戻り、Docker Compose設定ファイルを作成します。
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サーバーが起動します。
サービスを起動します。
docker compose up -d10. クライアント設定ファイルの準備
~/hogehoge.ovpnファイルをクライアント端末にダウンロードします。
UDP用とTCP用の2つの設定ファイルを用意するため、ファイルをコピーします:
cp ~/hogehoge.ovpn ~/hogehoge-udp.ovpncp ~/hogehoge.ovpn ~/hogehoge-tcp.ovpnhogehoge-tcp.ovpnをテキストエディタで開き、以下の行を変更します:
変更前:
remote YOUR-DOMAIN.COM 1194 udp変更後:
remote YOUR-DOMAIN.COM 443 tcp11. クライアント側の設定
クライアント端末に OpenVPN Connect をインストールし、作成した.ovpnファイルをインポートして接続します。
- 通常はUDP版(
hogehoge-udp.ovpn)を使用することで、より高速な通信が可能です - ファイアウォール等でUDPがブロックされる環境では、TCP版(
hogehoge-tcp.ovpn)を使用します