Ubuntu 20.04 Focal Fossaは、最も使用されているLinuxディストリビューションの1つを長期的にサポートする最後の製品です。このチュートリアルでは、このオペレーティングシステムを使用してOpenVPNサーバーを作成する方法と、.ovpn
を作成する方法を説明します。 クライアントマシンから接続するために使用するファイル。
このチュートリアルでは、次のことを学びます。
- 認証局を生成する方法
- サーバーとクライアントの証明書とキーを生成する方法
- 認証局で証明書に署名する方法
- Diffie-Hellmanパラメーターを作成する方法
- tls-authキーを生成する方法
- OpenVPNサーバーを構成する方法
- VPNに接続するための.ovpnファイルを生成する方法
使用されるソフトウェア要件と規則
カテゴリ | 使用する要件、規則、またはソフトウェアバージョン |
---|---|
Ubuntu 20.04 Focal Fossa | |
openvpn、ufw、easy-rsa | |
管理タスクを実行するためのルート権限 | |
# –指定されたLinuxコマンドは、rootユーザーとして直接、またはsudo を使用して、root権限で実行する必要があります。 コマンド$ –特定のLinuxコマンドを通常の非特権ユーザーとして実行する必要があります |
シナリオの設定
実際のVPN構成に進む前に、このチュートリアルで採用する規則とセットアップについて説明しましょう。
2台のマシンを使用します。どちらもUbuntu20.04 Focal Fossaを搭載しています。 。最初のもの、camachine
認証局をホストするために使用されます; 2番目のopenvpnmachine
実際のVPNとして設定するものになります サーバ。両方の目的で同じマシンを使用することは可能ですが、サーバーに違反している人が認証局に「なりすまして」、それを使用して不要な証明書に署名する可能性があるため、安全性は低くなります(この問題は、複数のサーバーを使用することを計画している場合、または他の目的で同じCAを使用することを計画している場合)。あるマシンと別のマシン間でファイルを移動するには、scp
を使用します (セキュアコピー)コマンド。実行する10の主な手順は次のとおりです。
- 認証局の生成;
- サーバーキーと証明書リクエストの生成;
- CAを使用したサーバー証明書要求の署名;
- サーバーでのDiffie-Hellmanパラメーターの生成;
- サーバーでのtls-authキーの生成;
- OpenVPN構成;
- サーバー上のネットワークとファイアウォール(ufw)の構成;
- クライアントキーと証明書リクエストの生成;
- CAを使用したクライアント証明書の署名;
- VPNへの接続に使用されるクライアント.ovpnファイルの作成。
ステップ1-認証局(CA)の生成
私たちの旅の最初のステップは、認証局の作成です。 専用機で。非特権ユーザーとして、必要なファイルを生成します。開始する前に、easy-rsa
をインストールする必要があります パッケージ:
$ sudo apt-get update &&sudo apt-get -y install easy-rsa
パッケージがインストールされていると、make-cadir
を使用できます。 必要なツールと構成ファイルを含むディレクトリを生成するコマンド。この場合は、certificate_authority
と呼びます。 。作成したら、その中を移動します:
$ make-cadircertificate_authority &&cdcertificate_authority
ディレクトリ内に、vars
というファイルがあります。 。このファイルでは、証明書の生成に使用されるいくつかの変数を定義できます。これらの変数のコメント付きセットは、91
行にあります。 96
へ 。コメントを削除して適切な値を割り当てるだけです:
set_var EASYRSA_REQ_COUNTRY "US" set_var EASYRSA_REQ_PROVINCE "California" set_var EASYRSA_REQ_CITY "San Francisco" set_var EASYRSA_REQ_ORG "Copyleft Certificate Co" set_var EASYRSA_REQ_EMAIL "[email protected]"変更が保存されたら、続行して PKIを生成できます (公開鍵インフラストラクチャ)、次のコマンドを使用して、
pki
というディレクトリを作成します :$ ./easyrsa init-pkiインフラストラクチャが整ったら、CAキーと証明書を生成できます。以下のコマンドを起動すると、パスフレーズを入力するように求められます caキーの場合 。当局とやり取りするたびに、同じパスワードを提供する必要があります。 一般名 証明書も提供する必要があります。これは任意の値にすることができます。プロンプトでEnterキーを押すだけで、デフォルトのものが使用されます。この場合は
Easy-RSA CA
:$ ./easyrsa build-caコマンドの出力は次のとおりです。
注:Easy-RSA構成の使用元:./ varsSSLの使用:openssl OpenSSL 1.1.1d 2019年9月10日新しいCAキーパスフレーズの再入力:新しいCAキーパスフレーズの再入力:RSA秘密キーの生成、長さ2048ビット(2プライム) )..........+++++.................................。 .................................. +++++ eは65537(0x010001)ロードできません/ home / egdoc / authentication_authority / pki / .rnd into RNG140296362980608:error:2406F079:random number generator:RAND_load_file:Cannot open file:../ crypto / rand / randfile.c:98:Filename =/ home / egdoc / authentication_authority / pki /.rnd証明書要求に組み込まれる情報の入力を求められます。入力しようとしているのは、識別名またはDNと呼ばれるものです。かなりの数のフィールドがありますが、一部のフィールドは空白のままにすることができます。デフォルト値があります。「。」を入力すると、フィールドは空白のままになります。-----共通名(例:ユーザー、ホスト、またはサーバー名)[Easy-RSA CA]:CAの作成が完了しましたこれで、インポートしてs証明書リクエストを点火します。公開用の新しいCA証明書ファイルは次の場所にあります:/home/egdoc/certificate_authority/pki/ca.crt
build-ca
コマンドは2つのファイルを生成しました。作業ディレクトリを基準にしたパスは次のとおりです。
- pki / ca.crt
- pki / private / ca.key
1つ目は公開証明書で、2つ目はサーバーとクライアントの証明書に署名するために使用されるキーであるため、可能な限り安全に保管する必要があります。
先に進む前に、少し注意してください。コマンドの出力で、エラーメッセージに気付いたかもしれません。エラーは強力ではありませんが、回避するための回避策は、openssl-easyrsa.cnf
の3行目にコメントを付けることです。 生成された作業ディレクトリ内にあるファイル。この問題は、opensslgithubリポジトリで説明されています。変更後、ファイルは次のようになります。
#Easy-RSA3.1およびOpenSSLまたはLibreSSLRANDFILE=$ ENV ::EASYRSA_PKI/.rndで使用
そうは言っても、OpenVPNサーバーとして使用するマシンに移動して、サーバーキーと証明書を生成しましょう。
ステップ2–サーバーキーと証明書要求の生成
このステップでは、認証局によって署名されるサーバーキーと証明書要求を生成します。 OpenVPNサーバーとして使用するマシンに、openvpn
をインストールする必要があります 、easy-rsa
およびufw
パッケージ:
$ sudo apt-get update &&sudo apt-get -y install openvpn easy-rsa ufw
サーバーキーと証明書要求を生成するために、認証局をホストしているマシンで使用したのと同じ手順を実行します。
-
make-cadir
を使用して作業ディレクトリを生成します コマンドを実行し、その中を移動します。 -
vars
に含まれる変数を設定します 証明書に使用されるファイル。 -
./easyrsa init-pki
を使用して公開鍵インフラストラクチャを生成します コマンド。
これらの準備手順の後、コマンドを発行してサーバー証明書とキーファイルを生成できます。
$ ./easyrsa gen-req server nopass
今回はnopass
を使用したので オプションの場合、サーバーキーの生成中にパスワードの挿入を求めるプロンプトは表示されません。 。 一般名の入力を引き続き求められます サーバー証明書の場合 。この場合、使用されるデフォルト値はserver
です。 。これがこのチュートリアルで使用するものです:
注:Easy-RSA構成の使用元:./ vars SSLの使用:openssl OpenSSL1.1.1d2019年9月10日RSA秘密鍵の生成....................+ ++++.................+++++新しい秘密鍵を'/home/egdoc/openvpnserver/pki/private/server.key.9rU3WfZMbW'に書き込む- ----証明書要求に組み込まれる情報の入力を求められます。入力しようとしているのは、識別名またはDNと呼ばれるものです。かなりの数のフィールドがありますが、空白のままにすることができます。一部のフィールドにはデフォルト値があります。「。」を入力すると、フィールドは空白のままになります。-----共通名(例:ユーザー、ホスト、またはサーバー名)[サーバー]:キーペアと証明書の要求完了しました。ファイルは次のとおりです。req:/home/egdoc/openvpnserver/pki/reqs/server.reqkey:/home/egdoc/openvpnserver/pki/private/server.key
証明書署名要求 および秘密鍵 生成されます:
-
/home/egdoc/openvpnserver/pki/reqs/server.req
-
/home/egdoc/openvpnserver/pki/private/server.key
。
キーファイルは/etc/openvpn
内に移動する必要があります ディレクトリ:
$ sudo mv pki / private / server.key /etc/openvpn
代わりに、証明書要求を認証局のマシンに送信して署名する必要があります。 scp
を使用できます ファイルを転送するコマンド:
$ scp pki / reqs / server.req egdoc @ camachine:/ home / egdoc /
camachine
に戻りましょう 証明書を承認します。
ステップ3–CAを使用したサーバー証明書への署名
認証局のマシンでは、前の手順でコピーしたファイルが$HOME
にあります。 ユーザーのディレクトリ:
$ ls〜certificate_authority server.req
最初に行うことは、証明書要求をインポートすることです。タスクを実行するには、import-req
を使用します easyrsa
のアクション 脚本。その構文は次のとおりです。
import-req
私たちの場合、これは次のように解釈されます:
$ ./easyrsa import-req〜/ server.req server
このコマンドは、次の出力を生成します。
注:Easy-RSA構成の使用元:./ varsSSLの使用:openssl OpenSSL 1.1.1d 2019年9月10日リクエストは、serverという短い名前で正常にインポートされました。この名前を使用して、このリクエストの署名操作を実行できます。
リクエストに署名するには、sing-req
を使用します アクション。最初の引数(この場合はサーバー)としてリクエストのタイプを受け取り、short_basename
前のコマンド(サーバー)で使用しました。実行します:
$./easyrsasign-reqサーバーサーバー
証明書に署名することを確認し、認証局のキーに使用したパスワードを提供するように求められます。すべてが期待どおりに進むと、証明書が作成されます:
注:Easy-RSA構成の使用元:./ varsSSLの使用:openssl OpenSSL 1.1.1d 2019年9月10日次の証明書に署名しようとしています。正確性については、以下に示す詳細を確認してください。このリクエストは暗号的に検証されていないことに注意してください。信頼できるソースからのものであるか、送信者にリクエストのチェックサムを確認したことを確認してください。リクエストの件名、サーバー証明書として1080日間署名する:subject =commonName =serverType単語「yes」を続行するには、またはその他中止する入力。要求の詳細を確認します。yes/home/egdoc/certificate_authority/pki/safessl-easyrsa.cnfからの構成を使用します。/home/egdoc/certificate_authority/pki/private/ca.keyのパスフレーズを入力します。は次のとおりですcommonName:ASN.1 12:'server'証明書は3月20日まで認証されます02:12:082023 GMT(1080日)1つの新しいエントリでデータベースを書き出しますデータベースUpdatedCertificateは次の場所に作成されます:/ home / egdoc / certificate_authority / pki / issued / server.crt
これで、以前に転送したリクエストファイルをopenvpnmachine
から削除できます。 。生成された証明書をOpenVPNにコピーして戻します サーバーとCA公開証明書:
$ rm〜/ server.req $ scp pki / {ca.crt、issued / server.crt} egdoc @ openvpnmachine:/ home / egdoc
openvpnmachine
に戻ります ホームディレクトリにファイルがあります。これで、それらを/etc/openvpn
に移動できます。 :
$ sudo mv〜/ {ca.crt、server.crt} / etc / openvpn
ステップ4–Diffie-Hellmanパラメーターの生成
次のステップは、ディフィーヘルマンの生成です。 パラメーター。 ディフィーヘルマン 鍵交換は、公開された安全でないチャネルを介して暗号鍵を転送するために使用される方法です。キーを生成するコマンドは次のとおりです(完了するまでに時間がかかる場合があります):
$ ./easyrsa gen-dh
キーはpki
内に生成されます dh.pem
としてのディレクトリ 。 /etc/openvpn
に移動しましょう dh2048.pem
として :
$ sudo mv pki / dh.pem /etc/openvpn/dh2048.pem
ステップ5– tls-authキー(ta.key)の生成
セキュリティを向上させるために、 OpenVPN tls-authを実装します 。公式ドキュメントの引用:
tls-authディレクティブは、整合性検証のためにすべてのSSL/TLSハンドシェイクパケットに追加のHMAC署名を追加します。正しいHMAC署名を持たないUDPパケットは、それ以上処理せずにドロップできます。 tls-auth HMAC署名は、SSL/TLSによって提供されるセキュリティを超える追加レベルのセキュリティを提供します。次のことから保護できます。
– OpenVPNUDPポートでのDoS攻撃またはポートフラッディング。
–どのサーバーUDPポートがリスニング状態にあるかを判断するためのポートスキャン。
–バッファオーバーフローの脆弱性SSL /TLSの実装。
–許可されていないマシンからのSSL / TLSハンドシェイクの開始(このようなハンドシェイクは最終的に認証に失敗しますが、tls-authははるかに早い時点でそれらを遮断できます)。
tls_authキーを生成するには、次のコマンドを実行できます。
$ openvpn --genkey --secret ta.key
生成されたら、ta.key
を移動します /etc/openvpn
へのファイル :
$ sudo mv ta.key / etc / openvpn
これでサーバーキーの設定は完了です。実際のサーバー構成に進むことができます。
ステップ6–OpenVPN構成
OpenVPN構成ファイルは、デフォルトでは/etc/openvpn
内に存在しません 。生成するには、openvpn
に付属しているテンプレートを使用します パッケージ。次のコマンドを実行してみましょう:
$ zcat \ /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz \ | sudo tee /etc/openvpn/server.conf> / dev / null
これで、/etc/openvpn/server.conf
を編集できます ファイル。関連する部品を以下に示します。最初に実行したいのは、参照されているキーと証明書の名前が、生成したものと一致していることを確認することです。このチュートリアルに従った場合は、間違いなく当てはまるはずです(78-80
行 および85
):
ca ca.crtcert server.crtkey server.key#このファイルは秘密にしておく必要がありますdh2048.pem
OpenVPNデーモンを低い権限で実行したいnobody
ユーザーとnogroup
グループ。構成ファイルの関連部分は、274
行にあります。 および275
。先頭の;
を削除する必要があります :
user nobodygroup nogroup
コメントを削除したいもう1つの行は、192
です。 。これにより、すべてのクライアントがVPNを介してデフォルトゲートウェイをリダイレクトします。
「redirect-gatewaydef1bypass-dhcp」をプッシュします
行200
および201
toを使用して、サーバーが特定のDNSサーバーをクライアントにプッシュできるようにすることもできます。構成ファイルにあるものは、opendns.com
によって提供されたものです。 :
push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220"
この時点で、/etc/openvpn
ディレクトリには、生成した次のファイルが含まれている必要があります:
/etc/openvpn├──ca.crt├──dh2048.pem├──server.conf├──server.crt├──server.key└──ta.key
それらがすべてrootによって所有されていることを確認しましょう:
$ sudo chown -R root:root / etc / openvpn
次のステップであるネットワークオプションの構成に進むことができます。
ステップ7–ネットワークとufwのセットアップ
VPNを機能させるには、IP転送を有効にする必要があります 私たちのサーバー上。これを行うには、28
行のコメントを解除します。 /etc/sysctl.conf
から ファイル:
#次の行のコメントを解除して、IPv4net.ipv4.ip_forward=1のパケット転送を有効にします
設定を再読み込みするには:
$ sudo sysctl -p
また、/etc/default/ufw
を変更するufwファイアウォールでのパケット転送を許可する必要があります ファイル、およびDEFAULT_FORWARD_POLICY
の変更 DROP
から ACCEPT
へ (19
行 ):
#デフォルトの転送ポリシーをACCEPT、DROP、またはREJECTに設定します。 #これを変更する場合は、ルールを調整する必要があることに注意してくださいDEFAULT_FORWARD_POLICY ="ACCEPT"
ここで、/etc/ufw/before.rules
の先頭に次のルールを追加する必要があります。 ファイル。ここでは、接続に使用されるインターフェースがeth0
であると想定しています。 :
* nat:POSTROUTING ACCEPT [0:0]-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADECOMMIT
最後に、openvpn
の着信トラフィックを許可する必要があります ufwファイアウォールマネージャーのサービス:
$ sudo ufw allow openvpn
この時点で、変更を適用するためにufwを再起動できます。この時点でファイアウォールが有効になっていない場合は、ssh
を確認してください。 サービスは常に許可されています。許可されていない場合、リモートで作業していると切断される可能性があります。
$ sudo ufw disable &&sudo ufw enable
これで、起動時にopenvpn.serviceを起動して有効にできます:
$ sudo systemctl restart openvpn &&sudo systemctl enable openvpn
ステップ8–クライアントキーと証明書要求の生成
これでサーバーのセットアップは完了です。次のステップは、クライアントキーと証明書要求の生成です。手順はサーバーで使用したものと同じです。名前として「サーバー」ではなく「クライアント」を使用し、キーと証明書要求を生成してから、後者をCAマシンに渡して署名します。
$ ./easyrsa gen-req client nopass
以前と同様に、一般名の入力を求められます。次のファイルが生成されます:
- /home/egdoc/openvpnserver/pki/reqs/client.req
- /home/egdoc/openvpnserver/pki/private/client.key
client.req
をコピーしましょう CAマシンへ:
$ scp pki / reqs / client.req egdoc @ camachine:/ home / egdoc
ファイルがコピーされたら、camachine
、リクエストをインポートします:
$ ./easyrsa import-req〜/ client.req client
次に、証明書に署名します:
$./easyrsasign-reqクライアントクライアント
CAパスワードを入力すると、証明書はpki/issued/client.crt
として作成されます。 。リクエストファイルを削除して、署名された証明書をVPNサーバーにコピーして戻しましょう。
$ rm〜/ client.req $ scp pki / issued / client.crt egdoc @ openvpnmachine:/ home / egdoc
便宜上、すべてのクライアント関連のものを保持するディレクトリを作成し、その中にクライアントキーと証明書を移動しましょう:
$ mkdir〜/ client $ mv〜/ client.crt pki / private / client.key〜/ client
よし、もうすぐそこにいる。次に、クライアント構成テンプレート/usr/share/doc/openvpn/examples/sample-config-files/client.conf
をコピーする必要があります。 ~/client
内 ディレクトリを作成し、ニーズに合わせて変更します:
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf〜/ client
ファイル内で変更する必要のある行は次のとおりです。 42
の行 my-server-1
の代わりに実際のサーバーのIPまたはホスト名を入力します :
remote my-server-1 1194
61
行 および62
先頭の;
を削除します 初期化後に特権をダウングレードする文字:
user nobodygroup nogroup
88
行 90
へ および108
CA証明書、クライアント証明書、クライアントキー、およびtls-authキーが参照されていることがわかります。ファイルの実際のコンテンツを専用の「タグ」のペアの間に配置するため、これらの行にコメントを付けたいと思います。
-
<ca></ca>
CA証明書の場合 -
<cert></cert>
クライアント証明書用 -
<key></key>
クライアントキー用 -
<tls-auth></tls-auth>
tls-authキーの場合
行にコメントが付けられたら、ファイルの下部に次のコンテンツを追加します。
#ここにca.crtファイルの内容が表示されます #ここにclient.crtファイルの内容が表示されます #ここにクライアントの内容が表示されます.key file key-direction 1#ta.keyファイルの内容は次のとおりです
ファイルの編集が終了したら、名前を.ovpn
に変更します。 接尾辞:
$ mv〜/ client / client.conf〜/ client / client.ovpn
あとは、クライアントアプリケーションにファイルをインポートして、VPNに接続するだけです。たとえば、GNOMEデスクトップ環境を使用している場合は、ネットワークからファイルをインポートできます。 コントロールパネルのセクション。 VPNセクションで、+
をクリックするだけです。 ボタンをクリックし、[ファイルからインポート]をクリックして、以前にクライアントマシンに転送した「.ovpn」ファイルを選択してインポートします。
.ovpnファイルをインポートするためのGNOMEインターフェース
結論
このチュートリアルでは、動作するOpenVPNセットアップを作成する方法を説明しました。認証局を生成し、対応するキーとともに生成したサーバー証明書とクライアント証明書に署名するために使用しました。サーバーを構成する方法とネットワークをセットアップする方法、パケット転送を許可する方法、およびufwファイアウォール構成に必要な変更を実行する方法を見ました。最後に、クライアント .ovpnを生成する方法を確認しました VPNに簡単に接続するためにクライアントアプリケーションからインポートできるファイル。お楽しみください!