CentOS8でOpenVPNサーバーをセットアップおよび構成する方法

提供:Dev Guides
移動先:案内検索

序章

仮想プライベートネットワーク(VPN)を使用すると、信頼できないネットワークを、プライベートネットワーク上にいるかのようにトラバースできます。 ホテルやコーヒーショップのWiFiなど、信頼できないネットワークに接続している場合は、スマートフォンやラップトップからインターネットに安全かつ確実にアクセスできます。

HTTPS接続と組み合わせると、この設定により、ワイヤレスログインとトランザクションを保護できます。 地理的な制限や検閲を回避し、場所と暗号化されていないHTTPトラフィックを信頼できないネットワークから保護することができます。

OpenVPN は、幅広い構成に対応するフル機能のオープンソーストランスポート層セキュリティ(TLS)VPNソリューションです。 このチュートリアルでは、CentOS 8サーバーでOpenVPNをセットアップし、クライアントマシンからアクセスできるように構成します。

注: DigitalOcean DropletにOpenVPNサーバーをセットアップする場合は、多くのホスティングプロバイダーと同様に、帯域幅の超過に対して課金されることに注意してください。 このため、サーバーが処理しているトラフィックの量に注意してください。

詳細については、このページを参照してください。


前提条件

このチュートリアルに従うには、次のものが必要です。

  • sudo非rootユーザーとファイアウォールが有効になっている1台のCentOS8サーバー。 これを設定するには、 CentOS8を使用したサーバーの初期設定チュートリアルに従ってください。 このガイドでは、これをOpenVPNサーバーと呼びます。
  • プライベート認証局(CA)としてセットアップされた個別のCentOS 8サーバー。このガイドでは、これをCAサーバーと呼びます。 このサーバーで初期サーバーセットアップガイドの手順を実行した後、 CentOS 8 [で認証局(CA)をセットアップおよび構成する方法]に関するガイドのステップ1〜3に従うことができます。 X203X]それを達成するために。

注: OpenVPNサーバーまたはローカルマシンをCAとして使用することは技術的には可能ですが、VPNをセキュリティの脆弱性にさらす可能性があるため、これはお勧めしません。 公式のOpenVPNドキュメントに従って、証明書要求のインポートと署名専用のスタンドアロンマシンにCAを配置する必要があります。 このため、このガイドでは、CAが別のCentOS 8サーバー上にあり、sudo権限と基本ファイアウォールが有効になっている非rootユーザーもいることを前提としています。


それに加えて、OpenVPNサーバーへの接続に使用するクライアントマシンが必要になります。 このガイドでは、これをOpenVPNクライアントと呼びます。 このチュートリアルでは、ローカルマシンをOpenVPNクライアントとして使用することをお勧めします。

これらの前提条件が整ったら、CentOS8でOpenVPNサーバーのセットアップと構成を開始する準備が整います。

注:これらのサーバーの構成中にパスワード認証を無効にすると、このガイドの後半でサーバー間でファイルを転送するときに問題が発生する可能性があることに注意してください。 この問題を解決するには、各サーバーでパスワード認証を再度有効にすることができます。 または、サーバーごとにSSHキーペアを生成してから、OpenVPNサーバーの公開SSHキーをCAマシンのauthorized_keysファイルに追加することもできます。その逆も可能です。 これらのソリューションのいずれかを実行する方法については、 CentOS8でSSHキーを設定する方法を参照してください。


ステップ1—OpenVPNとEasy-RSAのインストール

このチュートリアルの最初のステップは、OpenVPNとEasy-RSAをインストールすることです。 Easy-RSAは、OpenVPNサーバーで使用する公開鍵インフラストラクチャ(PKI)管理ツールであり、証明書要求を生成してから、CAサーバーで検証してサインオンします。

ただし、OpenVPNとEasy-RSAはCentOS 8ではデフォルトで使用できないため、Enterprise Linux(EPEL)リポジトリ用の追加パッケージを有効にする必要があります。 EPELはFedoraプロジェクトによって管理されており、RPMパッケージ形式を使用するFedora、CentOS、およびその他のLinuxディストリビューション用の非標準ですが人気のあるパッケージが含まれています。 初期設定手順で作成したroot以外のsudoユーザーとしてOpenVPNサーバーにログインし、以下を実行します。

sudo dnf install epel-release
sudo dnf install openvpn easy-rsa

次に、OpenVPNサーバー上に~/easy-rsaという非rootユーザーとして新しいディレクトリを作成する必要があります。

mkdir ~/easy-rsa

次に、作成した~/easy-rsaディレクトリにパッケージがインストールしたeasyrsaスクリプトからシンボリックリンクを作成する必要があります。

ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/

注:他のガイドがeasy-rsaパッケージファイルをPKIディレクトリにコピーするように指示する場合がありますが、このチュートリアルではシンボリックリンクアプローチを採用しています。 その結果、easy-rsaパッケージへの更新は、PKIのスクリプトに自動的に反映されます。


最後に、ディレクトリの所有者がroot以外のsudoユーザーであることを確認し、chmodを使用してそのユーザーへのアクセスを制限します。

sudo chown sammy ~/easy-rsa
chmod 700 ~/easy-rsa

これらのプログラムがインストールされ、システムの適切な場所に移動されたら、次のステップは、OpenVPNサーバー上に公開鍵インフラストラクチャ(PKI)を作成して、クライアントやその他のサーバーのTLS証明書を要求および管理できるようにすることです。 VPNに接続します。

ステップ2—OpenVPN用のPKIを作成する

OpenVPNサーバーの秘密鍵と証明書を作成する前に、OpenVPNサーバー上にローカルの公開鍵インフラストラクチャディレクトリを作成する必要があります。 CAサーバー上で直接作成するのではなく、このディレクトリを使用してサーバーとクライアントの証明書要求を管理します。

OpenVPNサーバー上にPKIディレクトリを構築するには、varsというファイルにいくつかのデフォルト値を入力する必要があります。 最初にcdeasy-rsaディレクトリに配置し、次にvarsファイルを好みのテキストエディタで作成および編集します。

