序章

このチュートリアルでは、 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課題追跡システムにバグを報告してください。