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デーモンをセットアップして実行できることを主な前提としています。
- リモートサーバーでのルートアクセス
- このチュートリアルでは、Ubuntu14.04を実行するDigitalOcean 1 CPU / 512MBRAMドロップレットを想定しています。 Dockerを使用すると、任意のホストLinuxディストリビューションでイメージを簡単に実行できます
- ホストがQEMU/KVMまたはXen仮想化テクノロジーを実行している限り、どの仮想ホストも機能します。 OpenVZは機能しません
- サーバーへのルートアクセスが必要になります。 このガイドでは、ユーザーがsudoが有効になっている非特権ユーザーとして実行されていることを前提としています。 必要に応じて、Ubuntu14.04でのユーザー管理に関するDigitalOceanチュートリアルを確認してください
- Android電話、ラップトップ、PCなどのローカルクライアントデバイス。 ほとんどすべてのオペレーティングシステムは、さまざまなOpenVPNクライアントを介してサポートされています
ステップ1—Dockerをセットアップしてテストする
Dockerは急速に動いており、Ubuntuの長期サポート(LTS)ポリシーは追いついていない。 これを回避するために、Dockerの最新バージョンを取得するPPAをインストールします。
アップストリームのDockerリポジトリパッケージ署名キーを追加します。 The 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)
オプション:実行 bash
単純なDebianDockerイメージ(--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:/#
コンテナに入ると、 root@<container id>:/#
現在のシェルがDockerコンテナにあることを示すプロンプト。 ホストとは異なることを確認するには、コンテナで実行されているDebianのバージョンを確認します。
cat /etc/issue.net
執筆時点でのOpenVPNコンテナーの予想される応答:
Debian GNU/Linux jessie/sid
別のバージョンのDebianが表示されている場合は、それで問題ありません。
次のように入力してコンテナを終了します logout
、およびホストのプロンプトが再び表示されます。
ステップ2—EasyRSAPKI証明書ストアを設定する
このステップは通常、OpenVPNまたはPKIを利用するサービスに精通している人にとっては頭痛の種です。 幸い、DockerとDockerイメージのスクリプトは、構成ファイルと必要なすべての証明書ファイルを生成することで、この手順を簡素化します。
ボリュームコンテナを作成します。 このチュートリアルでは、 $OVPN_DATA
コピー&ペーストに適した環境変数。 これを好きなように設定してください。 デフォルト ovpn-data
単一のOpenVPNDockerコンテナサーバーには値をお勧めします。 シェルで変数を設定すると、文字列置換を利用して、チュートリアルの各ステップでユーザーが変数を手動で置換する手間を省くことができます。
OVPN_DATA="ovpn-data"
を使用して空のDockerボリュームコンテナを作成します busybox
最小限のDockerイメージとして:
docker run --name $OVPN_DATA -v /etc/openvpn busybox
初期化 $OVPN_DATA
構成ファイルと証明書を保持し、置き換えるコンテナー vpn.example.com
FQDNを使用します。 The vpn.example.com
valueは、サーバーとの通信に使用する完全修飾ドメイン名である必要があります。 これは、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ホスト統合の詳細を参照)、を使用してUpstart初期化ファイルを作成します。 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
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」など)。
The 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
一致するすべての構成を自動開始するようにinitスクリプトを構成します /etc/openvpn/*.conf
:
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
オプション:開始するようにsystemdを構成します /etc/openvpn/CLIENTNAME.conf
起動時:
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アドレスである必要があります。
別のオプションは、この目的のためだけに特別に構成されたDNSサーバーに対して特別なDNSルックアップを実行することです。 host
また dig
. 使用例 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
古いディストリビューションまたは journalctl
systemdディストリビューションについて。
結論
これを実行するために構築されたDockerイメージはオープンソースであり、ここで説明されている以上の機能を備えています。
docker-openvpnソースリポジトリは、コードのレビューと変更のフォークに使用できます。 一般的な機能やバグ修正のプルリクエストは大歓迎です。
backupやstaticclient IPs などの高度なトピックについては、 docker-openvpn /docsフォルダーで説明されています。
docker-openvpn課題追跡システムにバグを報告してください。