Ubuntu 14.04のDockerコンテナでOpenVPNを実行する方法

前書き

このチュートリアルでは、https://docker.com [Docker]の助けを借りて、http://openvpn.net/index.php/open-source [OpenVPN]コンテナーをセットアップして実行する方法を説明します。

OpenVPNは、TLS(SSLの進化)暗号化を使用して仮想プライベートネットワーク(VPN)を作成する方法を提供します。 OpenVPNは、盗聴や中間者(MITM)攻撃からネットワークトラフィックを保護します。 プライベートネットワークを使用して、安全でないWiFiネットワークで実行されているラップトップや携帯電話などのデバイスを、インターネットにトラフィックを中継するリモートサーバーに安全に接続できます。 プライベートネットワークを使用して、インターネット経由でデバイスを相互に安全に接続することもできます。

Dockerは、OpenVPNサーバーのプロセスと構成データをカプセル化して、管理しやすくする方法を提供します。 Docker OpenVPN _image_は事前に作成されており、健全で安定した環境でサーバーを実行するために必要なすべての依存関係が含まれています。 標準のユースケースを大幅に自動化するためのスクリプトが含まれていますが、必要に応じて完全な手動構成も可能です。 Docker _volume container_は、構成とEasyRSA PKI証明書データも保持するために使用されます。

Docker Registryは、公式およびユーザーが開発したDockerイメージの両方の中央リポジトリです。 このチュートリアルで使用する画像は、https://registry.hub.docker.com/u/kylemanna/openvpn [kylemanna / openvpn]で利用可能なユーザー投稿画像です。 このイメージは、https://github.com/kylemanna/docker-openvpn [GitHubプロジェクト]リポジトリのソースを使用して、Docker Registryのクラウドビルドサーバーで組み立てられます。 Githubにリンクされたクラウドサーバービルドは、Dockerイメージを監査する機能を追加して、ユーザーがhttp://blog.docker.com/2013/11/introducing-trusted-builds/と呼ばれるソースDockerfileおよび関連コードをレビューできるようにします信頼できるビルド]。 GitHubリポジトリでコードが更新されると、新しいDockerイメージが構築され、Dockerレジストリに公開されます。

ユースケースの例

  • 信頼できないパブリック(WiFi)ネットワーク上にある場合、インターネットに安全にルーティングします

  • モバイルラップトップ、オフィスコンピューター、自宅のPC、または携帯電話を接続するプライベートネットワーク

  • NATトラバーサル機能を持​​たないNATルーターの背後にある安全なサービスのためのプライベートネットワーク

目標

  • Ubuntu 14.04 LTSでDockerデーモンをセットアップする

  • Dockerボリュームコンテナーを設定して、構成データを保持します

  • EasyRSA PKI認証局(CA)を生成します

  • 自動生成されたクライアント構成ファイルを抽出する

  • 選択した数のOpenVPNクライアントを構成する

  • 起動時にDockerコンテナーを開始するハンドル

  • 高度なトピックを紹介する

前提条件

  • Linuxシェルの知識。 このガイドでは、ユーザーが従来の意味でLinuxデーモンをセットアップして実行できることを主に想定しています。

  • リモートサーバー上のルートアクセス

  • このチュートリアルでは、Ubuntu 14.04を実行するhttps://www.digitalocean.com/?refcode=d19f7fe88c94[DigitalOcean 1 CPU / 512 MB RAMドロップレット]を想定しています。 Dockerにより、任意のホストLinuxディストリビューションでイメージを簡単に実行できます

  • ホストがQEMU / KVMまたはXen仮想化テクノロジーを実行している限り、どの仮想ホストも機能します。 * OpenVZは機能しません*

  • サーバー上のルートアクセスが必要になります。 このガイドでは、ユーザーがsudoを有効にして非特権ユーザーとして実行していることを前提としています。 Ubuntu 14.04でのユーザー管理に関するデジタルオーシャンチュートリアルを確認してください。必要に応じて

  • 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デーモンとの通信を有効にします( `+`はユーザー名)。 新しいグループを有効にするには、終了して再度ログインします

sudo usermod -aG docker