CentOS8に付属するデフォルトのテキストエディタはviです。 viは非常に強力なテキストエディタですが、経験が不足しているユーザーにとってはやや鈍感になる可能性があります。 CentOS 8サーバーでの構成ファイルの編集を容易にするために、nanoなどのよりユーザーフレンドリーなエディターをインストールすることをお勧めします。

sudo dnf install nano

nanoをインストールするように求められたら、yと入力して、インストール手順を続行します。 これで、varsファイルを編集する準備が整いました。

cd ~/easy-rsa
nano vars

ファイルを開いたら、次の2行を貼り付けます。

〜/ easy-rsa / vars

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

これらの行により、秘密鍵と証明書要求が、最新の楕円曲線暗号(ECC)を使用して、クライアントとOpenVPNサーバーの鍵と安全な署名を生成するように構成されていることが保証されます。

OpenVPNおよびCAサーバーをECCを使用するように構成すると、クライアントとサーバーが共有対称鍵を確立しようとしたときに、楕円曲線アルゴリズムを使用して交換を行うことができます。 鍵交換にECCを使用すると、従来のRSAアルゴリズムでプレーンなDiffie-Hellmanを使用するよりも大幅に高速になります。これは、数値がはるかに小さく、計算が高速であるためです。

背景:クライアントがOpenVPNに接続するとき、クライアントは非対称暗号化(公開鍵/秘密鍵とも呼ばれます)を使用してTLSハンドシェイクを実行します。 ただし、暗号化されたVPNトラフィックを送信する場合、サーバーとクライアントは対称暗号化を使用します。これは共有キー暗号化とも呼ばれます。

対称暗号化では、非対称暗号化に比べて計算のオーバーヘッドがはるかに少なくなります。使用される数ははるかに少なく、最新のCPU は命令を統合して、最適化された対称暗号化操作を実行します。 非対称暗号化から対称暗号化に切り替えるために、OpenVPNサーバーとクライアントは楕円曲線ディフィーヘルマン(ECDH)アルゴリズムを使用して、共有秘密鍵について可能な限り迅速に合意します。


varsファイルにデータを入力したら、PKIディレクトリの作成に進むことができます。 これを行うには、init-pkiオプションを指定してeasyrsaスクリプトを実行します。 前提条件の一部としてCAサーバーでこのコマンドをすでに実行しましたが、OpenVPNサーバーとCAサーバーには別々のPKIディレクトリがあるため、ここで実行する必要があります。

./easyrsa init-pki

OpenVPNサーバーでは、認証局を作成する必要がないことに注意してください。 CAサーバーは、証明書の検証と署名について単独で責任を負います。 VPNサーバー上のPKIは、証明書要求と公開証明書を保存するための便利で一元化された場所としてのみ使用されます。

OpenVPNサーバーでPKIを初期化したら、次のステップに進む準備ができています。次のステップでは、OpenVPNサーバーの証明書要求と秘密鍵を作成します。

ステップ3—OpenVPNサーバー証明書リクエストと秘密鍵の作成

OpenVPNサーバーにすべての前提条件がインストールされたので、次のステップは、OpenVPNサーバーで秘密鍵と証明書署名要求(CSR)を生成することです。 その後、リクエストをCAに転送して署名し、必要な証明書を作成します。 署名された証明書を取得したら、それをOpenVPNサーバーに転送し直して、サーバーが使用できるようにインストールします。

開始するには、root以外のユーザーとしてOpenVPNサーバーの~/easy-rsaディレクトリに移動します。

cd ~/easy-rsa

次に、gen-reqオプションを指定してeasyrsaを呼び出し、その後にマシンの共通名(CN)を付けます。 CNは好きなものにすることができますが、わかりやすいものにするのに役立ちます。 このチュートリアル全体を通して、OpenVPNサーバーのCNはserverになります。 nopassオプションも必ず含めてください。 そうしないと、リクエストファイルがパスワードで保護され、後で権限の問題が発生する可能性があります。

注:ここでserver以外の名前を選択した場合は、以下の手順の一部を調整する必要があります。 たとえば、生成されたファイルを/etc/openvpnディレクトリにコピーする場合は、正しい名前に置き換える必要があります。 また、後で/etc/openvpn/server.confファイルを変更して、正しい.crtおよび.keyファイルを指すようにする必要があります。


./easyrsa gen-req server nopass
OutputCommon Name (eg: your user, host, or server name) [server]:
 
Keypair and certificate request completed. Your files are:
req: /home/sammy/easy-rsa/pki/reqs/server.req
key: /home/sammy/easy-rsa/pki/private/server.key

これにより、サーバーの秘密鍵とserver.reqという証明書要求ファイルが作成されます。 サーバーキーを/etc/openvpn/serverディレクトリにコピーします。

sudo cp /home/sammy/easy-rsa/pki/private/server.key /etc/openvpn/server/

これらの手順を完了すると、OpenVPNサーバーの秘密鍵が正常に作成されました。 OpenVPNサーバーの証明書署名要求も生成しました。 これで、CSRはCAによる署名の準備が整いました。 このチュートリアルの次のセクションでは、CAサーバーの秘密鍵を使用してCSRに署名する方法を学習します。

ステップ4—OpenVPNサーバーの証明書リクエストに署名する

前の手順で、OpenVPNサーバーの証明書署名要求(CSR)と秘密鍵を作成しました。 ここで、CAサーバはserver証明書について認識し、それを検証する必要があります。 CAが証明書を検証してOpenVPNサーバーに中継すると、CAを信頼するクライアントはOpenVPNサーバーも信頼できるようになります。

OpenVPNサーバーで、root以外のユーザーとして、SCPまたは別の転送方法を使用して、server.req証明書要求をCAサーバーにコピーして署名します。

scp /home/sammy/easy-rsa/pki/reqs/server.req sammy@your_ca_server_ip:/tmp

次に、PKIを作成したeasy-rsaディレクトリを所有する非rootユーザーとしてCAサーバにログインします。 easyrsaスクリプトを使用して証明書リクエストをインポートします。

