前書き

仮想プライベートネットワーク(VPN)を使用すると、コーヒーショップ、会議、空港などの信頼できないネットワークを通過するトラフィックを安全に暗号化できます。

IKEv2、またはInternet Key Exchange v2は、サーバーとクライアント間の直接IPSecトンネリングを可能にするプロトコルです。 IKEv2 VPN実装では、IPSecはネットワークトラフィックの暗号化を提供します。 IKEv2は一部のプラットフォーム(OS X 10.11以降、iOS 9.1以降、およびWindows 10)でネイティブにサポートされ、追加のアプリケーションは不要であり、クライアントのしゃっくりを非常にスムーズに処理します。

このチュートリアルでは、Ubuntu 18.04サーバーでhttps://www.strongswan.org/[StrongSwan]を使用してIKEv2 VPNサーバーをセットアップし、Windows、macOS、Ubuntu、iOS、Androidクライアントから接続します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • 「+ sudo +」を含むhttps://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04[Ubuntu 18.04初期サーバーセットアップガイド]に従って構成された1つのUbuntu 18.04サーバー非rootユーザーとファイアウォール。

ステップ1-StrongSwanのインストール

まず、VPNサーバーとして構成するオープンソースのIPSecデーモンであるStrongSwanをインストールします。 また、インフラストラクチャの資格情報を提供する認証局を作成できるように、公開キーインフラストラクチャコンポーネントもインストールします。

次のように入力して、ローカルパッケージキャッシュを更新し、ソフトウェアをインストールします。

sudo apt update
sudo apt install strongswan strongswan-pki

すべてがインストールされたので、証明書の作成に進みましょう。

ステップ2-認証局の作成

IKEv2サーバーには、クライアントに対して自身を識別するための証明書が必要です。 必要な証明書を作成しやすくするために、 `+ strongswan-pki `パッケージには認証局とサーバー証明書を生成するユーティリティが付属しています。 まず、作業するすべてのアセットを保存するためのディレクトリをいくつか作成します。 ディレクトリ構造は、 ` / etc / ipsec.d +`のディレクトリの一部と一致します。ここで、作成するすべてのアイテムを最終的に移動します。 プライベートファイルが他のユーザーから見えないように、アクセス許可をロックダウンします。

mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki

すべてを格納するディレクトリ構造ができたので、ルートキーを生成できます。 これは、ルート認証局の署名に使用される4096ビットのRSAキーになります。

これらのコマンドを実行してキーを生成します。

ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem

キーを取得したら、キーを使用してルート証明書に署名し、ルート認証局の作成に進むことができます。

ipsec pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
   --type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem

必要に応じて、識別名(DN)の値を別の値に変更できます。 ここでの一般的な名前は単なるインジケータであるため、インフラストラクチャ内のどの名前とも一致する必要はありません。

ルート認証局を稼働させたので、VPNサーバーが使用する証明書を作成できます。

手順3-VPNサーバーの証明書の生成

次に、VPNサーバーの証明書とキーを作成します。 この証明書により、クライアントは、生成したばかりのCA証明書を使用してサーバーの信頼性を検証できます。

まず、次のコマンドを使用して、VPNサーバーの秘密キーを作成します。

ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem

次に、前の手順で作成した認証局のキーを使用して、VPNサーバー証明書を作成して署名します。 次のコマンドを実行しますが、共通名(CN)およびサブジェクトの別名(SAN)フィールドをVPNサーバーのDNS名またはIPアドレスに変更します。

ipsec pki --pub --in ~/pki/private/server-key.pem --type rsa \
   | ipsec pki --issue --lifetime 1825 \
       --cacert ~/pki/cacerts/ca-cert.pem \
       --cakey ~/pki/private/ca-key.pem \
       --dn "CN=" --san "" \
       --flag serverAuth --flag ikeIntermediate --outform pem \
   >  ~/pki/certs/server-cert.pem

StrongSwanが必要とするTLS / SSLファイルをすべて生成したので、次のように入力して、ファイルを `+ / etc / ipsec.d +`ディレクトリの所定の場所に移動できます。

