概要
この投稿では、Dockerを使用してOpenVPNサーバーをインストールしてホストする方法について説明します。つまり、Dockerを使用してOpenVPNサーバーをインストールし、サービスとして実行し、クライアント接続構成と証明書を生成します。これらを使用して、VPNサーバー上の複数のクライアントを接続できます。この方法は、Dockerがインストールされ実行されているすべてのLinuxディストリビューションで機能します。
注 –この設定は、パスワードのない環境向けです。つまり、クライアントはサーバーへの接続にユーザー名とパスワードを使用せず、代わりにユーザークライアント証明書を使用して接続します。
このソリューションが気に入らない場合や別の方法を好む場合は、WireguardとDockerで同じプロセスをカバーしました。この投稿で確認できます。
前提条件:
– Dockerがインストールされ、実行されている–インストールされていない場合は、この投稿でDebianおよびUbuntuでのDockerのインストール手順を確認してください
–ユーザーに使用するDockerコンテナ– LINK(必要に応じて詳細も確認してください)
OpenVPNサーバーのDockerコンテナのインストール
1.最初のステップは、OpenVPNのデータボリュームコンテナーを作成することです。これにより、すべてのデータ、構成ファイル、および証明書を保存できます。 「ovpn-data-」プレフィックスを追加し、最後に必要な別の単語を追加することをお勧めします。たとえば、ovpn-data-exampleのようになります。そして、例という単語を好きなものに置き換えます。
したがって、ターミナルで次のコマンドを実行します:
OVPN_DATA="ovpn-data-example"
次に、データボリュームコンテナを作成します:
docker volume create --name $OVPN_DATA
注– LinuxホストでDockerに昇格された権限を追加していない場合は、dockerコマンドを実行するたびにsudoを追加する必要があります。
2.次に、UDPプロトコルを介してサーバー(ホスト)のパブリックIPアドレスまたはドメイン名を使用するように設定する引数を含むOpenVPN Dockerイメージファイルをダウンロードします(TCPプロトコルも使用できます):
docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_genconfig -u udp://VPN.SERVERNAME.COM
VPN.SERVENAME.COMを、パブリックIPアドレス、またはサーバーに登録して指定したドメイン名に置き換えます。これは、サーバーをクラウドでホストしている場合のセットアップです(AWS、Azure、UpCloud、Digital Ocean、Linodeなど)。
自宅でのセルフホスティングオプションの場合–これは静的パブリックIPアドレスがある場合にも当てはまります。さらに、ホスト(サーバー)を指すようにルーター(モデム)でポート転送を行う必要があります。静的IPアドレスがない場合は、ダイナミックDNSを使用する必要があります。
CA証明書とクライアント証明書の生成と取得
3.次に、サーバーのCA証明書を生成し、クライアント証明書も生成するために、PKIシステムを開始する必要があります。
docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn ovpn_initpki
指示に従ってください。リソースが限られているクラウドサーバー(たとえば、1CPUと1GBのRAM)にOpenVPNをインストールする場合は、CAサーバー証明書の生成に時間がかかることがあります(cca 15分)。
OpenVPNのPKIを開始すると、最初にCA証明書のパスワードを入力するように求められます。
重要な注意事項 – CAパスフレーズをどこかに書き留めます。後でセットアッププロセス中、およびクライアント証明書を生成するたびに必要になります。
次に、CAの名前を入力するように求められます。何でも入力できます。
CAの生成プロセスにはしばらく時間がかかります。
完了すると、秘密鍵が生成され、前に入力したCAパスフレーズの提供を再度求められます。パスワードの入力を2回求められます。
生成されたCA証明書は、今後3年間有効です。
OpenVPNサーバーサービスを開始します
4. Dockerコマンドを実行して、OpenVPNコンテナーを開始します。
docker run -v $OVPN_DATA:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
注–コマンド-p 1194:1194 / udpの引数も、この設定の重要な部分です。この引数は、サーバーとクライアント間の通信を確立するためにリッスンして使用するポートをOpenVNPに設定します。上記のコマンドでは、ポート1194(Dockerコンテナーの場合は左の番号、ホストサーバーの場合は右の番号)を使用するように設定されています。これは、OpenVPNがデフォルトでUDPプロトコルを介してポート番号1194を使用するためです。別のポート番号を使用する場合は、この番号を変更してください。
クライアント証明書を生成し、コンテナーからホストにクライアント構成ファイルを抽出します
5.次のコマンドを実行して、クライアントデバイスの証明書を生成します。
docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass
上記のコマンドの引数CLIENTNAMEは、必要なものに置き換えることができます。これは、証明書のファイル名とクライアントの識別に使用されます。このコマンドは、パスワードなしの証明書も生成します。証明書は、Dockerコンテナではなく、ホストファイルシステム(SSH経由でホストにログインするために使用しているユーザー名)のユーザーのホームディレクトリに配置されます。
クライアント証明書を生成するとき、OpenVPNはCAパスフレーズを提供するように促します。
注–写真に表示されているように、生成された証明書は、作成してから3年間有効です。
6.このコマンドを実行して、OpenVPN接続構成ファイルをコンパイルし、Dockerコンテナーからホストサーバーに取得します
docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn
その後、FTP、SFTP、またはSCPクライアントをホストサーバーに接続し、OpenVPNファイルをダウンロードして、VPNサーバーに接続するために使用する必要があります。
OpenVPNサーバーに接続する
VPNサーバーに接続するには、OpenVPNクライアントをインストールする必要があります。 WindowsとAndroid用のクライアントアプリがあります–OpenVPN接続。アプリで、openvpnファイルを新しいプロファイルとしてインポートして接続するだけです。
もちろん、Linux用のクライアントもあります。 LinuxのネットワークマネージャーはOpenVPNをサポートしていますが、すべての証明書を個別にインポートするように求められます。したがって、簡単にするために、アプリクライアントもインストールすることをお勧めします。 DebianおよびUbuntuディストリビューションの場合:
$ sudo apt install openvpn
インストールしたら、証明書ファイルが配置されている場所に移動して、次のコマンドを実行します。
$ sudo openvpn ./CLIENTNAME.ovpn
正常な接続結果は次のようになります
サーバーへの適切なポートを必ず開いてください
これが機能するための重要な注意事項でもあります。これをクラウドでホストする場合、またはサーバーにファイアウォールをインストールしている場合は、OpenVPNサーバーにポートを割り当てたポートを開いて許可する必要があります。
この場合、サーバーはクラウド上にあり、ファイアウォールでUDPプロトコル用にポート1194を開く必要がありました。
複数のクライアントを接続する
この設定で複数のクライアントを接続できます。 1つの方法は、複数のデバイスで1つの証明書を使用することですが、この方法は安全性が低くなります。このためには、DockerコンテナにあるOpenVPNサーバー構成ファイルにアクセスして引数を追加する必要があります:
duplicate-cn
クライアントごとに新しい個別の証明書を発行/生成することをお勧めします。これを実現するには、いくつかのコマンドを繰り返す必要があります。
OpenVPNのDockerボリュームを再起動します。
OVPN_DATA="ovpn-data-example" docker volume create --name $OVPN_DATA
次に、新しいクライアント証明書を生成しますが、CLIENTNAMEの代わりに別の名前を使用します:
docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass
もちろん、OpenVPN構成ファイルを取得して、ファイルをダウンロードします。
docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn
概要
Dockerを使用してOpenVPNをインストールする方法、Dockerを使用してOpenVPNをホストする方法、PKIシステムを実行する方法、CA証明書とクライアント証明書を生成する方法、および接続する方法について説明しました。私は個人的にこのセットアップが好きです。最初は、使いやすさ、管理、そしてサーバー側とクライアント側の両方でセットアップのセキュリティが非常に高いためです。このような素晴らしいDockerイメージを構築してくれたKyleMannaのすべての小道具とクレジット。