cd ~/easy-rsa
./easyrsa import-req /tmp/server.req server
Output. . .
The request has been successfully imported with a short name of: server
You may now use this name to perform signing operations on this request.

次に、sign-reqオプションを指定してeasyrsaスクリプトを実行し、続いてリクエストタイプと共通名を実行して、リクエストに署名します。 リクエストタイプは、clientまたはserverのいずれかです。 OpenVPNサーバーの証明書リクエストを処理しているため、必ずserverリクエストタイプを使用してください。

./easyrsa sign-req server server

出力では、リクエストが信頼できるソースからのものであることを確認するように求められます。 yesと入力し、ENTERを押して確認します。

OutputYou are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
 
Request subject, to be signed as a server certificate for 3650 days:
 
subject=
commonName = server
 
 
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
. . .
Certificate created at: /home/sammy/easy-rsa/pki/issued/server.crt

CA秘密鍵を暗号化した場合は、この時点でパスワードの入力を求められることに注意してください。

これらの手順が完了すると、CAサーバーの秘密鍵を使用してOpenVPNサーバーの証明書要求に署名したことになります。 結果のserver.crtファイルには、OpenVPNサーバーの公開暗号化キーとCAサーバーからの署名が含まれています。 署名のポイントは、CAサーバーを信頼するすべての人に、OpenVPNサーバーに接続するときにも信頼できることを伝えることです。

証明書の構成を完了するには、server.crtおよびca.crtファイルをCAサーバーからOpenVPNサーバーにコピーします。

scp pki/issued/server.crt sammy@your_vpn_server_ip:/tmp
scp pki/ca.crt sammy@your_vpn_server_ip:/tmp

ここでOpenVPNサーバーに戻り、ファイルを/tmpから/etc/openvpn/serverにコピーします。

sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server

これで、OpenVPNサーバーは接続を受け入れる準備がほぼ整いました。 次のステップでは、サーバーのセキュリティを強化するためにいくつかの追加のステップを実行します。

ステップ5—OpenVPN暗号化資料の構成

セキュリティをさらに強化するために、サーバーとすべてのクライアントがOpenVPNのtls-cryptディレクティブで使用する共有秘密鍵を追加します。 このオプションは、サーバーとクライアントが最初に相互に接続するときに使用されるTLS証明書をわかりにくくするために使用されます。 また、OpenVPNサーバーは、着信パケットのクイックチェックを実行するために使用します。パケットが事前共有キーを使用して署名されている場合、サーバーはそれを処理します。 署名されていない場合、サーバーはそれが信頼できないソースからのものであることを認識し、追加の復号化作業を実行することなく破棄できます。

このオプションは、OpenVPNサーバーが認証されていないトラフィック、ポートスキャン、およびサーバーリソースを占有する可能性のあるサービス拒否攻撃に確実に対処できるようにするのに役立ちます。 また、OpenVPNネットワークトラフィックの識別が困難になります。

tls-crypt事前共有キーを生成するには、OpenVPNサーバーの~/easy-rsaディレクトリで次のコマンドを実行します。

cd ~/easy-rsa
openvpn --genkey --secret ta.key

結果はta.keyというファイルになります。 /etc/openvpn/server/ディレクトリにコピーします。

sudo cp ta.key /etc/openvpn/server

これらのファイルをOpenVPNサーバーに配置すると、VPNへの接続に使用するユーザーのクライアント証明書とキーファイルを作成する準備が整います。

ステップ6—クライアント証明書とキーペアの生成

クライアントマシンで秘密鍵と証明書の要求を生成し、それをCAに送信して署名することもできますが、このガイドでは、OpenVPNサーバーで証明書の要求を生成するプロセスの概要を説明します。 このアプローチの利点は、必要なすべてのキーと証明書を含むクライアント構成ファイルを自動的に生成するスクリプトを作成できることです。 これにより、キー、証明書、および構成ファイルをクライアントに転送する必要がなくなり、VPNに参加するプロセスが合理化されます。

このガイドでは、単一のクライアントキーと証明書のペアを生成します。 複数のクライアントがある場合は、クライアントごとにこのプロセスを繰り返すことができます。 ただし、すべてのクライアントのスクリプトに一意の名前の値を渡す必要があることに注意してください。 このチュートリアル全体を通して、最初の証明書/キーのペアはclient1と呼ばれます。

クライアント証明書とキーファイルを保存するために、ホームディレクトリ内にディレクトリ構造を作成することから始めます。

mkdir -p ~/client-configs/keys

クライアントの証明書/キーのペアと構成ファイルをこのディレクトリに保存するため、セキュリティ対策として、今すぐアクセス許可をロックダウンする必要があります。

chmod -R 700 ~/client-configs

次に、EasyRSAディレクトリに戻り、[X53X]およびnopassオプションを使用して、クライアントの一般名とともにeasyrsaスクリプトを実行します。

cd ~/easy-rsa
./easyrsa gen-req client1 nopass

ENTERを押して一般名を確認します。 次に、client1.keyファイルを前に作成した~/client-configs/keys/ディレクトリにコピーします。

cp pki/private/client1.key ~/client-configs/keys/

次に、安全な方法を使用してclient1.reqファイルをCAServerに転送します。

scp pki/reqs/client1.req sammy@your_ca_server_ip:/tmp

次に、CAServerにログインします。 次に、EasyRSAディレクトリに移動し、証明書要求をインポートします。

cd ~/easy-rsa
./easyrsa import-req /tmp/client1.req client1

次に、前の手順でサーバーに対して行ったのと同じ方法でリクエストに署名します。 ただし、今回は必ずclientリクエストタイプを指定してください。

./easyrsa sign-req client client1

プロンプトが表示されたら、yesと入力して、証明書要求に署名する予定であり、信頼できるソースからのものであることを確認します。

OutputType the word 'yes' to continue, or any other input to abort.
Confirm request details: yes

ここでも、CAキーを暗号化した場合は、ここでパスワードの入力を求められます。

