Rocky Linux 9にOpenVPNサーバーをインストールして構成する方法
Rocky Linux 9にOpenVPNサーバーをインストールして構成する方法
このページで
- 前提条件
ステップ1 - CAサーバーの設定
- ステップ 1.1 - Easy-RSA をインストールする
- ステップ 1.2 - 公共鍵インフラディレクトリを作成する
- ステップ 1.3 - 証明書機関を作成する
ステップ8 - OpenVPNを設定する
仮想プライベートネットワーク(VPN)は、位置情報を隠すことによってインターネットにアクセスできるようにし、信頼できないネットワークで安全にインターネットを利用し、地理的制限や検閲を回避する自由を与えます。OpenVPNは、この目的を達成するためのオープンソースのトランスポート層セキュリティ(TLS)VPNソリューションです。
私たちのチュートリアルでは、Rocky Linux 9サーバーにOpenVPNをインストールし、クライアントマシンからアクセスできるように設定し、クライアントからOpenVPNサーバーを通じてすべてのトラフィックをリダイレクトするVPN接続を作成します。
前提条件
IPv4およびIPv6接続の両方をサポートするRocky Linux 9を実行しているサーバーです。これをOpenVPNサーバーと呼びます。Firewalldファイアウォールが有効になっており、実行中です。
IPv4およびIPv6接続の両方をサポートするRocky Linux 9を実行しているサーバーです。これをプライベート証明書機関(CA)として設定します。これをCAサーバーと呼ぶことにします。
OpenVPNとCAサーバーの両方でsudo権限を持つ非ルートユーザー。
OpenVPNサーバーに接続するクライアントマシン。ローカルデバイスをクライアントマシンとして使用できます。OpenVPNはWindows、Linux、macOS、Android、iOS用のクライアントがあります。そのいずれかを使用して接続できます。チュートリアルではRocky Linux 9のクライアントPCを使用します。
すべてがOpenVPNとCAサーバーで更新されています。
sudo dnf update
ステップ1 - CAサーバーの設定
認証局(CA)は、インターネット上のアイデンティティを検証するためのデジタル証明書を発行する責任のある組織です。このチュートリアルでは、OpenVPNサーバーおよびクライアント証明書を検証するプライベートCAサーバーとして独立したサーバーを使用します。あなたのCAサーバーは、証明書のインポート、署名、検証以外のサービスを実行してはいけません。
ステップ 1.1 - Easy-RSA をインストールする
最初のステップは、easy-rsa スクリプトセットをインストールすることです。easy-rsa は、プライベートキーと公開ルート証明書を生成するために使用される認証局管理ツールです。
しかしまず、easy-rsaパッケージを含むEPELリポジトリを有効にする必要があります。
sudo dnf install epel-release
Easy-RSAをインストールします。
sudo dnf install easy-rsa
ステップ 1.2 - 公共鍵インフラディレクトリを作成する
次のステップは、CAサーバー上にスケルトンの公開鍵基盤(PKI)を作成することです。
mkdir ~/easy-rsa
インストールされたeasy-rsaパッケージファイルを指すシンボリックリンクを作成します。
ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/
PKIディレクトリへのアクセスを制限します。
chmod 700 /home/<username>/easy-rsa
PKIを初期化する。
cd ~/easy-rsa
./easyrsa init-pki
次の出力が得られます。
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/<username>/easy-rsa/pki
ステップ 1.3 - 証明書発行機関を作成する
CA の秘密鍵と証明書を作成する前に、それに対する組織情報を構成する必要があります。情報を保存するために easy-rsa ディレクトリ内に vars ファイルを作成し、編集のために開きます。
cd ~/easy-rsa
nano vars
そのコードをそこに貼り付けてください。
set_var EASYRSA_REQ_COUNTRY "US"
set_var EASYRSA_REQ_PROVINCE "NewYork"
set_var EASYRSA_REQ_CITY "New York City"
set_var EASYRSA_REQ_ORG "Howtoforge"
set_var EASYRSA_REQ_EMAIL "[email "
set_var EASYRSA_REQ_OU "Community"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
Ctrl + X を押してファイルを保存し、促されたらYと入力します。
以下のコマンドを実行して、あなたの認証局のためにルートの公開鍵と秘密鍵のペアを作成してください。
./easyrsa build-ca
キーペアのためのパスフレーズの入力を求められます。また、PEMパスフレーズも尋ねられます。両方に強力なパスフレーズを選択し、後で使用するためにメモしてください。また、CAのコモンネーム(CN)を尋ねられます。任意の文字列を入力できますが、簡単のために、ENTERを押してデフォルト名を受け入れてください。
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/<username>/easy-rsa/pki/ca.crt
CAと対話するたびにパスワードの入力を促されないようにするには、以下のコマンドを代わりに使用できます。
./easyrsa build-ca nopass
これにより、2つのファイルが作成されます:
~/easy-rsa/pki/ca.crtはCAの公開証明書ファイルです。すべてのユーザーとOpenVPNサーバーはこのファイルのコピーが必要です。~/easy-rsa/pki/ca.keyは、CAがOpenVPNサーバーおよびクライアントのために証明書に署名するために使用する秘密鍵です。もし攻撃者があなたのCAにアクセスし、さらにあなたのca.keyファイルにアクセスできてしまった場合、あなたはCAを破棄しなければなりません。これが理由で、あなたのca.keyファイルは CA マシンにのみ 存在すべきであり、理想的には、CAマシンは証明書要求に署名していないときはオフラインに保たれるべきです。
ステップ2 - OpenVPNサーバーにOpenVPNとEasy-RSAをインストールする
OpenVPNサーバーにログインし、OpenVPNおよびEasy-RSAパッケージをインストールします。また、それらの前にEPELリポジトリもインストールしてください。
sudo dnf install epel-release
sudo dnf install openvpn easy-rsa
~/easy-rsa ディレクトリを作成します。
mkdir ~/easy-rsa
easy-rsa スクリプトからシンボリックリンクを作成します。これはCAサーバーにインストールしたものと同じです。
ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/
ディレクトリへのアクセスを制限してください。
chmod 700 ~/easy-rsa
ステップ3 - OpenVPNサーバーのPKIを作成する
PKIを作成するために必要な情報を保存するvarsファイルを~/easy-rsaディレクトリの中に作成し、編集できるようにします。
cd ~/easy-rsa
nano vars
その中に次の行を貼り付けてください。
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
このサーバーをCA(認証局)として使用しないため、必要な値はこれだけです。これにより、あなたのOpenVPNおよびCAサーバーがECCを使用するように設定され、クライアントとサーバーが共有の対称鍵を確立しようとする際に、楕円曲線アルゴリズムを使用して交換を行います。これは、数がはるかに小さく、計算が速いため、従来のRSAアルゴリズムを使用した平文Diffie-Hellmanよりも大幅に速くなります。
次のステップは、init-pkiオプションを使用してPKIディレクトリを作成することです。すでにCAサーバーでこのコマンドを前提条件の一部として実行しましたが、OpenVPNサーバーとCAサーバーは別々のPKIディレクトリを持っているため、ここで再度実行する必要があります。
./easyrsa init-pki
OpenVPNサーバーのPKIは、証明書要求と公開証明書を保存するための中央集権的な場所として使用されます。
ステップ4 - OpenVPNサーバー証明書要求と秘密鍵を作成する
OpenVPNサーバーの~/easy-rsaディレクトリに移動します。
cd ~/easy-rsa
次のステップは、OpenVPNサーバーで秘密鍵と証明書署名要求(CSR)を生成することです。easy-rsaコマンドをgen-reqオプションで実行し、サーバーの共通名(CN)を指定します。私たちのチュートリアルでは、OpenVPNサーバーのCNとしてserverを使用します。また、権限の問題を避けるためにnopassオプションも使用します。
./easyrsa gen-req server nopass
次の出力が得られます。
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
.....+.................+.+.....+....+........+...+.+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+.+...+..+......+...+....+.....+...+.........+......+.......+...+.....+.......+.....+.....................+.+...+...+...............+........+..........+......+.....+...+.......+........+.+...........+...+.+.....+......+.+...+.........+...+........+.+...........+...+....+..+...+............+.............+.....+...+.......+...+...+...........+.+..+.......+.....+...................+..+...+......+....+..+.......+......+......+......+..+......+....+............+...............+.....+..........+...+..+....+..+.........+....+...............+..............+.......+...+..+...+......+.+....................................+........+....+...+...+.........+.....+.+..+...+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
................+...+....+............+...+...+.....+...+....+...............+......+.....+....+.....+.+.........+...+.................+......+.........+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+...+..+.......+..+...+.+.....+.........+.+..+....+...+.....+......+.......+.........+........+......+.+.....+.+............+..+..........+........+.+..+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.........+...+..+.+........+....+..+......+....+.........+..+............+...+...+.........+.............+..+...+...+.+......+.....+....+.....+.+...+..............................+......+........+..........+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [server]:
Keypair and certificate request completed. Your files are:
req: /home/<username>/easy-rsa/pki/reqs/server.req
key: /home/<username>/easy-rsa/pki/private/server.key
これにより、サーバー用の秘密鍵と server.req という証明書要求ファイルが作成されます。サーバーの鍵を /etc/openvpn/server ディレクトリにコピーしてください。
sudo cp /home/<username>/easy-rsa/pki/private/server.key /etc/openvpn/server/
証明書署名要求(CSR)は、現在CAによる署名の準備が整いました。
ステップ5 - OpenVPNサーバーのCSRに署名する
次のステップは、CSRファイルを署名のためにCAサーバーにコピーすることです。サーバーにパスワード認証が有効になっている場合は、次のコマンドを使用してファイルをコピーできます。
scp /home/<username>/easy-rsa/pki/reqs/server.req username@your_ca_server_ip:/tmp
パスワード認証を使用したくない場合は、各サーバー用にSSHキーペアを生成し、次にOpenVPNサーバーの公開SSHキーをCAマシンのauthorized_keysファイルに追加し、その逆も行う必要があります。
これらすべてを実行したくない場合は、ファイルを単にコピーすることができます。OpenVPNサーバー上のファイルを開き、その内容をコピーします。そしてCAサーバー上にファイルを作成し、その内容を貼り付けます。
CAサーバーに再ログインし、~/easy-rsaディレクトリに切り替えてCSRファイルをインポートします。
cd ~/easy-rsa
./easyrsa import-req /tmp/server.req server
次の出力が得られます。
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
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.
次のコマンドを使用してリクエストに署名します。OpenVPNサーバーのCSRに署名するため、その共通名(CN)を使用します。
./easyrsa sign-req server server
信頼できるソースからのリクエストであることを確認するように促されます。yesと入力して、ENTERキーを押して確認してください。
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
You 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 825 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
次に、以前に設定したCAプライベートキーのパスフレーズを求められます。
Using configuration from /home/<username>/easy-rsa/pki/easy-rsa-5673.9KntVf/tmp.P5JqSD
Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key:
802BB2829D7F0000:error:0700006C:configuration file routines:NCONF_get_string:no value:crypto/conf/conf_lib.c:315:group=<NULL> name=unique_subject
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until May 12 01:34:35 2025 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
Certificate created at: /home/<username>/easy-rsa/pki/issued/server.crt
生成された証明書には、OpenVPNサーバーの公開暗号化キーとCAサーバーからの署名が含まれています。証明書をOpenVPNサーバーに戻してください。
scp pki/issued/server.crt username@your_vpn_server_ip:/tmp
scp pki/ca.crt username@your_vpn_server_ip:/tmp
あなたのOpenVPNサーバーで、ファイルを/etc/openvpn/serverディレクトリにコピーしてください。
sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
ステップ6 - OpenVPNの暗号材料を設定する
サーバーとすべてのクライアントがOpenVPNのtls-cryptディレクティブで使用する追加の共有秘密鍵を追加します。これにより、OpenVPNサーバーは認証されていないトラフィック、ポートスキャン、サービス拒否攻撃に対処できるようになります。また、OpenVPNネットワークトラフィックを特定することも難しくなります。
~/easy-rsaディレクトリに切り替えます。
cd ~/easy-rsa
tls-crypt プレシェアードキーを生成します。これにより ta.key というファイルが作成されます。
openvpn --genkey secret ta.key
ta.key を /etc/openvpn/server ディレクトリにコピーしてください。
sudo cp ta.key /etc/openvpn/server
ステップ7 - クライアント証明書とキー ペアを生成する
クライアント証明書と秘密鍵ファイルを格納するディレクトリを作成します。
mkdir -p ~/client-configs/keys
ディレクトリの権限を制限して保護します。
chmod -R 700 ~/client-configs
次に、~/easy-rsaディレクトリに切り替えます。
cd ~/easy-rsa
クライアントのコモンネームとしてclient1を使用してクライアントキーを生成します。クライアントのために任意のCNを使用することができます。
./easyrsa gen-req client1 nopass
<code>ENTER</code>キーを押して一般名を確認してください。次の出力が得られます。
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
........+.+.........+.........+...+...+..+.........+......+...+.......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+..+...+....+........+.......+........+............+...+......+.......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+...............+..........+......+......+.....+....+...........+.+..+......+.+.....................+.........+.........+..+.........+..+...+.+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+.....+.+..................+...........+...+.+............+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+.....+.+.........+...+..+.........+....+..+..................+.+......+...+...+.....+...+......+..........+........+...+...+......+...+...+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+.....+.......+........+.......+........+.+.........+...........+.......+...............+.....+....+.........+.....+.+...+........+...+.+...+..+.+........+............+.........+.+.........+.....+.++.......+.....+.......+.....+....+......+.....+.............+...........+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [client1]:
Keypair and certificate request completed. Your files are:
req: /home/<username>/easy-rsa/pki/reqs/client1.req
key: /home/<username>/easy-rsa/pki/private/client1.key
次に、client1.keyファイルを~/client-configs/keysディレクトリにコピーします。
cp pki/private/client1.key ~/client-configs/keys/
client1.reqファイルをCAサーバーに転送します。
scp pki/reqs/client1.req username@your_ca_server_ip:/tmp
CAサーバーに再ログインし、サーバーリクエストをインポートしてください。
cd ~/easy-rsa
./easyrsa import-req /tmp/client1.req client1
次の出力が得られます。
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
The request has been successfully imported with a short name of: client1
You may now use this name to perform signing operations on this request.
以下のコマンドを使用してリクエストに署名してください。リクエストタイプとしてclientを使用しています。
./easyrsa sign-req client client1
はいと入力して、リクエストにサインすることを確認し、それが信頼できるソースからのものであることを示してください。
Using SSL: openssl OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
You 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 client certificate for 825 days:
subject=
commonName = client1
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
CAパスフレーズの入力を求められます。
Using configuration from /home/<username>/easy-rsa/pki/easy-rsa-5908.XM2MNt/tmp.SGLqAt
Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client1'
Certificate is to be certified until May 12 01:41:45 2025 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
Certificate created at: /home/<username>/easy-rsa/pki/issued/client1.crt
作成した証明書をOpenVPNサーバーに戻します。
scp pki/issued/client1.crt username@your_server_ip:/tmp
OpenVPN サーバーで、クライアント証明書を ~/client-configs/keys ディレクトリにコピーします。
cp /tmp/client1.crt ~/client-configs/keys/
ca.crt と ta.key ファイルを ~/client-configs/keys ディレクトリにコピーし、現在ログインしているサーバーの適切な権限を設定してください。
cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
sudo chown username.username ~/client-configs/keys/*
ステップ8 - OpenVPNを設定する
OpenVPNの設定を開始するために、サンプルのserver.confファイルをコピーしてください。
sudo cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/
ファイルを編集のために開いてください。
sudo nano /etc/openvpn/server/server.conf
ファイルの tls-auth ディレクティブを探して HMAC セクションを見つけてください。その行の先頭にセミコロン (;) を追加してコメントアウトします。その下に新しい行を追加します。
;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key
次に、cipherラインを探して暗号化アルゴリズムの値を変更します。デフォルト値はAES-256-CBCに設定されています。このデフォルト値をコメントアウトし、より高いレベルの暗号化とパフォーマンスを提供するAES-256-GCM暗号化を使用した別の行を追加します。
;cipher AES-256-CBC
cipher AES-256-GCM
その下に、HMACメッセージダイジェストアルゴリズムを選択するためにauthディレクティブを追加します。
auth SHA256
楕円曲線暗号を使用しているため、Diffie-Hellman暗号化をオフにする必要があります。dh dh2048.pemの行をコメントアウトし、その下にdh noneを追加してください。
;dh dh2048.pem
dh none
OpenVPNは、起動後に特権なしで実行される必要があります。これを有効にするには、user nobody と group nobody の行を見つけてコメントを外し、以下のように変更します。
user nobody
group nobody
すべてのトラフィックをVPN経由にリダイレクトする
上記の設定は、クライアントとサーバー間にVPN接続を作成しますが、接続をトンネル経由で強制することはありません。そうするには、まずpush "redirect-gateway def1 bypass-dhcp"の行を見つけます。この行は、クライアントにすべてのトラフィックをOpenVPNサーバー経由でリダイレクトするように指示します。この機能を有効にするには、その行のコメントを解除してください。
push "redirect-gateway def1 bypass-dhcp"
この行の下にある dhcp-option セクションを見つけてください。両方の行の先頭にあるセミコロンを削除します。これにより、クライアントがOpenDNSリゾルバーを使用するよう指示されます。
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
ポートとプロトコルを変更する
OpenVPNはデフォルトでポート1194とUDPプロトコルを使用してクライアント接続を受け入れます。ニーズに応じてポートを変更できます。OpenVPNサーバーでウェブコンテンツをホストしていない場合は、ポート443を使用できます。
行;port 1194を見つけて、セミコロンを削除してコメントを解除し、その値を変更してください。
port 443
proto udp の行を見つけて、その前にセミコロンを追加してコメントアウトしてください。そして、proto tcp の行からセミコロンを取り除いてコメントを解除してください。
proto tcp
;proto udp
TCPプロトコルを使用しているため、explicit-exit-notifyディレクティブの値を1から0に変更する必要があります。このディレクティブはUDPでのみ使用されます。
explicit-exit-notify 0
非デフォルトの資格情報を指す
もし以前の./easy-rsa gen-req serverコマンドで異なる名前を選択した場合、certとkeyの行を修正して適切な.crtと.keyファイルを指すようにする必要があります。私たちはデフォルトのserver名を使用しているため、デフォルト値は正しいです。
cert server.crt
key server.key # This file should be kept secret
SELinuxの変更ログファイルの場所を変更する
行 status openvpn-status.log を見つけて、次のように変更してください。
status /var/log/openvpn-status.log
デフォルトでは、OpenVPNサーバーはログを/run/openvpn/openvpn-status.logディレクトリに生成および保存しますが、SELinuxが有効になっている場合には問題が発生します。簡単な解決策は、場所をシステムログディレクトリに変更することです。
完了したら、Ctrl + X を押してファイルを保存し、プロンプトが表示されたらYを入力します。
ステップ9 - OpenVPNサーバーのネットワーク設定を調整する
次のステップは、OpenVPNがトラフィックを正しくルーティングできるように、サーバーのネットワーク設定を構成することです。最初に設定する必要があるのはポートフォワーディングです。
/etc/sysctl.confファイルを編集のために開いてください.
sudo nano /etc/sysctl.conf
ファイルの下部に次の行を追加してください。
net.ipv4.ip_forward = 1
Ctrl + X を押してファイルを保存し、促されたらYと入力します。
ファイルを読み込み、現在のセッションに新しい値をロードするには、次のコマンドを使用します。
sudo sysctl -p
net.ipv4.ip_forward = 1
この設定は、クライアントからのすべてのウェブトラフィックをサーバーのIPアドレス経由でルーティングし、クライアントの公開IPアドレスは実質的に隠されることになります。
ステップ10 - ファイアウォールを設定する
OpenVPNをインストールおよび設定しましたが、クライアントトラフィックの受信を処理するようには設定していません。このためにファイアウォールを構成する必要があります。
まず、あなたのfirewalldファイアウォールのアクティブゾーンをチェックしてください。
sudo firewall-cmd --get-active-zones
あなたは同様の出力を受け取るでしょう。
public
interfaces: eth0 eth1
tun0インターフェースがtrustedゾーンとして表示されない場合、サーバーをそのゾーンに追加するために以下のコマンドを実行してください。
sudo firewall-cmd --zone=trusted --add-interface=tun0
sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0
次に、OpenVPNサービスをアクティブゾーン内の許可されたサービスのリストに追加します。そして設定を永続化します。
sudo firewall-cmd --permanent --add-service openvpn
sudo firewall-cmd --permanent --zone=trusted --add-service openvpn
変更を適用するためにファイアウォールを再起動してください。
sudo firewall-cmd --reload
OpenVPNサービスが追加されたことを確認してください。
sudo firewall-cmd --list-services --zone=trusted
openvpn
次に、ファイアウォールにマスカレードルールを追加する必要があります。これにより、OpenVPNサーバーはクライアントのアドレスをサーバーの公開アドレスに変換し、次にクライアントに送信されるトラフィックについて逆の処理を行うことができます。このプロセスはネットワークアドレス変換(NAT)とも呼ばれます。
次のコマンドで仮面舞踏会のルールを追加してください。
sudo firewall-cmd --add-masquerade
sudo firewall-cmd --add-masquerade --permanent
仮面舞踏会が正しく追加されたことを確認してください。
sudo firewall-cmd --query-masquerade
yes
最後に、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
最後に、上記で設定したOpenVPNのポートを開いてください。
sudo firewall-cmd --permanent --add-port=443/tcp
変更を適用するためにファイアウォールを再起動してください。
sudo firewall-cmd --reload
ステップ11 - OpenVPNを開始する
ブート時にOpenVPNサービスを開始するように設定します。
sudo systemctl -f enable [email
OpenVPNサービスを開始します。
sudo systemctl start [email
サービスの状態を確認してください。
sudo systemctl status [email
あなたは同様の出力を受け取るでしょう。
? [email - OpenVPN service for server
Loaded: loaded (/usr/lib/systemd/system/[email ; enabled; vendor preset: disabled)
Active: active (running) since Tue 2023-02-07 02:09:36 UTC; 13s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 4789 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 4443)
Memory: 1.7M
CPU: 21ms
CGroup: /system.slice/system-openvpn\x2dserver.slice/[email
??4789 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --cipher AES-256-GCM --data-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC:BF-CBC --config server.conf
Feb 07 02:09:36 openvpn-server openvpn[4789]: Listening for incoming TCP connection on [AF_INET][undef]:443
Feb 07 02:09:36 openvpn-server openvpn[4789]: TCPv4_SERVER link local (bound): [AF_INET][undef]:443
Feb 07 02:09:36 openvpn-server openvpn[4789]: TCPv4_SERVER link remote: [AF_UNSPEC]
Feb 07 02:09:36 openvpn-server openvpn[4789]: GID set to nobody
Feb 07 02:09:36 openvpn-server openvpn[4789]: UID set to nobody
Feb 07 02:09:36 openvpn-server openvpn[4789]: MULTI: multi_init called, r=256 v=256
Feb 07 02:09:36 openvpn-server openvpn[4789]: IFCONFIG POOL IPv4: base=10.8.0.4 size=62
Feb 07 02:09:36 openvpn-server openvpn[4789]: IFCONFIG POOL LIST
Feb 07 02:09:36 openvpn-server openvpn[4789]: MULTI: TCP INIT maxclients=1024 maxevents=1028
Feb 07 02:09:36 openvpn-server openvpn[4789]: Initialization Sequence Completed
ステップ12 - クライアント構成を作成する
クライアントをテストする前に、使用するクライアントのための設定ファイルを作成する必要があります。クライアント設定ファイルを保存するためのディレクトリを作成してください。
mkdir -p ~/client-configs/files
サンプルクライアント設定ファイルをディレクトリにコピーしてください。
cp /usr/share/doc/openvpn/sample/sample-config-files/client.conf ~/client-configs/base.conf
設定ファイルを編集のために開いてください。
nano ~/client-configs/base.conf
リモートディレクティブを見つけて、あなたのOpenVPNサーバーの公開IPアドレスを指すように設定してください。また、ポートを前に選択したポートに一致するように変更してください。
. . .
The hostname/IP and port of the server.
You can have multiple remote entries
to load balance between the servers.
remote your_server_ip 443
. . .
先ほど選んだプロトコルを設定してください。
proto tcp
user と group のディレクティブの前にあるセミコロンを削除してコメントを外します。
Downgrade privileges after initialization (non-Windows only)
user nobody
group nobody
以下の ca、cert、および key ディレクティブを見つけ、それらの前にセミコロンを置いてコメントアウトしてください。これは、クライアント設定ファイル内に証明書と鍵を追加するためです。
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を追加しますので。
If a tls-auth key is used on the server
then every client must also have the key.
;tls-auth ta.key 1
Cipher と Auth の設定を、/etc/openvpn/server/server.conf ファイルで設定した内容に一致させてください。
cipher AES-256-GCM
auth SHA256
key-direction ディレクティブを追加し、VPNが正しく機能するように 1 に設定してください。
key-direction 1
関連する証明書、キー、および暗号化ファイルを使用して基本構成をコンパイルするスクリプトを作成し、生成された構成ファイルを~/client-configs/filesディレクトリにコピーします。
ディレクトリ~/client-configs内にファイルmake_config.shを作成して開いてください。
nano ~/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
Ctrl + X を押してファイルを保存し、促されたらYと入力します。
ファイルを実行可能にし、それに対する権限を制限してください。
chmod 700 ~/client-configs/make_config.sh
このスクリプトは base.conf ファイルのコピーを作成し、すべての証明書とキーのファイルを収集し、それらの内容を抽出してベース設定ファイルに追加し、それらをエクスポートして新しいクライアント設定ファイルを作成します。新しいクライアントを追加するたびに、そのための新しいキーと証明書を生成し、このスクリプトを実行してクライアント設定ファイルを作成する必要があります。
ステップ7でクライアント証明書とキーファイルをすでに作成しました。同じものの設定ファイルを作成しましょう。
~/client-configsディレクトリに切り替えます。
cd ~/client-configs
スクリプトを実行してクライアント構成ファイルを作成してください。
./make_config.sh client1
これにより client1.ovpn という名前のファイルが作成されます。異なるファイル名にしたい場合は、パラメータを変更してください。ディレクトリの内容を確認してください。
ls ~/client-configs/files
client1.ovpn
これはクライアントに転送する必要がある設定ファイルであり、その後OpenVPNサーバーに接続するために使用されます。任意のSFTPプロトコル/プログラムを使用して、ファイルをクライアントに転送できます。
ステップ13 - クライアント接続のインストールとテスト
私たちのチュートリアルでは、Rocky Linux 9 クライアントマシンを使用しています。次のコマンドで OpenVPN をインストールします。
sudo dnf install openvpn
次のコマンドを実行して、クライアントをVPNサーバーに接続します。
sudo openvpn --config client1.ovpn
あなたは同様の出力を得るべきです。
2023-02-07 11:42:05 OpenVPN 2.5.8 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Nov 1 2022
2023-02-07 11:42:05 library versions: OpenSSL 3.0.1 14 Dec 2021, LZO 2.10
2023-02-07 11:42:05 Outgoing Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
2023-02-07 11:42:05 Outgoing Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
2023-02-07 11:42:05 Incoming Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
2023-02-07 11:42:05 Incoming Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
2023-02-07 11:42:05 TCP/UDP: Preserving recently used remote address: [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 Socket Buffers: R=[131072->131072] S=[16384->16384]
2023-02-07 11:42:05 Attempting to establish TCP connection with [AF_INET]142.93.225.189:443 [nonblock]
2023-02-07 11:42:05 TCP connection established with [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 TCP_CLIENT link local: (not bound)
2023-02-07 11:42:05 TCP_CLIENT link remote: [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
2023-02-07 11:42:05 TLS: Initial packet from [AF_INET]142.93.225.189:443, sid=7c9feddd a75e1d1f
2023-02-07 11:42:06 VERIFY OK: depth=1, CN=Easy-RSA CA
2023-02-07 11:42:06 VERIFY KU OK
2023-02-07 11:42:06 Validating certificate extended key usage
2023-02-07 11:42:06 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
2023-02-07 11:42:06 VERIFY EKU OK
2023-02-07 11:42:06 VERIFY OK: depth=0, CN=server
2023-02-07 11:42:06 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bit RSA, signature: RSA-SHA256
2023-02-07 11:42:06 [server] Peer Connection Initiated with [AF_INET]142.93.225.189:443
2023-02-07 11:42:06 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 208.67.222.222,dhcp-option DNS 208.67.220.220,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM'
2023-02-07 11:42:06 OPTIONS IMPORT: timers and/or timeouts modified
2023-02-07 11:42:06 OPTIONS IMPORT: --ifconfig/up options modified
2023-02-07 11:42:06 OPTIONS IMPORT: route options modified
2023-02-07 11:42:06 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
2023-02-07 11:42:06 OPTIONS IMPORT: peer-id set
2023-02-07 11:42:06 OPTIONS IMPORT: adjusting link_mtu to 1626
2023-02-07 11:42:06 OPTIONS IMPORT: data channel crypto options modified
2023-02-07 11:42:06 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2023-02-07 11:42:06 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2023-02-07 11:42:06 net_route_v4_best_gw query: dst 0.0.0.0
2023-02-07 11:42:06 net_route_v4_best_gw result: via 10.0.2.2 dev enp0s3
2023-02-07 11:42:06 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:fd:d4:94
2023-02-07 11:42:06 TUN/TAP device tun0 opened
2023-02-07 11:42:06 net_iface_mtu_set: mtu 1500 for tun0
2023-02-07 11:42:06 net_iface_up: set tun0 up
2023-02-07 11:42:06 net_addr_ptp_v4_add: 10.8.0.6 peer 10.8.0.5 dev tun0
2023-02-07 11:42:06 net_route_v4_add: 142.93.225.189/32 via 10.0.2.2 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 0.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 128.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 10.8.0.1/32 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 GID set to nobody
2023-02-07 11:42:06 UID set to nobody
2023-02-07 11:42:06 Initialization Sequence Completed
ブラウザでURL https://whatismyip.com にアクセスすることで、接続を確認できます。そこで、自分のIPアドレスとOpenVPNサーバーの場所を見ることができます。
さらに、https://www.dnsleaktest.com/のウェブサイトで標準テストを実施することによって、さらに確認することもできます。
以前に構成したOpenDNSのホスト名と、サーバーの場所がOpenVPNサーバーの場所と一致していることが確認できます。
上記のコマンドはOpenVPNをフォアグラウンドで実行します。つまり、ターミナルがブロックされることを意味します。接続を閉じるには、Ctrl + Cを押す必要があります。ただし、OpenVPNをバックグラウンドで実行することもできます。それを実行するには、以下のコマンドを使用してください。
sudo openvpn --config client1.ovpn --daemon
接続を終了するには、プロセスのプロセスIDを見つけてください。
ps aux | grep openvpn
あなたは同様の出力を得るでしょう。
nobody 4357 0.3 0.0 13468 8432 ? Ss 15:35 0:00 openvpn --config client1.ovpn --daemon
username 4406 0.0 0.0 17732 2432 pts/0 S+ 15:35 0:00 grep --color=auto openvpn
ご覧のように、OpenVPNプロセスに対応するプロセスIDは4357です。プロセスを終了させるために、次のコマンドを使用してVPN接続を切断してください。
sudo kill -9 4357
OpenVPNは、Windows、macOS、Android、iOSプラットフォーム向けのGUIクライアントを提供しており、クライアント設定ファイルをインポートして接続することができます。
ステップ14 - クライアント証明書の取り消し
クライアントの証明書を取り消してアクセスを防ぎたい場合は、CAサーバーにログインすることでそれを行うことができます。
~/easy-rsaディレクトリに移動します。
cd ~/easy-rsa
クライアント名の後にrevokeオプションを付けてスクリプトを実行してください。
./easyrsa revoke client1
証明書を取り消すかどうかの確認が表示されます。
Please confirm you wish to revoke the certificate with the following subject:
subject=
commonName = client1
Type the word 'yes' to continue, or any other input to abort.
Continue with revocation: yes
. . .
Revoking Certificate 8348B3F146A765581946040D5C4D590A
. . .
これによりCAサーバーで証明書が無効になります。しかし、OpenVPNサーバーには無効状態を確認する方法がありません。そのためには、証明書失効リスト(CRL)を生成し、それをOpenVPNサーバーに転送する必要があります。
CRLを生成してください。
./easyrsa gen-crl
CAのパスフレーズを求められます。上記のコマンドはcrl.pemファイルを生成します。
このファイルをOpenVPNサーバーにコピーしてください。
scp ~/easy-rsa/pki/crl.pem username@your_server_ip:/tmp
OpenVPNサーバーに再ログインし、CRLファイルを/etc/openvpn/serverディレクトリにコピーします。
sudo cp /tmp/crl.pem /etc/openvpn/server/
OpenVPNサーバーの設定ファイルを編集するために開いてください。
sudo nano /etc/openvpn/server/server.conf
ファイルの一番下に次の行を追加します。これは、制限されたクライアントのためにOpenVPNサーバーに無効リストを確認するよう指示します。
crl-verify crl.pem
Ctrl + X を押してファイルを保存し、促されたらYと入力します。
変更を適用するためにOpenVPNサーバーを再起動してください。
sudo systemctl restart [email
クライアントはもはやOpenVPNサーバーに接続できません。
結論
これで、Rocky Linux 9サーバーにOpenVPNサーバーをインストールして構成するチュートリアルは終了です。また、OpenVPN Linuxクライアントをサーバーに接続しました。質問がある場合は、下のコメントに投稿してください。