「再ログイン」後、 `+ id `コマンドを使用してグループメンバーシップを確認します。 予想される応答には、次の例のように「 docker +」が含まれている必要があります。

uid=1001(test0) gid=1001(test0) groups=1001(test0),27(sudo),999(docker)

オプション:シンプルなDebian Dockerイメージで + bash +`を実行し(終了後にコンテナをクリーンアップするには `+-rm +、対話型では + -it +):ホストでのDocker操作を確認します。

docker run --rm -it debian:jessie bash -l

Dockerが画像を取り込みコンテナをセットアップする際の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 @:/#+`プロンプトが表示されます。 ホストとは異なることを確認するには、コンテナで実行されているDebianのバージョンを確認します。

cat /etc/issue.net

執筆時点でのOpenVPNコンテナの予想される応答:

Debian GNU/Linux jessie/sid

Debianの別のバージョンが表示された場合、それで問題ありません。

「+ logout +」と入力してコンテナを終了すると、ホストのプロンプトが再び表示されます。

ステップ2-Easy RSA PKI証明書ストアのセットアップ

このステップは通常、OpenVPNまたはPKIを利用するサービスに精通している人にとっては頭痛の種です。 幸いなことに、DockerとDockerイメージ内のスクリプトは、構成ファイルと必要なすべての証明書ファイルを生成することにより、この手順を簡素化します。

ボリュームコンテナを作成します。 このチュートリアルでは、 `+`環境変数を使用して、コピーと貼り付けを容易にします。 これを好きなものに設定します。 デフォルトの ` ovpn-data +`値は、単一のOpenVPN Dockerコンテナサーバーに推奨されます。 シェルで変数を設定すると、文字列置換が活用され、チュートリアルの各ステップでユーザーが手動で変数を置き換える必要がなくなります。

="ovpn-data"

`+ busybox +`を最小のDockerイメージとして使用して、空のDockerボリュームコンテナーを作成します。

docker run --name  -v /etc/openvpn busybox

設定ファイルと証明書を保持する ``コンテナを初期化し、 ``をFQDNに置き換えます。 `++`値は、サーバーとの通信に使用する完全修飾ドメイン名でなければなりません。 これは、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean [DNS settings]がすでに構成されていることを前提としています。 または、サーバーのIPアドレスのみを使用することもできますが、これは推奨されません。

docker run --volumes-from  --rm kylemanna/openvpn ovpn_genconfig -u udp://:1194

EasyRSA PKI認証局を生成します。 CA秘密鍵のパスフレーズの入力を求められます。 良いものを選んで覚えておいてください。パスフレーズがなければ、クライアント証明書を発行して署名することはできません。

docker run --volumes-from  --rm -it kylemanna/openvpn ovpn_initpki

*注意、 `++`コンテナのセキュリティは重要です。*サーバーに偽装するすべての秘密鍵とすべてのクライアント証明書が含まれています。 これを念頭に置いて、必要に応じてアクセスを制御してください。 デフォルトのOpenVPNスクリプトは、CAキーのパスフレーズを使用してセキュリティを強化し、偽の証明書の発行を防ぎます。

証明書ストアのバックアップ方法の詳細については、以下の*結論*を参照してください。

ステップ3-OpenVPNサーバーを起動する