これにより、client1.crtという名前のクライアント証明書ファイルが作成されます。 このファイルをサーバーに転送します。

scp pki/issued/client1.crt sammy@your_server_ip:/tmp

OpenVPNサーバーに戻り、クライアント証明書を~/client-configs/keys/ディレクトリにコピーします。

cp /tmp/client1.crt ~/client-configs/keys/

次に、ca.crtファイルとta.keyファイルも~/client-configs/keys/ディレクトリにコピーし、sudoユーザーに適切な権限を設定します。

cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
sudo chown sammy.sammy ~/client-configs/keys/*

これで、サーバーとクライアントの証明書とキーがすべて生成され、OpenVPNサーバーの適切なディレクトリに保存されます。 これらのファイルで実行する必要のあるアクションはまだいくつかありますが、それらは後のステップで実行されます。 今のところ、OpenVPNの設定に進むことができます。

ステップ7—OpenVPNの設定

他の多くの広く使用されているオープンソースツールと同様に、OpenVPNには、特定のニーズに合わせてサーバーをカスタマイズするために利用できる多数の構成オプションがあります。 このセクションでは、このソフトウェアのドキュメントに含まれているサンプル構成ファイルの1つに基づいてOpenVPNサーバー構成をセットアップする方法について説明します。

まず、サンプルのserver.confファイルを独自の構成ファイルの開始点としてコピーします。

sudo cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/

選択したテキストエディタで編集するために新しいファイルを開きます。 この例ではnanoを使用します。

sudo nano /etc/openvpn/server/server.conf

このファイルの数行を変更する必要があります。 まず、tls-authディレクティブを検索して、構成のHMACセクションを見つけます。 この行はコメントを外す必要があります。 行の先頭に;を追加してコメントアウトします。 次に、値tls-crypt ta.keyのみを含む新しい行を追加します。

/etc/openvpn/server.conf

;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key

次に、cipher行を探して、暗号化暗号に関するセクションを見つけます。 デフォルト値はAES-256-CBCに設定されていますが、AES-256-GCM暗号はより優れたレベルの暗号化とパフォーマンスを提供し、最新のOpenVPNクライアントで十分にサポートされています。 この行の先頭に;記号を追加してデフォルト値をコメント化し、その後にAES-256-GCMの更新値を含む別の行を追加します。

/etc/openvpn/server.conf

;cipher AES-256-CBC
cipher AES-256-GCM

この行の直後に、authディレクティブを追加して、HMACメッセージダイジェストアルゴリズムを選択します。 このためには、SHA256が適切な選択です。

/etc/openvpn/server.conf

auth SHA256

次に、Diffie-Hellmanパラメーターを定義するdhディレクティブを含む行を見つけます。 楕円曲線暗号を使用するようにすべての証明書を構成したので、Diffie-Hellmanシードファイルは必要ありません。 dh dh2048.pemまたはdh dh.pemのような既存の行をコメントアウトします。 Diffie-Hellmanキーのファイル名は、サーバー構成ファイルの例にリストされているものとは異なる場合があります。 次に、その後にdh noneの内容の行を追加します。

/etc/openvpn/server.conf

;dh dh2048.pem
dh none

次に、OpenVPNが起動したら特権なしで実行するようにしたいので、nobodyのユーザーとグループで実行するように指示する必要があります。 これを有効にするには、各行の先頭から;記号を削除して、user nobodyおよびgroup nobody行を見つけてコメントを外します。

/etc/openvpn/server.conf

user nobody
group nobody

(オプション)DNSの変更をプッシュして、VPNを介してすべてのトラフィックをリダイレクトします

上記の設定により、クライアントとサーバー間にVPN接続が作成されますが、接続でトンネルを使用するように強制されることはありません。 VPNを使用してすべてのクライアントトラフィックをVPN経由でルーティングする場合は、追加の設定をクライアントコンピューターにプッシュすることをお勧めします。

開始するには、push "redirect-gateway def1 bypass-dhcp"を含む行を見つけてコメントを外します。 これを行うと、OpenVPNサーバーを介してすべてのトラフィックをリダイレクトするようにクライアントに指示されます。 この機能を有効にすると、SSHなどの他のネットワークサービスとの接続の問題が発生する可能性があることに注意してください。

/etc/openvpn/server.conf

push "redirect-gateway def1 bypass-dhcp"

この線のすぐ下で、dhcp-optionセクションを見つけます。 ここでも、両方の行の先頭から;を削除して、コメントを解除します。

/etc/openvpn/server.conf

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

これらの行は、リストされたIPアドレスで無料のOpenDNSリゾルバーを使用するようにクライアントに指示します。 他のDNSリゾルバーが必要な場合は、強調表示されたIPの代わりにそれらを置き換えることができます。

これは、クライアントがVPNトンネルをデフォルトゲートウェイとして使用するようにDNS設定を再構成するのに役立ちます。

(オプション)ポートとプロトコルを調整します

デフォルトでは、OpenVPNサーバーはポート1194とUDPプロトコルを使用してクライアント接続を受け入れます。 クライアントが存在する可能性のあるネットワーク環境が制限されているために別のポートを使用する必要がある場合は、portオプションを変更できます。 OpenVPNサーバーでWebコンテンツをホストしていない場合は、ポート443が一般的な選択肢です。これは、通常、ファイアウォールルールで許可されているためです。

ポート443でリッスンするようにOpenVPNを変更するには、server.confファイルを開き、次のような行を見つけます。

/etc/openvpn/server.conf

port 1194

ポートが443になるように編集します。

/etc/openvpn/server.conf

# Optional!
port 443

多くの場合、プロトコルはそのポートにも制限されています。 その場合は、port行の下のproto行を見つけて、プロトコルをudpからtcpに変更します。

/etc/openvpn/server.conf

# Optional!
proto tcp

プロトコルをTCPにdo切り替える場合、このディレクティブは1から0にのみ使用されるため、explicit-exit-notifyディレクティブの値を変更する必要があります。 UDPによる。 TCPの使用中にこれを行わないと、OpenVPNサービスの開始時にエラーが発生します。

ファイルの最後にあるexplicit-exit-notify行を見つけて、値を0に変更します。

/etc/openvpn/server.conf

# Optional!
explicit-exit-notify 0

別のポートとプロトコルを使用する必要がない場合は、これらの設定を変更しないでおくことをお勧めします。

(オプション)デフォルト以外の資格情報を指す

以前に./easyrsa gen-req serverコマンドで別の名前を選択した場合は、server.conf構成ファイルのcert行とkey行を変更して、適切な名前を指すようにします。 .crtおよび.keyファイル。 デフォルト名serverを使用した場合、これはすでに正しく設定されています。

/etc/openvpn/server.conf

cert server.crt
key server.key

終了したら、ファイルを保存して閉じます。

これで、OpenVPNの一般設定の構成が完了しました。 次のステップでは、サーバーのネットワークオプションをカスタマイズします。

ステップ8—OpenVPNサーバーのネットワーク構成を調整する

OpenVPNがVPNを介してトラフィックを正しくルーティングできるように、サーバーのネットワーク構成のいくつかの側面を微調整する必要があります。 これらの最初のものは、 IP転送です。これは、IPトラフィックをルーティングする場所を決定するための方法です。 これは、サーバーが提供するVPN機能に不可欠です。

OpenVPNサーバーのデフォルトのIP転送設定を調整するには、nanoまたはお好みのエディターを使用して/etc/sysctl.confファイルを開きます。

sudo nano /etc/sysctl.conf

次に、ファイルの先頭に次の行を追加します。

/etc/sysctl.conf

net.ipv4.ip_forward = 1

終了したら、ファイルを保存して閉じます。

ファイルを読み取り、現在のセッションの新しい値をロードするには、次のように入力します。

sudo sysctl -p
Outputnet.ipv4.ip_forward = 1

これで、OpenVPNサーバーは着信トラフィックをあるイーサネットデバイスから別のイーサネットデバイスに転送できるようになります。 この設定により、サーバーは、仮想VPNインターフェイスに接続するクライアントからのトラフィックを他の物理イーサネットデバイス経由で転送できるようになります。 この構成では、クライアントからのすべてのWebトラフィックがサーバーのIPアドレスを介してルーティングされ、クライアントのパブリックIPアドレスは事実上非表示になります。

次のステップでは、OpenVPNサーバーとの間のトラフィックが適切に流れるようにファイアウォールルールを構成する必要があります。

ステップ9—ファイアウォールの構成

これまで、サーバーにOpenVPNをインストールして構成し、クライアントがVPNにアクセスするために必要なキーと証明書を生成しました。 ただし、クライアントからの着信Webトラフィックの送信先に関する指示はOpenVPNにまだ提供されていません。 いくつかのファイアウォールルールとルーティング構成を確立することにより、サーバーがクライアントトラフィックを処理する方法を規定できます。

このチュートリアルの開始時に前提条件に従っていると仮定すると、サーバーにfirewalldがインストールされて実行されているはずです。 OpenVPNがファイアウォールを通過できるようにするには、アクティブなfirewalldゾーンが何であるかを知る必要があります。 次のコマンドでこれを見つけます。

sudo firewall-cmd --get-active-zones
Outputpublic
Interfaces: eth0

tun0インターフェイスを一覧表示するtrustedゾーンが表示されない場合は、次のコマンドを実行してVPNデバイスをそのゾーンに追加します。

sudo firewall-cmd --zone=trusted --add-interface=tun0
sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0

次に、アクティブゾーン内のfirewalldで許可されるサービスのリストにopenvpnサービスを追加し、--permanentオプションを使用してコマンドを再度実行することにより、その設定を永続的にします追加した:

sudo firewall-cmd --permanent --add-service openvpn
sudo firewall-cmd --permanent --zone=trusted --add-service openvpn

ファイアウォールに変更を適用するには、次のコマンドを実行します。

sudo firewall-cmd --reload

これで、次のコマンドを使用して、サービスが正しく追加されたことを確認できます。

sudo firewall-cmd --list-services --zone=trusted
Outputopenvpn

次に、ファイアウォールにマスカレードルールを追加します。 マスカレードを使用すると、OpenVPNサーバーはOpenVPNクライアントのアドレスをサーバー自体のパブリックアドレスに変換し、クライアントに返送されるトラフィックでその逆を行うことができます。 このプロセスは、ネットワークアドレス変換(NAT)とも呼ばれます。

次のコマンドを使用してマスカレードルールを追加します。

sudo firewall-cmd --add-masquerade
sudo firewall-cmd --add-masquerade --permanent

次のコマンドを使用して、マスカレードが正しく追加されたことを確認できます。

sudo firewall-cmd --query-masquerade
Outputyes

次に、OpenVPNサブネット専用の特定のマスカレードルールを作成する必要があります。 これを行うには、最初にサーバーで使用されるプライマリネットワークインターフェイスを表すシェル変数(この例ではDEVICE)を作成し、次にその変数を使用してルーティングルールを永続的に追加します。

DEVICE=$(ip route | awk '/^default via/ {print $5}')
sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEVICE -j MASQUERADE

すべての変更が有効になるように、必ずfirewalldをリロードしてください。

sudo firewall-cmd --reload

--permanentフラグの付いたコマンドは、再起動後もルールが持続することを保証します。 firewall-cmd --reloadコマンドは、ファイアウォールに対するすべての未解決の変更が適用されていることを確認します。 ファイアウォールルールを設定すると、サーバーでOpenVPNサービスを開始できます。

ステップ10—OpenVPNを開始する

OpenVPNはsystemdサービスとして実行されるため、systemctlを使用して管理できます。 サーバーが稼働している限りいつでもVPNに接続できるように、起動時に起動するようにOpenVPNを構成します。 これを行うには、OpenVPNサービスをsystemctlに追加して有効にします。

sudo systemctl -f enable [email protected]

次に、OpenVPNサービスを開始します。

sudo systemctl start [email protected]

次のコマンドを使用して、OpenVPNサービスがアクティブであることを再確認します。 出力にactive (running)が表示されます。

sudo systemctl status [email protected]
Output● [email protected] - OpenVPN service for server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; enabled; vendor preset: disabled)
Active: active (running) since Tue 2020-04-07 02:32:07 UTC; 1min 52s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 15868 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 5059)
Memory: 1.2M
CGroup: /system.slice/system-openvpn\x2dserver.slice/[email protected]
└─15868 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --cipher AES-256-GCM --ncp-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC:BF-CBC --config server.conf
. . .

これで、OpenVPNのサーバー側の構成が完了しました。 次に、クライアントマシンを構成し、OpenVPNサーバーに接続します。

ステップ11—クライアント構成インフラストラクチャを作成する

OpenVPNクライアントの構成ファイルの作成は、すべてのクライアントが独自の構成を持っている必要があり、それぞれがサーバーの構成ファイルで概説されている設定と一致している必要があるため、多少複雑になる可能性があります。 この手順では、1つのクライアントでのみ使用できる単一の構成ファイルを作成するのではなく、構成ファイルをオンザフライで生成するために使用できるクライアント構成インフラストラクチャを構築するプロセスの概要を説明します。 最初に「基本」構成ファイルを作成し、次にスクリプトを作成して、必要に応じて一意のクライアント構成ファイル、証明書、およびキーを生成できるようにします。

以前に作成したclient-configsディレクトリ内にクライアント構成ファイルを保存する新しいディレクトリを作成することから始めます。

mkdir -p ~/client-configs/files

次に、サンプルのクライアント構成ファイルをclient-configsディレクトリーにコピーして、基本構成として使用します。

cp /usr/share/doc/openvpn/sample/sample-config-files/client.conf ~/client-configs/base.conf

nanoまたはお好みのテキストエディタを使用して、この新しいファイルを開きます。

nano ~/client-configs/base.conf

内部で、remoteディレクティブを見つけます。 これにより、クライアントはOpenVPNサーバーアドレス(OpenVPNサーバーのパブリックIPアドレス)を指し示します。 OpenVPNサーバーがリッスンしているポートを変更する場合は、1194も選択したポートに変更する必要があります。

〜/ client-configs / base.conf

. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 1194
. . .

プロトコルがサーバー構成で使用している値と一致していることを確認してください。

〜/ client-configs / base.conf

proto udp

次に、各行の先頭にある;記号を削除して、userおよびgroupディレクティブのコメントを解除します。

〜/ client-configs / base.conf

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nobody

cacert、およびkeyを設定するディレクティブを見つけます。 ファイル自体に証明書とキーをまもなく追加するため、これらのディレクティブをコメントアウトします。

〜/ client-configs / base.conf

# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
;ca ca.crt
;cert client.crt
;key client.key

同様に、tls-authディレクティブをコメントアウトします。これは、ta.keyをクライアント構成ファイルに直接追加するためです(サーバーはtls-cryptを使用するように設定されています)。

〜/ client-configs / base.conf

# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1

/etc/openvpn/server/server.confファイルで設定したcipherおよびauth設定をミラーリングします。

〜/ client-configs / base.conf

cipher AES-256-GCM
auth SHA256

次に、ファイルのどこかにkey-directionディレクティブを追加します。 VPNをクライアントマシンで正しく機能させるには、これを「1」に設定する必要があります。

〜/ client-configs / base.conf

key-direction 1

最後に、コメントアウト行をいくつか追加します。 これらのディレクティブはすべてのクライアント構成ファイルに含めることができますが、/etc/openvpn/update-resolv-confファイルとともに出荷されるLinuxクライアントに対してのみ有効にする必要があります。 このスクリプトは、resolvconfユーティリティを使用して、LinuxクライアントのDNS情報を更新します。

〜/ client-configs / base.conf

; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf

クライアントがLinuxを実行していて、/etc/openvpn/update-resolv-confファイルがある場合は、生成後にクライアントの構成ファイルからこれらの行のコメントを解除します。

終了したら、ファイルを保存して閉じます。

次に、関連する証明書、キー、および暗号化ファイルを使用して基本構成をコンパイルするスクリプトを作成し、生成された構成を~/client-configs/filesディレクトリに配置します。 ~/client-configsディレクトリ内にmake_config.shという名前の新しいファイルを開きます。

nano ~/client-configs/make_config.sh

内部に、次のコンテンツを追加します。

〜/ client-configs / make_config.sh

#!/bin/bash
 
# First argument: Client identifier
 
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
 
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-crypt>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-crypt>') \
> ${OUTPUT_DIR}/${1}.ovpn

終了したら、ファイルを保存して閉じます。

次に進む前に、次のように入力して、このファイルを実行可能としてマークしてください。

chmod 700 ~/client-configs/make_config.sh

このスクリプトは、作成したbase.confファイルのコピーを作成し、クライアント用に作成したすべての証明書とキーファイルを収集し、それらの内容を抽出して、基本構成ファイルのコピーに追加し、エクスポートします。このすべてのコンテンツを新しいクライアント構成ファイルに入れます。 つまり、クライアントの構成、証明書、およびキーファイルを個別に管理する必要はなく、必要なすべての情報が1か所に保存されます。 この方法を使用する利点は、将来クライアントを追加する必要がある場合に、このスクリプトを実行して新しい構成ファイルをすばやく作成し、すべての重要な情報が単一のアクセスしやすい場所に保存されるようにすることができることです。位置。

新しいクライアントを追加するときはいつでも、このスクリプトを実行してその構成ファイルを生成する前に、そのクライアントの新しいキーと証明書を生成する必要があることに注意してください。 次のステップで、このスクリプトを使用して練習します。

ステップ12—クライアント構成の生成

ガイドに従って、ステップ6でそれぞれclient1.crtおよびclient1.keyという名前のクライアント証明書とキーを作成しました。 ~/client-configsディレクトリに移動し、前の手順の最後に作成したスクリプトを実行することで、これらの資格情報の構成ファイルを生成できます。

cd ~/client-configs
./make_config.sh client1

これにより、~/client-configs/filesディレクトリにclient1.ovpnという名前のファイルが作成されます。

ls ~/client-configs/files
Outputclient1.ovpn

このファイルを、クライアントとして使用する予定のデバイスに転送する必要があります。 たとえば、これはローカルコンピュータまたはモバイルデバイスである可能性があります。

この転送を実行するために使用される正確なアプリケーションは、デバイスのオペレーティングシステムと個人の好みによって異なりますが、信頼できる安全な方法は、バックエンドでSFTP(SSHファイル転送プロトコル)またはSCP(セキュアコピー)を使用することです。 これにより、暗号化された接続を介してクライアントのVPN認証ファイルが転送されます。

これは、ローカルコンピューター(macOSまたはLinux)から実行できるSFTPコマンドの例です。 これにより、最後の手順で作成したclient1.ovpnファイルがホームディレクトリにコピーされます。

sftp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/

OpenVPNサーバーからローカルコンピューターにファイルを安全に転送するためのいくつかのツールとチュートリアルを次に示します。

手順13—クライアント構成のインストール

このセクションでは、Windows、macOS、Linux、iOS、およびAndroidにクライアントVPNプロファイルをインストールする方法について説明します。 これらのクライアント命令はいずれも相互に依存していないため、デバイスに該当する方にスキップしてください。

OpenVPN接続は、.ovpnファイルと呼んだものと同じ名前になります。 このチュートリアルに関して、これは、接続の名前がclient1.ovpnであり、生成した最初のクライアントファイルと一致していることを意味します。

ウィンドウズ

インストール

OpenVPNのダウンロードページからWindows用のOpenVPNクライアントアプリケーションをダウンロードします。 ご使用のバージョンのWindowsに適切なインストーラーバージョンを選択してください。

:OpenVPNをインストールするには管理者権限が必要です。


OpenVPNをインストールした後、.ovpnファイルを次の場所にコピーします。

C:\Program Files\OpenVPN\config

OpenVPNを起動すると、プロファイルが自動的に検索され、利用できるようになります。

管理者アカウントであっても、OpenVPNを使用するたびに管理者として実行する必要があります。 VPNを使用するたびに右クリックして管理者として実行を選択せずにこれを行うには、管理者アカウントからこれを事前設定する必要があります。 これは、標準ユーザーがOpenVPNを使用するために管理者のパスワードを入力する必要があることも意味します。 一方、標準ユーザーは、クライアント上のOpenVPNアプリケーションに管理者権限がない限り、サーバーに適切に接続できないため、昇格された権限が必要です。

OpenVPNアプリケーションを常に管理者として実行するように設定するには、そのショートカットアイコンを右クリックして、プロパティに移動します。 互換性タブの下部にあるボタンをクリックして、すべてのユーザーの設定を変更します。 新しいウィンドウで、このプログラムを管理者として実行するをチェックします。

接続する

OpenVPN GUIを起動するたびに、Windowsはプログラムがコンピューターに変更を加えることを許可するかどうかを尋ねます。 はいをクリックします。 OpenVPNクライアントアプリケーションを起動すると、アプレットはシステムトレイに配置されるだけなので、必要に応じてVPNを接続および切断できます。 実際にはVPN接続を確立しません。

OpenVPNが開始されたら、システムトレイアプレットに移動し、OpenVPNアプレットアイコンを右クリックして接続を開始します。 これにより、コンテキストメニューが開きます。 メニューの上部にあるclient1client1.ovpnプロファイル)を選択し、Connectを選択します。

接続が確立されている間はステータスウィンドウが開き、ログ出力が表示されます。クライアントが接続されるとメッセージが表示されます。

同じ方法でVPNから切断します。システムトレイアプレットに移動し、OpenVPNアプレットアイコンを右クリックして、クライアントプロファイルを選択し、切断をクリックします。

マックOS

インストール

Tunnelblick は、macOS用の無料のオープンソースOpenVPNクライアントです。 最新のディスクイメージは、TunnelblickDownloadsページからダウンロードできます。 ダウンロードした.dmgファイルをダブルクリックし、プロンプトに従ってインストールします。

インストールプロセスの終わりに向かって、Tunnelblickは構成ファイルがあるかどうかを尋ねます。 回答構成ファイルがあり、Tunnelblickを終了させます。 Finderウィンドウを開き、client1.ovpnをダブルクリックします。 Tunnelblickはクライアントプロファイルをインストールします。 管理者権限が必要です。

接続する

アプリケーションフォルダのTunnelblickアイコンをダブルクリックして、Tunnelblickを起動します。 Tunnelblickが起動すると、画面右上のメニューバーに接続を制御するためのTunnelblickアイコンが表示されます。 アイコンをクリックし、 Connect client1 メニュー項目をクリックして、VPN接続を開始します。

Linux

インストール

Linuxを使用している場合は、ディストリビューションに応じてさまざまなツールを使用できます。 デスクトップ環境またはウィンドウマネージャーには、接続ユーティリティも含まれている場合があります。

ただし、最も一般的な接続方法は、OpenVPNソフトウェアを使用することです。

UbuntuまたはDebianでは、次のように入力することで、サーバーにインストールしたのと同じようにインストールできます。

sudo apt update
sudo apt install openvpn

CentOSでは、EPELリポジトリを有効にしてから、次のように入力してインストールできます。

sudo yum install epel-release
sudo yum install openvpn

構成

ディストリビューションに/etc/openvpn/update-resolv-confスクリプトが含まれているかどうかを確認してください。

ls /etc/openvpn
Outputupdate-resolv-conf

次に、転送したOpenVPNクライアント構成ファイルを編集します。

nano client1.ovpn

update-resolv-confファイルが見つかった場合は、DNS設定を調整するために追加した3行のコメントを解除します。

client1.ovpn

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

CentOSを使用している場合は、groupディレクティブをnogroupからnobodyに変更して、ディストリビューションの使用可能なグループに一致させます。

client1.ovpn

group nobody

ファイルを保存して閉じます。

これで、openvpnコマンドをクライアント構成ファイルにポイントするだけで、VPNに接続できます。

sudo openvpn --config client1.ovpn

これにより、VPNに接続されます。

iOS

インストール

iTunes App Storeから、公式iOSOpenVPNクライアントアプリケーションであるOpenVPNConnectを検索してインストールします。 iOSクライアント構成をデバイスに転送するには、デバイスをコンピューターに直接接続します。

iTunesで転送を完了するプロセスの概要をここに示します。 コンピュータでiTunesを開き、 iPhone > appsをクリックします。 ファイル共有セクションまで下にスクロールして、OpenVPNアプリをクリックします。 右側の空白のウィンドウOpenVPNDocuments は、ファイルを共有するためのものです。 .ovpnファイルをOpenVPNドキュメントウィンドウにドラッグします。

次に、iPhoneでOpenVPNアプリを起動します。 新しいプロファイルをインポートする準備ができたという通知が届きます。 緑色のプラス記号をタップしてインポートします。

接続する

これで、OpenVPNを新しいプロファイルで使用する準備が整いました。 ConnectボタンをOnの位置にスライドさせて接続を開始します。 同じボタンをオフにスライドさせて切断します。

設定の下のVPNスイッチを使用してVPNに接続することはできません。 試してみると、OpenVPNアプリを使用してのみ接続するように通知が届きます。


アンドロイド

インストール

GooglePlayストアを開きます。 公式のAndroidOpenVPNクライアントアプリケーションであるAndroidOpenVPNConnectを検索してインストールします。

.ovpnプロファイルを転送するには、AndroidデバイスをUSBでコンピューターに接続し、ファイルをコピーします。 または、SDカードリーダーをお持ちの場合は、デバイスのSDカードを取り外し、プロファイルをコピーしてから、カードをAndroidデバイスに挿入し直すことができます。

OpenVPNアプリを起動し、FILEメニューをタップしてプロファイルをインポートします。

次に、保存したプロファイルの場所に移動し(スクリーンショットでは、/storage/emulated/0/openvpnを使用)、.ovpnファイルを選択します。 IMPORTボタンをタップして、このプロファイルのインポートを終了します。

接続プロファイルが追加されると、次のような画面が表示されます。

接続するには、使用するプロファイルの近くにあるトグルボタンをタップします。 OpenVPNサーバーを介してルーティングされている接続とトラフィックのリアルタイムの統計が表示されます。

切断するには、左上のトグルボタンをもう一度タップします。 VPNから切断することを確認するように求められます。

ステップ14— VPN接続のテスト(オプション)

注: VPN接続をテストするこの方法は、OpenVPNのserver.confファイルを編集したときに、手順7ですべてのトラフィックをVPN経由でルーティングすることを選択した場合にのみ機能します。


すべてがインストールされたら、簡単なチェックですべてが正しく機能していることを確認します。 VPN接続を有効にせずに、ブラウザを開いてDNSLeakTestに移動します。

このサイトは、インターネットサービスプロバイダーによって割り当てられたIPアドレスを、世界中に表示されたとおりに返します。 同じWebサイトでDNS設定を確認するには、拡張テストをクリックすると、使用しているDNSサーバーが表示されます。

次に、OpenVPNクライアントをDropletのVPNに接続し、ブラウザーを更新します。 これで、完全に異なるIPアドレス(VPNサーバーのIPアドレス)が表示されるはずです。これが、世界に表示される方法です。 繰り返しになりますが、DNSLeakTestの Extended Test は、DNS設定をチェックし、VPNによってプッシュされたDNSリゾルバーを使用していることを確認します。

ステップ15—クライアント証明書を取り消す

場合によっては、OpenVPNサーバーへのそれ以上のアクセスを防ぐために、クライアント証明書を取り消す必要があります。

これを行うには、 CentOS8証明書の取り消しセクションにある認証局を設定および構成する方法の前提条件チュートリアルの例に従います。

これらの手順を使用してクライアントの証明書を取り消したら、生成されたcrl.pemファイルをOpenVPNサーバーの/etc/openvpn/serverディレクトリにコピーする必要があります。

sudo cp /tmp/crl.pem /etc/openvpn/server/

次に、OpenVPNサーバー構成ファイルを開きます。

sudo nano /etc/openvpn/server/server.conf

ファイルの下部にcrl-verifyオプションを追加します。これにより、接続が試行されるたびに作成した証明書失効リストを確認するようにOpenVPNサーバーに指示されます。

/etc/openvpn/server/server.conf

crl-verify crl.pem

ファイルを保存して閉じます。

最後に、OpenVPNを再起動して、証明書の失効を実装します。

sudo systemctl restart [email protected]

クライアントは、古いクレデンシャルを使用してサーバーに正常に接続できなくなります。

追加のクライアントを取り消すには、次のプロセスに従います。

  1. ./easyrsa revoke client_nameコマンドで証明書を取り消します
  2. 新しいCRLを生成する
  3. 新しいcrl.pemファイルをOpenVPNサーバーに転送し、それを/etc/openvpn/server/ディレクトリにコピーして、古いリストを上書きします。
  4. OpenVPNサービスを再起動します。

このプロセスを使用して、サーバーに対して以前に発行した証明書を取り消すことができます。

結論

これで、OpenVPNサーバー上で完全に機能する仮想プライベートネットワークが実行されているはずです。 悪意のある攻撃者があなたの活動を追跡することを心配することなく、Webを閲覧してコンテンツをダウンロードできます。

VPNに自動的に接続するようにクライアントを構成したり、クライアント固有のルールとアクセスポリシーを構成したりするなど、OpenVPNのインストールをさらにカスタマイズするために実行できるいくつかの手順があります。 これらおよびその他のOpenVPNのカスタマイズについては、公式のOpenVPNドキュメントを参照してください。

より多くのクライアントを構成するには、追加のデバイスごとに6および11-13の手順に従うだけです。 クライアントへのアクセスを取り消すには、手順15に従います。