序章

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

IKEv2 、またはインターネットキーエクスチェンジv2は、サーバーとクライアント間の直接IPSecトンネリングを可能にするプロトコルです。 IKEv2 VPNの実装では、IPSecはネットワークトラフィックの暗号化を提供します。 IKEv2は、一部のプラットフォーム(OS X 10.11以降、iOS 9.1以降、およびWindows 10)でネイティブにサポートされており、追加のアプリケーションは必要ありません。また、クライアントの一時的な中断を非常にスムーズに処理します。

このチュートリアルでは、Ubuntu18.04サーバーでStrongSwan を使用してIKEv2VPNサーバーをセットアップし、Windows、macOS、Ubuntu、iOS、およびAndroidクライアントから接続します。

前提条件

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

ステップ1—StrongSwanをインストールする

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

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

  1. sudo apt update
  2. sudo apt install strongswan strongswan-pki

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

ステップ2—認証局を作成する

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

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

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

次のコマンドを実行して、キーを生成します。

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

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

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

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

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

ステップ3—VPNサーバーの証明書を生成する

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

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

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

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

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

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

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

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

ステップ4—StrongSwanを設定する

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

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

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

  1. 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=@server_domain_or_IP
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0

:サーバーID(leftid)を構成するときは、VPNサーバーがドメイン名で識別される場合にのみ@文字を含めてください。

    leftid=@vpn.example.com

サーバーがIPアドレスで識別される場合は、IPアドレスを次のように入力します。

    leftid=203.0.113.7

次に、使用するプライベート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=@server_domain_or_IP
    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への接続を許可されるユーザーのリストを設定する必要があります。

シークレットファイルを開いて編集しましょう。

  1. sudo nano /etc/ipsec.secrets

まず、StrongSwanに秘密鍵の場所を教えます。

/etc/ipsec.secrets
: RSA "server-key.pem"

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

/etc/ipsec.secrets
your_username : EAP "your_password"

ファイルを保存して閉じます。 VPNパラメータの操作が終了したので、VPNサービスを再起動して、構成を適用します。

  1. sudo systemctl restart strongswan

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

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

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

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

  1. sudo ufw allow OpenSSH
  2. sudo ufw enable

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

  1. sudo ufw allow 500,4500/udp

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

  1. ip route | grep default

パブリックインターフェイスは「dev」という単語の後に続く必要があります。 たとえば、この結果はeth0という名前のインターフェイスを示しており、以下で強調表示されています。

Output
default via 203.0.113.7 dev eth0 proto static

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

  1. sudo nano /etc/ufw/before.rules

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

/etc/ufw/before.rules
*nat
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
COMMIT

*mangle
-A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
COMMIT

*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]

-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT

これらの行は、VPNクライアントが接続できるように ESP (Encapsulating Security Payload)トラフィックを転送するようにファイアウォールに指示します。 ESPは、VPNパケットが信頼できないネットワークを通過するときに、VPNパケットに追加のセキュリティを提供します。

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

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

  1. sudo nano /etc/ufw/sysctl.conf

ここでいくつか設定する必要があります。

  • まず、IPv4パケット転送を有効にします。
  • パケットの断片化の問題を防ぐために、パスMTU探索を無効にします。
  • また、中間者攻撃を防ぐために、ICMPリダイレクトを受け入れたりICMPリダイレクトを送信したりすることもありません。

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

/etc/ufw/sysctl.conf

. . .

# Enable forwarding
# Uncomment the following line
net/ipv4/ip_forward=1

. . .

# Do not accept ICMP redirects (prevent MITM attacks)
# Ensure the following line is set
net/ipv4/conf/all/accept_redirects=0

# Do not send ICMP redirects (we are not a router)
# Add the following lines
net/ipv4/conf/all/send_redirects=0
net/ipv4/ip_no_pmtu_disc=1

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

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

  1. sudo ufw disable
  2. sudo ufw enable

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

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

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

  1. 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であることを確認してください。

