Ubuntu14.04のDockerコンテナでOpenVPNを実行する方法
序章
このチュートリアルでは、 Docker を使用して、OpenVPNコンテナーをセットアップして実行する方法について説明します。
OpenVPNは、TLS(SSLの進化)暗号化を使用して仮想プライベートネットワーク(VPN)を作成する方法を提供します。 OpenVPNは、盗聴や中間者(MITM)攻撃からネットワークトラフィックを保護します。 プライベートネットワークを使用して、安全でないWiFiネットワークで実行されているラップトップや携帯電話などのデバイスをリモートサーバーに安全に接続し、リモートサーバーがトラフィックをインターネットに中継することができます。 プライベートネットワークを使用して、インターネットを介してデバイスを相互に安全に接続することもできます。
Dockerは、OpenVPNサーバーのプロセスと構成データをカプセル化して、より簡単に管理できるようにする方法を提供します。 Docker OpenVPN image は事前に構築されており、正常で安定した環境でサーバーを実行するために必要なすべての依存関係が含まれています。 標準のユースケースを大幅に自動化するためのスクリプトが含まれていますが、必要に応じて完全な手動構成も可能です。 Docker ボリュームコンテナーは、構成およびEasyRSAPKI証明書データも保持するために使用されます。
Docker Registry は、公式およびユーザーが開発したDockerイメージの両方の中央リポジトリです。 このチュートリアルで使用されている画像は、 kylemanna /openvpnで入手できるユーザー提供の画像です。 イメージは、GitHubプロジェクトリポジトリからのソースを使用してDockerRegistryのクラウドビルドサーバーでアセンブルされます。 Githubにリンクされたクラウドサーバービルドは、Dockerイメージを監査する機能を追加して、ユーザーが TrustedBuildと呼ばれるソースDockerfileと関連コードを確認できるようにします。 GitHubリポジトリでコードが更新されると、新しいDockerイメージがビルドされ、Dockerレジストリに公開されます。
ユースケースの例
- 信頼できないパブリック(WiFi)ネットワーク上にある場合は、インターネットに安全にルーティングします
- モバイルラップトップ、オフィスコンピュータ、家庭用PC、または携帯電話を接続するためのプライベートネットワーク
- NATトラバーサル機能を持たないNATルーターの背後にある安全なサービスのためのプライベートネットワーク
目標
- Ubuntu14.04LTSでDockerデーモンをセットアップします
- 構成データを保持するためにDockerボリュームコンテナーをセットアップします
- EasyRSA PKI認証局(CA)を生成する
- 自動生成されたクライアント構成ファイルを抽出します
- 選択した数のOpenVPNクライアントを構成する
- 起動時にDockerコンテナの起動を処理する
- 高度なトピックを紹介する
前提条件
- Linuxシェルの知識。 このガイドは、ユーザーが従来の意味でLinuxデーモンをセットアップして実行できることを主な前提としています。
- リモートサーバーでのrootアクセス
このチュートリアルでは、Ubuntu14.04を実行するDigitalOcean1 CPU / 512MBRAMドロップレットを想定しています。 Dockerを使用すると、任意のホストLinuxディストリビューションでイメージを簡単に実行できます。ホストがQEMU / KVMまたはXen仮想化テクノロジーを実行している限り、任意の仮想ホストが機能します。 OpenVZが機能しないサーバーへのrootアクセスが必要になります。 このガイドでは、ユーザーがsudoが有効になっている非特権ユーザーとして実行されていることを前提としています。 必要に応じて、Ubuntu14.04でのユーザー管理に関するDigitalOceanチュートリアルを確認してください - Android電話、ラップトップ、PCなどのローカルクライアントデバイス。 ほとんどすべてのオペレーティングシステムは、さまざまなOpenVPNクライアントを介してサポートされています
ステップ1—Dockerをセットアップしてテストする
Dockerは急速に動いており、Ubuntuのロングタームサポート(LTS)ポリシーは追いついていない。 これを回避するために、Dockerの最新バージョンを取得するPPAをインストールします。
アップストリームのDockerリポジトリパッケージ署名キーを追加します。 apt-key
コマンドは、sudo
を介して昇格された特権を使用するため、ユーザーのパスワードのパスワードプロンプトが表示される場合があります。
curl -L https://get.docker.com/gpg | sudo apt-key add -
注:必要に応じて、点滅しているカーソルにsudoパスワードを入力します。
アップストリームのDockerリポジトリをシステムリストに追加します。
echo deb http://get.docker.io/ubuntu docker main | sudo tee /etc/apt/sources.list.d/docker.list
パッケージリストを更新し、Dockerパッケージをインストールします。
sudo apt-get update && sudo apt-get install -y lxc-docker
ユーザーをdocker
グループに追加して、通常のユーザーとしてDockerデーモンとの通信を有効にします。ここで、sammy
はユーザー名です。 終了して再度ログインすると、新しいグループが有効になります:
sudo usermod -aG docker sammy
再ログインの後、id
コマンドを使用してグループメンバーシップを確認します。 予想される応答には、次の例のようにdocker
が含まれている必要があります。
uid=1001(test0) gid=1001(test0) groups=1001(test0),27(sudo),999(docker)
オプション:単純なDebianDockerイメージでbash
を実行し(--rm
は終了後にコンテナーをクリーンアップし、-it
はインタラクティブ)、ホストでのDockerの動作を確認します。
docker run --rm -it debian:jessie bash -l
Dockerが画像を取得してコンテナーをセットアップするときに、期待される応答は次のとおりです。
Unable to find image 'debian:jessie' locally
debian:jessie: The image you are pulling has been verified
511136ea3c5a: Pull complete
36fd425d7d8a: Pull complete
aaabd2b41e22: Pull complete
Status: Downloaded newer image for debian:jessie
root@de8ffd8f82f6:/#
コンテナ内に入ると、現在のシェルがDockerコンテナ内にあることを示すroot@<container id>:/#
プロンプトが表示されます。 ホストとは異なることを確認するには、コンテナで実行されているDebianのバージョンを確認します。
cat /etc/issue.net
執筆時点でのOpenVPNコンテナーの予想される応答:
Debian GNU/Linux jessie/sid
別のバージョンのDebianが表示されている場合は、それで問題ありません。
logout
と入力してコンテナを終了すると、ホストのプロンプトが再び表示されます。
ステップ2—EasyRSAPKI証明書ストアを設定する
このステップは通常、OpenVPNまたはPKIを利用するサービスに精通している人にとっては頭痛の種です。 幸い、DockerとDockerイメージのスクリプトは、構成ファイルと必要なすべての証明書ファイルを生成することで、この手順を簡素化します。
ボリュームコンテナを作成します。 このチュートリアルでは、$OVPN_DATA
環境変数を使用して、コピーと貼り付けを容易にします。 これを好きなように設定してください。 単一のOpenVPNDockerコンテナーサーバーには、デフォルトのovpn-data
値をお勧めします。 シェルで変数を設定すると、文字列置換を利用して、チュートリアルの各ステップでユーザーが変数を手動で置換する手間を省くことができます。
OVPN_DATA="ovpn-data"
busybox
を最小のDockerイメージとして使用して、空のDockerボリュームコンテナーを作成します。
docker run --name $OVPN_DATA -v /etc/openvpn busybox
構成ファイルと証明書を保持する$OVPN_DATA
コンテナーを初期化し、vpn.example.com
をFQDNに置き換えます。 vpn.example.com
の値は、サーバーとの通信に使用する完全修飾ドメイン名である必要があります。 これは、DNS設定がすでに構成されていることを前提としています。 または、サーバーのIPアドレスのみを使用することもできますが、これはお勧めしません。
docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_genconfig -u udp://vpn.example.com:1194
EasyRSAPKI認証局を生成します。 CA秘密鍵のパスフレーズの入力を求められます。 良いものを選んで覚えておいてください。 パスフレーズがないと、クライアント証明書を発行して署名することはできません。
docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn ovpn_initpki
注:$OVPN_DATAコンテナーのセキュリティは重要です。サーバーとすべてのクライアント証明書を偽装するためのすべての秘密鍵が含まれています。 これを念頭に置き、必要に応じてアクセスを制御してください。 デフォルトのOpenVPNスクリプトは、CAキーのパスフレーズを使用して、セキュリティを強化し、偽の証明書の発行を防ぎます。
証明書ストアのバックアップ方法の詳細については、以下の結論を参照してください。
ステップ3—OpenVPNサーバーを起動します
OpenVPNサーバープロセスを実行するDockerコンテナを自動起動するには( Dockerホスト統合の詳細を参照)、nano
またはvim
を使用してUpstart初期化ファイルを作成します:
sudo vim /etc/init/docker-openvpn.conf
/etc/init/docker-openvpn.conf
に配置するコンテンツ:
description "Docker container for OpenVPN server"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
exec docker run --volumes-from ovpn-data --rm -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
end script
Upstartinitメカニズムを使用してプロセスを開始します。
sudo start docker-openvpn
STATUS
列を見て、コンテナーが開始され、すぐにクラッシュしなかったことを確認します。
test0@tutorial0:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3ca41324e1d kylemanna/openvpn:latest "ovpn_run" 2 seconds ago Up 2 seconds 0.0.0.0:1194->1194/udp focused_mestorf
ステップ4—クライアント証明書と構成ファイルを生成する
このセクションでは、前の手順で作成したPKICAを使用してクライアント証明書を作成します。
必要に応じてCLIENTNAME
を置き換えてください(これはFQDNである必要はありません)。 クライアント名は、OpenVPNクライアントが実行されているマシンを識別するために使用されます(たとえば、「home-laptop」、「work-laptop」、「nexus5」など)。
easyrsa
ツールはCAパスワードの入力を求めます。 これは、ovpn_initpki
コマンドで上記で設定したパスワードです。 クライアント証明書を作成します。
docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass
各クライアントが作成されると、サーバーは接続を受け入れる準備が整います。
クライアントが接続するには、証明書と構成ファイルが必要です。 埋め込まれたスクリプトはこのタスクを自動化し、ユーザーが構成を単一のファイルに書き出して、クライアントに転送できるようにします。 繰り返しますが、必要に応じてCLIENTNAME
を置き換えます。
docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn
結果のCLIENTNAME.ovpn
ファイルには、VPNへの接続に必要な秘密鍵と証明書が含まれています。 これらのファイルを安全に保管し、横にしないでください。*.ovpn
ファイルをそれらを使用するクライアントに安全に転送する必要があります。 セキュリティ上の懸念から、ファイルを転送するときは、可能であれば、電子メールやクラウドストレージなどの公共サービスの使用を避けてください。
推奨される転送方法は、ssh / scp、HTTPS、USB、および利用可能な場合はmicroSDカードです。
ステップ5—OpenVPNクライアントを設定する
以下は、上記で構成されたOpenVPNサーバーに接続するクライアントで実行されるコマンドまたは操作です。
ネイティブOpenVPNを介したUbuntuおよびDebianディストリビューション
Ubuntu 12.04/14.04およびDebianwheezy/ jessieクライアント(および同様のもの)の場合:
OpenVPNをインストールします:
sudo apt-get install openvpn
サーバーからクライアント構成ファイルをコピーし、安全なアクセス許可を設定します。
sudo install -o root -m 400 CLIENTNAME.ovpn /etc/openvpn/CLIENTNAME.conf
/etc/openvpn/*.conf
に一致するすべての構成を自動開始するようにinitスクリプトを構成します。
echo AUTOSTART=all | sudo tee -a /etc/default/openvpn
OpenVPNクライアントのサーバープロセスを再起動します。
sudo /etc/init.d/openvpn restart
ネイティブOpenVPN経由のArchLinux
OpenVPNをインストールします:
pacman -Sy openvpn
サーバーからクライアント構成ファイルをコピーし、安全なアクセス許可を設定します。
sudo install -o root -m 400 CLIENTNAME.ovpn /etc/openvpn/CLIENTNAME.conf
OpenVPNクライアントのサーバープロセスを開始します。
systemctl start openvpn@CLIENTNAME
オプション:起動時に/etc/openvpn/CLIENTNAME.conf
を開始するようにsystemdを構成します。
systemctl enable openvpn@CLIENTNAME
TunnelBlick経由のMacOSX
TunnelBlickをダウンロードしてインストールします。
CLIENTNAME.ovpn
をサーバーからMacにコピーします。
前にコピーした*.ovpn
ファイルをダブルクリックして構成をインポートします。 TunnelBlickが呼び出され、構成がインポートされます。
TunnelBlickを開き、構成を選択してから、connectを選択します。
OpenVPNConnect経由のAndroid
GooglePlayストアからOpenVPNConnectアプリをインストールします。
CLIENTNAME.ovpn
をサーバーからAndroidデバイスに安全にコピーします。 USBまたはmicroSDカードの方が安全です。 それを開くのを助けるためにあなたのSDカードにファイルを置いてください。
構成をインポートします:メニュー->インポート->SDカードからプロファイルをインポート
接続を選択します。
ステップ6—動作を確認する
トラフィックがVPNを介してルーティングされていることを確認する方法はいくつかあります。
ウェブブラウザ
Webサイトにアクセスして、外部IPアドレスを確認します。 外部IPアドレスはOpenVPNサーバーのアドレスである必要があります。
Googleの「whatismyip」またはicanhazip.comをお試しください。
コマンドライン
コマンドラインからは、wget
またはcurl
が便利です。 curl
の例:
curl icanhazip.com
wget
の例:
wget -qO - icanhazip.com
予想される応答は、OpenVPNサーバーのIPアドレスである必要があります。
もう1つのオプションは、host
またはdig
を使用して、この目的のためだけに特別に構成されたDNSサーバーに対して特別なDNSルックアップを実行することです。 host
の使用例:
host -t A myip.opendns.com resolver1.opendns.com
dig
の例:
dig +short myip.opendns.com @resolver1.opendns.com
予想される応答は、OpenVPNサーバーのIPアドレスである必要があります。
確認すべき追加事項
ネットワークインターフェイスの構成を確認します。 Unixベースのオペレーティングシステムでは、これは端末でifconfig
を実行し、接続時にOpenVPNのtunX
インターフェイスを探すのと同じくらい簡単です。
ログを確認します。 Unixシステムでは、古いディストリビューションでは/var/log
を、systemdディストリビューションではjournalctl
をチェックしてください。
結論
これを実行するために構築されたDockerイメージはオープンソースであり、ここで説明されている以上の機能を備えています。
docker-openvpnソースリポジトリは、コードのレビューと変更のフォークに使用できます。 一般的な機能やバグ修正のプルリクエストは大歓迎です。
バックアップや静的クライアントIPなどの高度なトピックについては、 docker-openvpn /docsフォルダーで説明されています。
docker-openvpn課題追跡システムにバグを報告してください。