Docker で OpenVPN を 2 秒で起動

ハブロフスク在住の皆さん、こんにちは! 別の都市、国、大陸に仮想的に移動したいという状況に遭遇したことがありますか? このようなニーズは頻繁にあるので、どこでも数秒で起動できる独自の VPN サーバーを用意する機会は非常に緊急でした。この記事では、私が当時考えていたプロジェクトについて話したいと思います。既成のソリューションを探しています。この場合は、最小限の設定と許容可能なレベルのセキュリティを備えた OpenVPN サーバーを迅速にセットアップできるイメージの Docker です。

Docker で OpenVPN を 2 秒で起動

背景

物理サーバー、仮想プライベート サーバー、さらには別のコンテナ管理システム内のコンテナ スペースなど、任意のマシン上でサービスを実行できる機能が重要でした。 私の視線はすぐに Docker に落ちました。 まず、このサービスは人気が高まっているため、プリインストールされた既製のソリューションを提供するプロバイダーが増えています。 次に、イメージの集中ストレージがあり、そこからターミナルで XNUMX つのコマンドを使用してサービスをダウンロードして実行できます。 このようなプロジェクトはすでに存在するはずだと思いつき、一生懸命探しました。 しかし、私が見つけたプロジェクトのほとんどは、あまりにも面倒だった (永続的なデータ ストレージ用のコンテナーを作成し、そのコンテナーをアプリケーションで異なるパラメーターを使用して何度も起動する必要があった) か、適切なドキュメントがなかったか、完全に放棄されたかのいずれかでした。 , あなたのプロジェクトに取り組み始めました。 ドキュメントの検討、コードの作成、デバッグの前には眠れぬ夜が続きましたが、最終的に私のサービスが日の目を見て、ルーターのモノクロ LED パネルのすべての色で輝き始めました。 だから、あなたに愛と好意をお願いします - Docker-OpenVPN。 ロゴ(上、カット前)も考えましたが、私は(もう)デザイナーではないので厳密に判断しないでください。このプロジェクトを実装するときは、最低限の展開のスピードを優先しました。設定と許容可能なセキュリティレベル。 試行錯誤を通じて、これらの基準の最適なバランスを見つけましたが、場所によっては、セキュリティのために展開速度を犠牲にしなければならず、最小限の設定では移植性を犠牲にしなければなりませんでした。現在の構成では、あるサーバー上で作成されたコンテナを別のサーバーに転送して起動することはできません。 たとえば、すべてのクライアント証明書とサーバー証明書はサービスの開始時に生成されますが、これには約 2 秒かかります。 ただし、Hellman Defi ファイルの生成はビルド時間に含める必要がありました。このファイルは Docker イメージのビルド中に作成され、最大 10 分間かかることがあります。 私は、尊敬されるコミュニティからそのようなソリューションのセキュリティ監査を受けたいと強く思っています。

起動する

サービスを開始するには、いくつかのものが必要です。

  1. サーバー: 物理または仮想。 理論的には docker-within-docker モードで実行することは可能ですが、私はこのオプションを詳しくテストしていません。
  2. 実はドッカー。 多くのホスティング プロバイダーは、Docker を搭載した既製のソリューションを提供しています。
  3. パブリックIPアドレス。

すべての詳細が整っている場合は、サーバーのコンソールで次のコマンドを実行するだけです。

docker run --cap-add=NET_ADMIN 
-it -p 1194:1194/udp -p 80:8080/tcp 
-e HOST_ADDR=$(curl -s https://api.ipify.org) 
alekslitvinenk/openvpn

注意深い読者は、サーバーの IP アドレスが次のコマンドを使用して自動的に決定されることに気づいたかもしれません。 ipify.org。 何らかの理由でこれが機能しない場合は、アドレスを手動で指定できます。前の手順がすべて正しく完了していれば、コンソールに次のような内容が表示されるはずです。

Sun Jun  9 08:56:11 2019 Initialization Sequence Completed
Sun Jun  9 08:56:12 2019 Client.ovpn file has been generated
Sun Jun  9 08:56:12 2019 Config server started, download your client.ovpn config at http://example.com/
Sun Jun  9 08:56:12 2019 NOTE: After you download you client config, http server will be shut down!

目標は近づいています。次はコピーする必要があります。 example.com (あなたの場合、それはサーバーのアドレスになります) それをブラウザのアドレスバーに貼り付けます。 Enter キーを押すと、client.ovpn ファイルがダウンロードされ、http サーバー自体が忘れ去られます。 この解決策に疑問がある場合は、次のトリックを使用できます。前のコマンドを実行してフラグを追加します。 zp そしてパスワード。 生成されたリンクをブラウザ ウィンドウに貼り付けると、パスワード付きの zip アーカイブが受信されます。クライアント構成ファイルを取得したら、適切なクライアントを使用できます。 私はMac用のTunnelblickを使用しています。

ビデオチュートリアル

このビデオ チュートリアルには、DigitalOcean にサービスをデプロイするための詳細な手順が含まれています。

PS このプロジェクトが役立つと思われる場合は、GitHub でスターを付け、フォークして友達に伝えてください。 貢献者やセキュリティ監査も広く歓迎されています。PPS この記事が Habr に関する記事になったら、次の記事では、docker-in-docker と docker-in-docker-in-docker をどのように立ち上げたのか、なぜそれを行ったのか、そしてそこから何が得られたのかについて書く予定です。
EDIT1:

  1. 出版物の誤りを修正しました。
  2. コメントに応えて、この情報をここに置くことにしました: iptables を使用するには、 -privileged フラグが必要です

EDIT2:

  1. イメージ起動コマンドを改善しました。-privileged フラグが必要なくなりました。
  2. ロシア語のビデオ ガイドへのリンクを追加しました。 youtu.be/A8zvrHsT9A0

出所: habr.com

コメントを追加します