または、SFTPを使用してファイルをコンピューターに転送します

ca-cert.pemファイルをコンピューターにダウンロードしたら、VPNへの接続を設定できます。

Windowsから接続する

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

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

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

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

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

  5. コンソールルートノードで、証明書(ローカルコンピューター)エントリを展開し、信頼されたルート証明機関を展開して、証明書を選択します。エントリ:

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

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

  8. 証明書ストア信頼されたルート証明機関に設定されていることを確認し、次へをクリックします。

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

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

  1. コントロールパネルを起動し、ネットワークと共有センターに移動します。
  2. 新しい接続またはネットワークのセットアップをクリックし、職場に接続するを選択します。
  3. インターネット接続(VPN)を使用するを選択します。
  4. VPNサーバーの詳細を入力します。 サーバーのドメイン名またはIPアドレスをインターネットアドレスフィールドに入力し、宛先名にVPN接続を説明するものを入力します。 次に、完了をクリックします。

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

macOSから接続する

証明書をインポートするには、次の手順に従います。

  1. 証明書ファイルをダブルクリックします。 Keychain Access は、「KeychainAccessがシステムキーチェーンを変更しようとしています。 これを許可するには、パスワードを入力してください。」
  2. パスワードを入力し、キーチェーンの変更をクリックします
  3. 新しくインポートしたVPN証明書をダブルクリックします。 これにより、信頼レベルを指定できる小さなプロパティウィンドウが表示されます。 IPセキュリティ(IPSec)常に信頼に設定すると、パスワードの入力を再度求められます。 この設定は、パスワードを入力すると自動的に保存されます。

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

  1. システム環境設定に移動し、ネットワークを選択します。
  2. ネットワークのリストの左下にある小さな「プラス」ボタンをクリックします。
  3. 表示されるポップアップで、InterfaceVPNに設定し、 VPNTypeIKEv2に設定して、接続に名前を付けます。
  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 /tmp/ca-cert.pem /etc/ipsec.d/cacerts
  4. VPNが自動的に起動しないようにStrongSwanを無効にします:sudo systemctl disable --now strongswan
  5. /etc/ipsec.secretsファイルでVPNユーザー名とパスワードを構成します:your_username : EAP "your_password"
  6. /etc/ipsec.confファイルを編集して構成を定義します。
/etc/ipsec.conf
config setup

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

VPNに接続するには、次のように入力します。

  1. sudo systemctl start strongswan

再度切断するには、次のように入力します。

  1. 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アドレス、および構成したユーザー名sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_usernameを使用して、charon-cmdでVPNサーバーに接続します。
  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ストアからStrongSwanVPNクライアントをダウンロードします。
  3. アプリを開きます。 右上の「その他」アイコン(3つの点のアイコン)をタップし、CA証明書を選択します。
  4. 右上の「もっと見る」アイコンをもう一度タップします。 証明書のインポートを選択します。
  5. ダウンロードフォルダー内のCA証明書ファイルを参照し、それを選択してアプリにインポートします。

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

  1. アプリで、上部にあるVPNプロファイルの追加をタップします。
  2. サーバーにVPNサーバーのドメイン名またはパブリックIPアドレスを入力します。
  3. VPNタイプとしてIKEv2EAP(ユーザー名/パスワード)が選択されていることを確認してください。
  4. サーバーで定義した資格情報をユーザー名パスワードに入力します。
  5. CA証明書セクションで自動選択の選択を解除し、CA証明書の選択をクリックします。
  6. 画面上部のIMPORTEDタブをタップし、インポートした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にダンプするため、ログファイルアナライザーの設定を検討することをお勧めします。 チュートリアルVPSにLogwatchLogAnalyzerとReporterをインストールして使用する方法には、その設定に関する詳細があります。

オンラインプライバシーに関するEFFのこのガイドにも興味があるかもしれません。