OpenVPNサーバープロセスを実行するDockerコンテナーを自動起動するには(https://docs.docker.com/articles/host_integration/[Docker Host Integration for more]を参照)、https://www.digitalocean.com/community/tutorialsを作成します。 / the-upstart-event-system-what-it-is-and-how-to-use-it [Upstart] init file using + nano +`または `+ vim +

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

Upstart initメカニズムを使用してプロセスを開始します。

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-クライアント証明書と構成ファイルを生成する

このセクションでは、最後の手順で作成したPKI CAを使用してクライアント証明書を作成します。

必要に応じて「++」を置き換えてください(これはFQDNである必要はありません)。 クライアント名は、OpenVPNクライアントが実行されているマシンを識別するために使用されます(例:「home-laptop」、「work-laptop」、「nexus5」など)。

`+ easyrsa `ツールはCAパスワードの入力を求めます。 これは、 ` ovpn_initpki +`コマンドの実行中に上で設定したパスワードです。 クライアント証明書を作成します。

docker run --volumes-from  --rm -it kylemanna/openvpn easyrsa build-client-full  nopass

各クライアントが作成されると、サーバーは接続を受け入れる準備が整います。

クライアントには、接続するための証明書と構成ファイルが必要です。 組み込みスクリプトはこのタスクを自動化し、ユーザーが構成を単一のファイルに書き出すことを可能にし、それをクライアントに転送できます。 繰り返しますが、必要に応じて `++`を置き換えます。

docker run --volumes-from  --rm kylemanna/openvpn ovpn_getclient  > .ovpn

結果の `+ .ovpn `ファイルには、VPNへの接続に必要な秘密鍵と証明書が含まれています。 *これらのファイルは安全に保管してください。*「 *。ovpn +」ファイルを使用するクライアントに安全に転送する必要があります。 セキュリティ上の理由から、ファイルを転送するときは、可能であれば、電子メールやクラウドストレージなどの公共サービスを使用しないでください。

推奨される転送方法は、ssh / scp、HTTPS、USB、およびmicroSDカードです(利用可能な場合)。

ステップ5-OpenVPNクライアントのセットアップ

以下は、上記で設定されたOpenVPNサーバーに接続するクライアントで実行されるコマンドまたは操作です。

ネイティブOpenVPNを介したUbuntuおよびDebianディストリビューション

Ubuntu 12.04 / 14.04およびDebian wheezy / jessieクライアント(および同様):

OpenVPNをインストールします。

sudo apt-get install openvpn

サーバーからクライアント構成ファイルをコピーし、安全なアクセス許可を設定します。

sudo install -o root -m 400 .ovpn /etc/openvpn/.conf

`+ / etc / openvpn / *。conf +`に一致するすべての構成を自動起動するように、initスクリプトを構成します。

echo AUTOSTART=all | sudo tee -a /etc/default/openvpn

OpenVPNクライアントのサーバープロセスを再起動します。

sudo /etc/init.d/openvpn restart

ネイティブOpenVPN経由のArch Linux

OpenVPNをインストールします。

pacman -Sy openvpn

サーバーからクライアント構成ファイルをコピーし、安全なアクセス許可を設定します。

sudo install -o root -m 400 .ovpn /etc/openvpn/.conf

OpenVPNクライアントのサーバープロセスを開始します。

systemctl start openvpn@

オプション:起動時に `+ / etc / openvpn / .conf +`を開始するようにsystemdを設定します:

systemctl enable openvpn@

TunnelBlick経由のMacOS X

TunnelBlickをダウンロードしてインストールします。

サーバーからMacに「+ .ovpn +」をコピーします。

前にコピーした `+ *。ovpn +`ファイルをダブルクリックして設定をインポートします。 TunnelBlickが呼び出され、構成がインポートされます。

TunnelBlickを開き、構成を選択してから、* connect *を選択します。

OpenVPN Connect経由のAndroid

Google Playストアからhttps://play.google.com/store/apps/details?id=net.openvpn.openvpn[OpenVPN Connectアプリ]をインストールします。

サーバーからAndroidデバイスに安全な方法で「+ .ovpn +」をコピーします。 USBまたはmicroSDカードの方が安全です。 ファイルを開くのに役立つように、SDカードにファイルを配置します。

設定をインポートします:メニューインポート→ * SDカードからプロファイルをインポート*

[接続]を選択します。

手順6-操作の確認

トラフィックがVPNを介してルーティングされていることを確認するには、いくつかの方法があります。

ウェブブラウザ

Webサイトにアクセスして、外部IPアドレスを確認します。 外部IPアドレスはOpenVPNサーバーのものでなければなりません。

Google "what is my ip"またはhttps://icanhazip.com [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 source repositoryは、コードのレビューと変更のフォークに使用できます。 一般的な機能やバグ修正のプルリクエストは歓迎します。

  • backup static client IPs *などの高度なトピックについては、https://github.com/kylemanna/docker-openvpn/tree/master/docs [docker-openvpn / docs]フォルダーで説明しています。

バグをhttps://github.com/kylemanna/docker-openvpn/issues[docker-openvpn issue tracker]に報告してください。

Related