sudo cp -r ~/pki/* /etc/ipsec.d/

このステップでは、クライアントとサーバー間の通信を保護するために使用される証明書ペアを作成しました。 また、CAキーで証明書に署名したため、クライアントはCA証明書を使用してVPNサーバーの信頼性を確認できます。 すべての証明書の準備ができたので、ソフトウェアの構成に進みます。

ステップ4-StrongSwanの構成

StrongSwanには、いくつかの例を含むデフォルトの構成ファイルがありますが、ほとんどの構成を自分で行う必要があります。 最初から始める前に、参照用にファイルをバックアップしましょう。

sudo mv /etc/ipsec.conf{,.original}

次のように入力して、新しい空の構成ファイルを作成して開きます。

sudo nano /etc/ipsec.conf

まず、StrongSwanに、デバッグのためにデーモンステータスを記録し、重複した接続を許可するように指示します。 これらの行をファイルに追加します。

/etc/ipsec.conf

config setup
   charondebug="ike 1, knl 1, cfg 0"
   uniqueids=no

次に、VPNの構成セクションを作成します。 また、StrongSwanにIKEv2 VPNトンネルを作成し、起動時にこの構成セクションを自動的に読み込むように指示します。 ファイルに次の行を追加します。

/etc/ipsec.conf

. . .
conn ikev2-vpn
   auto=add
   compress=no
   type=tunnel
   keyexchange=ikev2
   fragmentation=yes
   forceencaps=yes

また、クライアントが予期せず切断された場合に、「ダングリング」接続をクリアするためにデッドピア検出を設定します。 以下の行を追加してください。

/etc/ipsec.conf

. . .
conn ikev2-vpn
   . . .
   dpdaction=clear
   dpddelay=300s
   rekey=no

次に、サーバー(左側)のIPSecパラメーターを構成します。 これをファイルに追加します。

/etc/ipsec.conf

. . .
conn ikev2-vpn
   . . .
   left=%any
   leftid=
   leftcert=server-cert.pem
   leftsendcert=always
   leftsubnet=0.0.0.0/0

次に、使用するプライベートIPアドレス範囲やDNSサーバーなどのクライアント(右側)のIPSecパラメーターを構成できます。

/etc/ipsec.conf

. . .
conn ikev2-vpn
   . . .
   right=%any
   rightid=%any
   rightauth=eap-mschapv2
   rightsourceip=10.10.10.0/24
   rightdns=8.8.8.8,8.8.4.4
   rightsendcert=never

最後に、StrongSwanに、クライアントが接続するときにユーザーの資格情報を要求するように指示します。

/etc/ipsec.conf

. . .
conn ikev2-vpn
   . . .
   eap_identity=%identity

構成ファイルは次のようになります。

/etc/ipsec.conf

config setup
   charondebug="ike 1, knl 1, cfg 0"
   uniqueids=no

conn ikev2-vpn
   auto=add
   compress=no
   type=tunnel
   keyexchange=ikev2
   fragmentation=yes
   forceencaps=yes
   dpdaction=clear
   dpddelay=300s
   rekey=no
   left=%any
   leftid=
   leftcert=server-cert.pem
   leftsendcert=always
   leftsubnet=0.0.0.0/0
   right=%any
   rightid=%any
   rightauth=eap-mschapv2
   rightsourceip=10.10.10.0/24
   rightdns=8.8.8.8,8.8.4.4
   rightsendcert=never
   eap_identity=%identity

示されているように設定したことを確認したら、ファイルを保存して閉じます。

VPNパラメーターを構成したので、ユーザーがサーバーに接続できるようにアカウントの作成に進みましょう。

ステップ5-VPN認証の構成

これで、VPNサーバーはクライアント接続を受け入れるように構成されましたが、まだ資格情報が構成されていません。 `+ ipsec.secrets +`という特別な設定ファイルでいくつかの設定を行う必要があります。

  • サーバーがクライアントに対して認証できるように、サーバー証明書の秘密キーの場所をStrongSwanに伝える必要があります。

  • また、VPNへの接続を許可するユーザーのリストを設定する必要があります。

編集のために秘密ファイルを開きましょう。

sudo nano /etc/ipsec.secrets

最初に、StrongSwanに秘密鍵の場所を伝えます。

/etc/ipsec.secrets

: RSA "server-key.pem"

次に、ユーザーの資格情報を定義します。 任意のユーザー名またはパスワードの組み合わせを作成できます。

/etc/ipsec.secrets

: EAP

ファイルを保存して閉じます。 VPNパラメータの操作が完了したので、設定が適用されるようにVPNサービスを再起動します。

sudo systemctl restart strongswan

VPNサーバーがサーバーオプションとユーザー資格情報の両方で完全に構成されたので、次は最も重要な部分であるファイアウォールの構成に進みます。

ステップ6-ファイアウォールとカーネルIP転送の構成

StrongSwanの構成が完了したら、VPNトラフィックを転送して許可するようにファイアウォールを構成する必要があります。

前提条件のチュートリアルに従った場合、非常に基本的なUFWファイアウォールを有効にする必要があります。 UFWをまだ設定していない場合は、次のように入力してベースライン設定を作成し、有効にすることができます。

sudo ufw allow OpenSSH
sudo ufw enable

次に、標準のIPSecポート500および4500へのUDPトラフィックを許可するルールを追加します。

sudo ufw allow 500,4500/udp

次に、UFWの構成ファイルの1つを開き、IPSecパケットのルーティングと転送のためのいくつかの低レベルポリシーを追加します。 その前に、サーバー上のどのネットワークインターフェイスがインターネットアクセスに使用されているかを見つける必要があります。 デフォルトルートに関連付けられたインターフェイスを照会することで、それを見つけることができます。

ip route | grep default

公開インターフェースは、「dev」という語に従う必要があります。 たとえば、この結果は、以下で強調表示されている `+ eth0 +`という名前のインターフェイスを示しています。

Outputdefault via 203.0.113.7 dev  proto static

パブリックネットワークインターフェースができたら、テキストエディターで `+ / etc / ufw / before.rules`ファイルを開きます。

sudo nano /etc/ufw/before.rules

ファイルの先頭近く( `+ * filter +`行の前)に、次の構成ブロックを追加します。

/etc/ufw/before.rules

*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
. . .

上記の設定の「+ eth0 」の各インスタンスを、「 ip route 」で見つけたインターフェイス名に一致するように変更します。 ` * nat `行は、ファイアウォールがVPNクライアントとインターネット間のトラフィックを正しくルーティングおよび操作できるようにルールを作成します。 ` * mangle +`行は、パケットセグメントの最大サイズを調整して、特定のVPNクライアントでの潜在的な問題を防ぎます。

次に、 `+ * filter +`とチェーンの定義行の後に、構成のブロックをもう1つ追加します。

/etc/ufw/before.rules

. . .
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]

これらの行は、VPNクライアントが接続できるようにhttps://wiki.wireshark.org/ESP[ESP](セキュリティペイロードのカプセル化)トラフィックを転送するようにファイアウォールに指示します。 ESPは、VPNパケットが信頼できないネットワークを通過するときに追加のセキュリティを提供します。

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

ファイアウォールを再起動する前に、ネットワークカーネルパラメーターを変更して、あるインターフェイスから別のインターフェイスへのルーティングを許可します。 UFWのカーネルパラメーター構成ファイルを開きます。

sudo nano /etc/ufw/sysctl.conf

ここでいくつかの設定を行う必要があります。

  • まず、IPv4パケット転送を有効にします。

  • パケットフラグメンテーションの問題を防ぐために、パスMTUディスカバリを無効にします。

  • また、https://en.wikipedia.org/wiki/Man-in-the-middle_attack [man-in-the-middle]攻撃を防ぐために、ICMPリダイレクトを受け入れたり、ICMPリダイレクトを送信したりしません。

ファイルに加える必要がある変更は、次のコードで強調表示されています。

/etc/ufw/sysctl.conf

. . .

# Enable forwarding
# Uncomment the following line


. . .

# Do not accept ICMP redirects (prevent MITM attacks)
# Ensure the following line is set


# Do not send ICMP redirects (we are not a router)
# Add the following lines

完了したらファイルを保存します。 UFWは、次回の起動時にこれらの変更を適用します。

これで、ファイアウォールを無効にしてから再度有効にすることで、すべての変更を有効にできます。

sudo ufw disable
sudo ufw enable

プロセスの確認を求められます。 新しい設定でUFWを再度有効にするには、「+ Y +」と入力します。

ステップ7 – Windows、iOS、およびmacOSでのVPN接続のテスト

すべての設定が完了したので、試してみましょう。 最初に、作成したCA証明書をコピーして、VPNに接続するクライアントデバイスにインストールする必要があります。 これを行う最も簡単な方法は、サーバーにログインして証明書ファイルの内容を出力することです。

cat /etc/ipsec.d/cacerts/ca-cert.pem

次のような出力が表示されます。

Output-----BEGIN CERTIFICATE-----
MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE

. . .

EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
BayqOb/Q
-----END CERTIFICATE-----

`+ —– BEGIN CERTIFICATE —– `および ` —– END CERTIFICATE —– `行を含むこの出力をコンピューターにコピーし、ファイルに保存します「 ca-cert.pem 」などのわかりやすい名前を付けます。 作成するファイルの拡張子が「 .pem +」であることを確認してください。

または、https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server [SFTPを使用してコンピューターにファイルを転送する] 。

`+ ca-cert.pem +`ファイルをコンピューターにダウンロードしたら、VPNへの接続をセットアップできます。

Windowsから接続する

まず、次の手順に従ってルート証明書をインポートします。

  1. 「+ WINDOWS + R 」を押して「実行」ダイアログを表示し、「 mmc.exe +」と入力してWindows管理コンソールを起動します。

  2. *ファイル*メニューから、*スナップインの追加または削除*に移動し、利用可能なスナップインのリストから*証明書*を選択して、*追加*をクリックします。

  3. VPNをすべてのユーザーと連携させるため、[コンピューターアカウント]を選択して[次へ]をクリックします。

  4. ローカルコンピューターで設定を行っているので、*ローカルコンピューター*を選択して、*完了*をクリックします。

  5. * Console Root ノードの下で、 Certificates(Local Computer)エントリを展開し、 Trusted Root Certification Authorities を展開してから、 Certificates *エントリを選択します。
    image:https://assets.digitalocean.com/articles/ikevpn_ubuntu_1604/4PN0vT6.png [証明書ビュー]

  6. *アクション*メニューから*すべてのタスク*を選択し、*インポート*をクリックして証明書のインポートウィザードを表示します。 [次へ]をクリックして、紹介を通過します。

  7. [インポートするファイル]画面で、[参照]ボタンを押して、保存した証明書ファイルを選択します。 次に、[次へ]をクリックします。

  8. * Certificate Store Trusted Root Certification Authorities に設定されていることを確認し、 Next *をクリックします。

  9. [完了]をクリックして、証明書をインポートします。

次に、次の手順でVPNを構成します。

  1. *コントロールパネル*を起動し、*ネットワークと共有センター*に移動します。

  2. [新しい接続またはネットワークのセットアップ]をクリックし、[職場への接続]を選択します。

  3. [インターネット接続(VPN)を使用する] *を選択します。

  4. VPNサーバーの詳細を入力します。 [インターネットアドレス]フィールドにサーバーのドメイン名またはIPアドレスを入力し、VPN接続を説明する名前を[宛先名]に入力します。 次に、*完了*をクリックします。

新しいVPN接続がネットワークのリストの下に表示されます。 VPNを選択し、[接続]をクリックします。 ユーザー名とパスワードの入力を求められます。 それらを入力し、[OK]をクリックすると、接続されます。

macOSからの接続

次の手順に従って、証明書をインポートします。

  1. 証明書ファイルをダブルクリックします。 *キーチェーンアクセス*がポップアップし、「キーチェーンアクセスはシステムキーチェーンを変更しようとしています。 これを許可するにはパスワードを入力してください。」

  2. パスワードを入力して、[キーチェーンの変更]をクリックします

  3. 新しくインポートされたVPN証明書をダブルクリックします。 これにより、信頼レベルを指定できる小さなプロパティウィンドウが表示されます。 * IPセキュリティ(IPSec)*を*常に信頼する*に設定すると、パスワードの入力を求められます。 この設定は、パスワードを入力すると自動的に保存されます。

証明書が重要で信頼されたので、次の手順でVPN接続を構成します。

  1. *システム環境設定*に移動し、*ネットワーク*を選択します。

  2. ネットワークのリストの左下にある小さな「プラス」ボタンをクリックします。

  3. 表示されるポップアップで、* Interface VPN に設定し、 VPN Type IKEv2 *に設定し、接続に名前を付けます。

  4. [サーバー]および[リモートID *]フィールドに、サーバーのドメイン名またはIPアドレスを入力します。 *ローカルID *は空白のままにします。

  5. *認証設定*をクリックし、*ユーザー名*を選択して、VPNユーザー用に設定したユーザー名とパスワードを入力します。 次に、[OK]をクリックします。

最後に、[接続]をクリックしてVPNに接続します。 これで、VPNに接続されます。

Ubuntuから接続する

Ubuntuマシンから接続するには、StrongSwanをサービスとして設定および管理するか、接続するたびに1回限りのコマンドを使用します。 手順は両方に提供されます。

サービスとしてのStrongSwanの管理
  1. ローカルパッケージキャッシュを更新します: + sudo apt update

  2. StrongSwanと関連ソフトウェアをインストールします + sudo apt install strongswan libcharon-extra-plugins +

  3. CA証明書を + / etc / ipsec.d / cacerts +`ディレクトリにコピーします: `+ sudo cp / etc / ipsec.d / cacerts +

  4. StrongSwanを無効にして、VPNが自動的に起動しないようにします: + sudo systemctl disable --now strongswan +

  5. + / etc / ipsec.secrets +`ファイルでVPNユーザー名とパスワードを設定します: `+:EAP +

  6. `+ / etc / ipsec.conf +`ファイルを編集して設定を定義します。

/etc/ipsec.conf

config setup

conn ikev2-rw
   right=
   # This should match the `leftid` value on your server's configuration
   rightid=
   rightsubnet=0.0.0.0/0
   rightauth=pubkey
   leftsourceip=%config
   leftid=
   leftauth=eap-mschapv2
   eap_identity=%identity
   auto=start

VPNに接続するには、次を入力します。

sudo systemctl start strongswan

再度切断するには、次を入力します。

sudo systemctl stop strongswan
1回限りの接続に単純なクライアントを使用する
  1. ローカルパッケージキャッシュを更新します: + sudo apt update

  2. + charon-cmd +`と関連ソフトウェアをインストールします `+ sudo apt install charon-cmd libcharon-extra-plugins +

  3. CA証明書をコピーしたディレクトリに移動します: + cd <^> / path / to / ca-cert.pem +

  4. サーバーのCA証明書、VPNサーバーのIPアドレス、設定したユーザー名を使用して、 `+ charon-cmd `でVPNサーバーに接続します: ` sudo charon-cmd –cert ca-cert.pem –host –identity + `

  5. プロンプトが表示されたら、VPNユーザーのパスワードを入力します。

これで、VPNに接続されます。 切断するには、 `+ CTRL + C +`を押して、接続が閉じるのを待ちます。

iOSから接続する

iOSデバイスでVPN接続を構成するには、次の手順を実行します。

  1. ルート証明書が添付されたメールを自分に送信します。

  2. iOSデバイスで電子メールを開き、添付された証明書ファイルをタップし、[インストール]をタップしてパスコードを入力します。 インストールしたら、*完了*をタップします。

  3. 設定全般、* VPN に移動し、 VPN構成の追加*をタップします。 これにより、VPN接続構成画面が表示されます。

  4. * Type をタップし、 IKEv2 *を選択します。

  5. [説明]フィールドに、VPN接続の短い名前を入力します。 これは好きなものにすることができます。

  6. [サーバー]および[リモートID *]フィールドに、サーバーのドメイン名またはIPアドレスを入力します。 *ローカルID *フィールドは空白のままにできます。

  7. [認証]セクションにユーザー名とパスワードを入力し、[完了]をタップします。

  8. 作成したVPN接続を選択し、ページ上部のスイッチをタップすると、接続されます。

Androidから接続する

次の手順に従って、証明書をインポートします。

  1. CA証明書が添付されたメールを自分に送信します。 CA証明書をダウンロードフォルダーに保存します。

  2. Playストアからhttps://play.google.com/store/apps/details?id=org.strongswan.android&hl=en_US[StrongSwan VPNクライアント]をダウンロードします。

  3. アプリを開きます。 右上隅の*「その他」アイコン*(3つのドットのアイコン)をタップし、* CA証明書*を選択します。

  4. 右上隅の*「その他」アイコン*をもう一度タップします。 *証明書のインポート*を選択します。

  5. ダウンロードフォルダー内のCA証明書ファイルを参照して選択し、アプリにインポートします。

証明書がStrongSwanアプリにインポートされたので、次の手順でVPN接続を構成できます。

  1. アプリで、上部の[VPNプロファイルの追加]をタップします。

  2. *サーバー*にVPNサーバーのドメイン名またはパブリックIPアドレスを入力します。

  3. * IKEv2 EAP(ユーザー名/パスワード)*がVPNタイプとして選択されていることを確認してください。

  4. サーバーで定義した資格情報を*ユーザー名*および*パスワード*に入力します。

  5. * CA証明書*セクションで*自動的に選択*を選択解除し、* CA証明書を選択*をクリックします。

  6. 画面上部の[*インポート済み]タブをタップし、インポートしたCAを選択します(以前に「DN」を変更しなかった場合は、「VPNルートCA」という名前になります)。

  7. 必要に応じて、*プロファイル名(オプション)*にわかりやすい名前を入力します。

VPNに接続する場合は、StrongSwanアプリケーションで作成したばかりのプロファイルをクリックします。

接続のトラブルシューティング

証明書をインポートできない場合は、ファイルの拡張子が「+ .pem.txt 」ではなく「 .pem +」であることを確認してください。

VPNに接続できない場合は、使用したサーバー名またはIPアドレスを確認してください。 サーバーのドメイン名またはIPアドレスは、証明書の作成時に一般名(CN)として設定したものと一致する必要があります。 一致しない場合、VPN接続は機能しません。 CNが「+ vpn.example.com 」の証明書を設定する場合、VPNサーバーの詳細を入力するときに「 vpn.example.com +」を使用する必要があります。 証明書の生成に使用したコマンドと、VPN接続の作成時に使用した値を再確認してください。

最後に、VPN設定を再確認して、ドメイン名を使用している場合は、「+ leftid 」値に「 @ +」記号が設定されていることを確認します。

   leftid=vpn.example.com

また、IPアドレスを使用している場合は、「+ @ +」記号が省略されていることを確認してください。

結論

このチュートリアルでは、IKEv2プロトコルを使用するVPNサーバーを構築しました。 これで、どこにいてもオンラインアクティビティの安全性を確保できます。

ユーザーを追加または削除するには、もう一度ステップ5をご覧ください。 各行は1人のユーザー用であるため、ユーザーの追加または削除はファイルの編集と同じくらい簡単です。

StrongSwanはログをsyslogにダンプするため、ここからログファイルアナライザーのセットアップを検討することができます。 チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-install-and-use-logwatch-log-analyzer-and-reporter-on-a-vps[Logwatch Log Analyzerをインストールして使用する方法およびVPSのレポーター]には、その設定に関する詳細情報があります。

また、https://www.eff.org/wp/effs-top-12-ways-protect-your-online-privacy [オンラインプライバシーに関するEFFのこのガイド]にも興味があるかもしれません。