Ubuntu 22.04でStrongSwanを使用してIKEv2 VPNサーバーをセットアップする方法

はじめに

A virtual private network, or VPN, allows you to securely encrypt traffic as it travels through untrusted networks, such as those at the coffee shop, a conference, or an airport.

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

このチュートリアルでは、Ubuntu 22.04サーバー上でStrongSwanを使用してIKEv2 VPNサーバーを設定します。その後、Windows、macOS、Ubuntu、iOS、Androidのクライアントでそれに接続する方法を学びます。

前提条件

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

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

まず、VPNサーバーとして設定するオープンソースのIPSecデーモンであるStrongSwanをインストールします。また、インフラストラクチャの資格情報を提供するために証明書機関(CA)を作成できるように、公開鍵インフラストラクチャ(PKI)コンポーネントもインストールします。

まず、ローカルパッケージキャッシュを更新します:

  1. sudo apt update

次に、次のように入力してソフトウェアをインストールします:

  1. sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins

追加のlibcharon-extauth-pluginsパッケージは、さまざまなクライアントが共有のユーザー名とパスフレーズを使用してサーバーに認証できるようにするために使用されます。 libstrongswan-extra-pluginsパッケージは、StrongSwanがCurve25519暗号スイートを使用する楕円曲線暗号スイートをサポートするように含まれています。

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

ステップ2 — 証明書機関の作成

IKEv2サーバーには、クライアントに自己を識別するための証明書が必要です。必要な証明書を作成するために、strongswan-pkiパッケージには、証明書機関(CA)とサーバー証明書を生成するためのユーティリティであるpkiが付属しています。

最初に、作業するすべてのアセットを保存するためのいくつかのディレクトリを作成します。 ディレクトリ構造は、/etc/ipsec.d 内のいくつかのディレクトリに一致し、最終的に作成したすべてのアイテムを移動します。

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

次に、他のユーザーによってプライベートファイルが見られないように、アクセス権を厳密に制限します。

  1. chmod 700 ~/pki

すべてを保存するディレクトリ構造ができたので、ルートキーを生成できます。 これは、ルート証明書機関証明書に署名するために使用される4096ビットのRSAキーです。

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

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

その後、作成したキーを使用してルート証明書機関を作成し、ルート証明書に署名できます。

  1. 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

--lifetime 3650 フラグは、証明書機関のルート証明書が10年間有効であることを保証するために使用されます。 通常、権限のある証明書機関のルート証明書は変更されません。 なぜなら、それを依存するすべてのサーバーとクライアントに再配布する必要があるためです。 したがって、10年は安全なデフォルトの有効期限値です。

インフラストラクチャに何かを一致させる必要はないので、識別名(DN)値を他の値に変更できます。

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

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

これで、VPNサーバーの証明書とキーを作成します。この証明書を使用すると、クライアントが以前に生成したCA証明書を使用してサーバーの正当性を検証できます。

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

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

次に、以前のステップで作成した認証局のキーを使用してVPNサーバー証明書を作成し、署名します。次のコマンドを実行しますが、Common Name(CN)とSubject Alternate Name(SAN)フィールドをVPNサーバーのDNS名またはIPアドレスに変更してください。

  1. pki --pub --in ~/pki/private/server-key.pem --type rsa \
  2. | 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

注意: DNS名の代わりにIPアドレスを使用している場合、複数の--sanエントリを指定する必要があります。以前のコマンドブロックで識別名(--dn ...)を指定する行を、次の抜粋された行のように変更する必要があります。

--dn "CN=IPアドレス" --san @IPアドレス --san IPアドレス \

この追加の--san @IPアドレスエントリの理由は、一部のクライアントが、サーバーの識別を検証する際に、TLS証明書にサーバーのDNSエントリとIPアドレスエントリの両方があるかどうかを確認することです。

--flag serverAuthオプションは、暗号化されたトンネルが確立される前に、証明書が明示的にサーバー認証に使用されることを示すために使用されます。 --flag ikeIntermediateオプションは、古いmacOSクライアントをサポートするために使用されます。

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

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

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

ステップ4 — StrongSwanの構成

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

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

好みのテキストエディタを使用して新しい空白の構成ファイルを作成して開きます。ここでは、nanoを使用します。

  1. sudo nano /etc/ipsec.conf

注意: VPNのサーバー部分を構成するこのセクションを進めるにあたり、接続の左側右側を参照する設定に遭遇します。IPSec VPNを扱う際に、左側は慣例に従って、設定しているローカルシステム、この場合はサーバーを指します。これらの設定の右側ディレクティブは、電話や他のコンピューターなどのリモートクライアントを指します。

後でこのチュートリアルの後半でクライアントを構成する際には、クライアント構成ファイルはさまざまな左側ディレクティブを使用して自身を参照し、サーバーは右側の用語を使用して参照されます。

まず、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ファイルに追加します。

  • left=%any %any の値は、サーバーが受信接続を受け取るネットワークインターフェイスを使用して、クライアントとの後続の通信に使用することを保証します。たとえば、クライアントをプライベートネットワーク経由で接続する場合、サーバーはトラフィックを受信するプライベートIPアドレスを使用して接続の残りの部分を処理します。
  • leftid=@server_domain_or_IP このオプションは、サーバーがクライアントに表示する名前を制御します。次のオプションleftcertと組み合わせると、leftidオプションは、サーバーの構成名と公開証明書に含まれる識別名(DN)が一致することを保証します。
  • leftcert=server-cert.pem このオプションは、ステップ3で構成したサーバーの公開証明書へのパスです。これがないと、サーバーはクライアントとの認証を完了したり、IKEv2の設定を完了したりできません。
  • leftsendcert=always always の値は、サーバーに接続する任意のクライアントが、初期接続設定の一環としてサーバーの公開証明書のコピーを常に受け取ることを保証します。
  • leftsubnet=0.0.0.0/0 追加する最後の「left」側オプションは、サーバーの背後に到達可能なサブネットについてクライアントに通知します。この場合、0.0.0.0/0はIPv4アドレスの全体セットを表し、サーバーはクライアントに対してデフォルトですべてのトラフィックをVPN経由で送信するよう指示します。

関連するすべての「left」側オプションに慣れたので、次のようにすべてをファイルに追加します:

/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サーバーがドメイン名で識別される場合にのみ、@ 文字を含めます:

/etc/ipsec.conf
    . . .    leftid=@vpn.example.com
    . . .

サーバーがそのIPアドレスで識別される場合は、単にIPアドレスを入力します:

/etc/ipsec.conf
    . . .
    leftid=your_server_ip
    . . .

次に、クライアントの「right」側のIPSecパラメーターを設定できます。以下の各パラメーターは、クライアントがサーバーに接続する方法、クライアントがサーバーに認証する方法、およびクライアントが使用するプライベートIPアドレス範囲とDNSサーバーをサーバーに伝えます。これらが何であり、なぜ使用されるかに精通したら、/etc/ipsec.conf ファイルにこれらの設定を追加してください:

  • right=%any 接続のright側の%any オプションは、サーバーがどのリモートクライアントからの着信接続も受け入れるように指示します。
  • rightid=%any このオプションにより、サーバーは暗号化トンネルが確立される前にアイデンティティを提供するクライアントからの接続を拒否しません。
  • rightauth=eap-mschapv2 このオプションは、クライアントがサーバーに認証するための認証方法を構成します。ここでは、Windows、macOS、およびAndroidデバイスなどのクライアントをサポートするためにeap-mschapv2が使用されています。
  • rightsourceip=10.10.10.0/24 このオプションは、サーバーに指定された10.10.10.0/24のIPプールからクライアントにプライベートIPアドレスを割り当てるように指示します。
  • rightdns=8.8.8.8,8.8.4.4 これらのIPアドレスはGoogleのパブリックDNSリゾルバーです。これらは他のパブリックリゾルバー、VPNサーバーのリゾルバー、またはクライアントが到達できる任意のリゾルバーに変更できます。
  • rightsendcert=never このオプションは、クライアントが自分自身を認証するために証明書を送信する必要がないことをサーバーに指示します。

これでVPNの必要な「right」サイドオプションに慣れましたので、次の行を/etc/ipsec.confに追加してください。

/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

最後に、Linux、Windows、macOS、iOS、およびAndroidクライアントをサポートするために次の行を追加します。これらの行は、StrongSwanが異なるクライアントが使用することを許可するさまざまな鍵交換、ハッシュ化、認証、および暗号化アルゴリズム(一般的にCipher Suitesと呼ばれる)を指定しています。

/etc/ipsec.conf
. . .
conn ikev2-vpn
    . . .
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!

各サポートされているCipher Suiteは、他のものからコンマで区切られます。たとえば、chacha20poly1305-sha512-curve25519-prfsha512は1つの組み合わせであり、aes256gcm16-sha384-prfsha384-ecp384は別の組み合わせです。ここにリストされているCipher Suiteは、Windows、macOS、iOS、Android、およびLinuxクライアント間で最も広範囲の互換性を確保するために選択されています。

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

/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
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!

各行が正しく追加されたことを確認したら、ファイルを保存して閉じてください。もしnanoを使用した場合は、CTRL + XYENTERを押してください。

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

ステップ5 — VPN認証の設定

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

  • StrongSwanにサーバー証明書の秘密鍵の場所を教える必要があります。これにより、サーバーがクライアントを認証できるようになります。
  • VPNに接続することが許可されるユーザーのリストも設定する必要があります。

まず、編集するためにシークレットファイルを開きましょう。

  1. sudo nano /etc/ipsec.secrets

まず、StrongSwanに秘密鍵の場所とその解析方法を教えます。

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

行が:文字で始まり、その後にスペースがあることを確認して、行全体が: RSA "server-key.pem"になるようにします。

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

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

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

  1. sudo systemctl restart strongswan-starter

VPNサーバーがサーバーオプションとユーザー資格情報の両方で完全に設定されたので、次に進んでファイアウォールを設定する時です。

ステップ6 — ファイアウォールとカーネルIPフォワーディングの設定

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

前提条件としての初期サーバー設定チュートリアルに従っている場合、UFWファイアウォールが有効になっているはずです。 まだUFWを設定していない場合は、現在のセッションが終了しないように、ファイアウォールを有効にする前にSSH接続を許可するルールを追加する必要があります:

  1. sudo ufw allow OpenSSH

次に、ファイアウォールを有効にしてください:

  1. sudo ufw enable

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

  1. sudo ufw allow 500,4500/udp

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

  1. ip route show default

公開インターフェースは「dev」に続く単語に従う必要があります。 たとえば、この結果はeth0という名前のインターフェースを示しており、次の例で強調されています:

Output
default via your_server_ip dev eth0 proto static

パブリックネットワークインターフェースがある場合は、テキストエディタで/etc/ufw/before.rulesファイルを開きます。このファイルのルールは、通常の入力および出力ルールの残りの部分よりも前にファイアウォールに追加されます。これらはネットワークアドレス変換(NAT)を構成するために使用されます。これにより、サーバーがクライアントとインターネット間の接続を正しくルーティングできます。

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

ファイルの上部に(*filter行の前に)、次の構成ブロックを追加します。上記の構成の各インスタンスのeth0ip routeで見つけたインターフェース名に変更してください。*nat行は、ファイアウォールがVPNクライアントとインターネット間のトラフィックを正しくルーティングおよび操作できるようにするルールを作成します。*mangle行は、特定のVPNクライアントでの潜在的な問題を防ぐために、最大パケットセグメントサイズを調整します。

/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]
. . .

次に、*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

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

完了したら、各行を正しく追加したことを確認したら、ファイルを保存して閉じます。 nanoを使用した場合は、CTRL + XYENTERを押してください。

ファイアウォールを再起動する前に、サーバー上のVPNと公開ネットワークインターフェース間でトラフィックが移動できるように、いくつかのネットワークカーネルパラメータを変更する必要があります。これらの設定を制御するファイルは/etc/ufw/sysctl.confと呼ばれます。ファイル内でいくつかの設定を構成する必要があります。

まず、IPv4パケットの転送を有効にして、VPNと公開ネットワークインターフェース間でトラフィックを移動できるようにする必要があります。次に、パケットの断片化問題を防ぐために、Path MTU探索を無効にします。最後に、中間者攻撃を防ぐために、ICMPリダイレクトを受け入れないようにし、ICMPリダイレクトを送信しません。

好きなテキストエディタ(nanoなど)を使用してUFWのカーネルパラメータ構成ファイルを開きます:

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

次に、次の設定net/ipv4/ip_forward=1をファイルの末尾に追加して、インターフェース間のパケット転送を有効にします:

/etc/ufw/sysctl.conf
. . .
net/ipv4/ip_forward=1

次に、次の行をファイルの末尾に追加して、ICMPリダイレクトパケットの送信と受信をブロックします:

/etc/ufw/sysctl.conf
. . .
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/all/send_redirects=0

最後に、次の行をファイルの末尾に追加して、Path MTU探索をオフにします:

/etc/ufw/sysctl.conf
. . .
net/ipv4/ip_no_pmtu_disc=1

変更が完了したら、ファイルを保存します。これで、ファイアウォールを無効にしてから再度有効にすることで、すべての変更を有効にすることができます。UFWは再起動時にこれらの設定を適用します:

  1. sudo ufw disable
  2. sudo ufw enable

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

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

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

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

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

Output
-----BEGIN CERTIFICATE----- MIIFNDCCAxygAwIBAgIIHCsidG5mXzgwDQYJKoZIhvcNAQEMBQAwODELMAkGA1UE . . . H2YUdz8XNHrJHvMQKWFpi0rlEcMs+MSXPFWE3Q7UbaZJ/h8wpSldSUbQRUlphExJ dJ4PX+MUJO/vjG1/ie6Kh25xbBAc3qNq8siiJZDwrg6vjEK7eiZ1rA== -----END CERTIFICATE-----

この出力をコンピューターにコピーし、-----BEGIN CERTIFICATE-----および-----END CERTIFICATE-----の行を含め、ca-cert.pemなどの認識しやすい名前のファイルに保存します。作成するファイルに.pemの拡張子があることを確認してください。

あるいは、ファイルをコンピューターに転送するためにSFTPを使用することもできます。

Windowsからの接続

ルート証明書をインポートしてWindowsをVPNに接続する方法は複数あります。最初の方法では、各ステップにグラフィカルツールを使用します。2番目の方法では、VPN構成に合わせてスクリプト化および変更できるPowerShellコマンドを使用します。

注意:これらの手順は、バージョン1903および1909を実行しているWindows 10インストールでテストされています。

グラフィカルツールを使用してWindowsを構成する

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

  1. WINDOWS+Rを押して実行ダイアログを表示し、mmc.exeを入力してWindows Management Consoleを起動します。

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

  3. VPNを任意のユーザーで使用できるようにしたいので、コンピューターアカウントを選択して次へをクリックします。

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

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

  6. アクションメニューからすべてのタスクを選択し、インポートをクリックして、証明書インポートウィザードを表示します。イントロダクションをスキップするには次へをクリックします。

  7. インポートするファイル画面で、参照ボタンを押し、ファイルの種類を「X.509証明書(.cer;.crt)」から「すべてのファイル(.)」に変更し、保存したca-cert.pemファイルを選択します。その後、次へをクリックします。

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

  9. 証明書をインポートするには完了をクリックしてください。

その後、VPNを次の手順で設定してください:

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

PowerShellを使用してWindowsを構成

PowerShellを使用してルートCA証明書をインポートするには、まず管理者特権を持つPowerShellプロンプトを開きます。そのためには、スタートメニューアイコンを右クリックしてWindows PowerShell(管理者)を選択します。または、管理者としてコマンドプロンプトを開いてpowershellと入力することもできます。

次に、Import-Certificate PowerShellコマンドレットを使用して証明書をインポートします。次のコマンドでは、最初の-CertStoreLocation引数が、証明書をコンピュータの信頼されたルート証明機関ストアにインポートし、すべてのプログラムとユーザーがVPNサーバーの証明書を検証できるようにします。-FilePath引数は、証明書をコピーした場所を指す必要があります。次の例では、パスはC:\Users\sammy\Documents\ca-cert.pemです。使用した場所にコマンドを編集してください。

  1. Import-Certificate `
  2. -CertStoreLocation cert:\LocalMachine\Root\ `
  3. -FilePath C:\users\sammy\Documents\ca-cert.pem

コマンドは次のような出力を生成します:

Output
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\Root Thumbprint Subject ---------- ------- DB00813B4087E9367861E8463A60CEA0ADC5F002 CN=VPN root CA

次に、PowerShellを使用してVPNを構成するために、次のコマンドを実行します。-ServerAddress行でサーバーのDNS名またはIPアドレスを置換します。さまざまなフラグは、Windowsが適切なセキュリティパラメータで正しく構成されるようにします。これらは/etc/ipsec.confで設定したオプションと一致します。

  1. Add-VpnConnection -Name "VPN Connection" `
  2. -ServerAddress "server_domain_or_IP" `
  3. -TunnelType "IKEv2" `
  4. -AuthenticationMethod "EAP" `
  5. -EncryptionLevel "Maximum" `
  6. -RememberCredential `

コマンドが成功した場合、出力はありません。VPNが正しく構成されていることを確認するには、Get-VPNConnectionコマンドレットを使用します:

  1. Get-VpnConnection -Name "VPN Connection"

以下のような出力が得られます:

Output
Name : VPN Connection ServerAddress : your_server_ip AllUserConnection : False Guid : {B055A1AB-175C-4028-B4A8-D34309A2B20E} TunnelType : Ikev2 AuthenticationMethod : {Eap} EncryptionLevel : Maximum L2tpIPsecAuth : UseWinlogonCredential : False EapConfigXmlStream : #document ConnectionStatus : Disconnected RememberCredential : True SplitTunneling : False DnsSuffix : IdleDisconnectSeconds : 0

デフォルトでは、Windows は古いおよび遅いアルゴリズムを選択します。 IKEv2 キー交換に Windows が使用する暗号化パラメータをアップグレードし、パケットを暗号化するには、Set-VpnConnectionIPsecConfiguration コマンドレットを実行します:

  1. Set-VpnConnectionIPsecConfiguration -Name "VPN Connection" `
  2. -AuthenticationTransformConstants GCMAES256 `
  3. -CipherTransformConstants GCMAES256 `
  4. -DHGroup ECP384 `
  5. -IntegrityCheckMethod SHA384 `
  6. -PfsGroup ECP384 `
  7. -EncryptionMethod GCMAES256

注意: 異なるオプションで VPN 接続を削除して再構成する場合は、Remove-VpnConnection コマンドレットを実行できます。

  1. Remove-VpnConnection -Name "VPN Connection" -Force

-Force フラグを使用すると、削除を確認するプロンプトが表示されません。このコマンドを使用して削除しようとする場合は、VPN から切断されている必要があります。

VPN への接続

証明書をインポートし、いずれかの方法を使用して VPN を構成した後、新しい VPN 接続はネットワークのリストの下に表示されます。 VPN を選択して接続をクリックします。 ユーザー名とパスワードが求められます。 入力して、OKをクリックして接続します。

macOS からの接続

証明書をインポートする手順は次のとおりです:

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

今、証明書がインポートされ、信頼されたので、次の手順でVPN接続を構成します。

  1. システム環境設定に移動し、ネットワークを選択します。
  2. ネットワークのリストの左下にある小さな「プラス」ボタンをクリックします。
  3. 表示されるポップアップウィンドウで、インターフェースVPNに設定し、VPNの種類IKEv2に設定し、接続に名前を付けます。
  4. サーバーおよびリモートIDフィールドに、サーバーのドメイン名またはIPアドレスを入力します。 ローカルIDを空白のままにします。
  5. 認証設定をクリックし、ユーザー名を選択し、VPNユーザーのユーザー名とパスワードを入力します。その後、OKをクリックします。

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

Ubuntuからの接続

Ubuntuマシンから接続するには、StrongSwanをサービスとして設定および管理するか、接続するたびにワンオフのコマンドを使用できます。両方の手順について説明します。

StrongSwanをサービスとして管理する

StrongSwanをサービスとして管理するには、以下の設定手順を実行する必要があります。

まず、aptを使用してローカルパッケージキャッシュを更新します。

  1. sudo apt update

次に、StrongSwanと認証に必要なプラグインをインストールします。

  1. sudo apt install strongswan libcharon-extra-plugins

次に、クライアントがサーバーの正体を検証できるように、CA証明書のコピーが/etc/ipsec.d/cacertsディレクトリに必要です。次のコマンドを実行してca-cert.pemファイルをコピーします。

  1. sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts

VPNが必要な時のみ実行されるようにするには、systemctlを使用してStrongSwanが自動的に実行されないようにします。

  1. sudo systemctl disable --now strongswan-starter

次に、VPNサーバーに認証するために使用するユーザー名とパスワードを設定します。お好みのエディター(nanoなど)を使用して/etc/ipsec.secretsを編集します。

  1. sudo nano /etc/ipsec.secrets

以下の行を追加し、ハイライト表示されたユーザー名とパスワードの値を、サーバーで設定した値と一致するように編集します。

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

最後に、/etc/ipsec.confファイルを編集して、クライアントをサーバーの構成に合わせます。

/etc/ipsec.conf
config setup

conn ikev2-rw
    right=server_domain_or_IP
    # これは、サーバーの構成の`leftid`値と一致する必要があります
    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-starter

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

  1. sudo systemctl stop strongswan-starter

ワンオフの接続にcharon-cmdクライアントを使用

StrongSwanをサービスとして管理するには、以下の構成手順を実行する必要があります。

まず、aptを使用してローカルパッケージキャッシュを更新します。

  1. sudo apt update

次に、StrongSwanと認証に必要なプラグインをインストールします。

  1. sudo apt install strongswan libcharon-extra-plugins

次に、クライアントがサーバーの正体を確認できるように、CA証明書のコピーを/etc/ipsec.d/cacertsディレクトリに用意する必要があります。次のコマンドを実行して、ca-cert.pemファイルをコピーします。

  1. sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts

この段階で、charon-cmdを使用してVPNサーバーに接続できます。接続には、サーバーのCA証明書、VPNサーバーのIPアドレス、および構成したユーザー名が必要です。

VPNに接続するには、次のコマンドを実行します。

  1. sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_username

プロンプトが表示されたら、VPNユーザーのパスワードを入力し、VPNに接続されます。切断するには、端末でCTRL+Cを押して接続が閉じるのを待ちます。

iOSからの接続

iOSデバイスでVPN接続を構成するには、以下の手順に従います。

  1. ルート証明書を添付して自分宛にメールを送信します。
  2. iOSデバイスでメールを開き、添付された証明書ファイルをタップし、インストールをタップしてパスコードを入力します。インストールが完了したら、完了をタップします。
  3. 設定に移動し、一般VPNをタップして、VPN構成の追加をタップします。これによりVPN接続構成画面が表示されます。
  4. タイプをタップして、IKEv2を選択します。
  5. 説明欄に、VPN接続の短い名前を入力します。これは好きなものを入力できます。
  6. サーバーリモートID欄に、サーバーのドメイン名またはIPアドレスを入力します。ローカルID欄は空白のままにしておきます。
  7. 認証セクションにユーザー名とパスワードを入力し、完了をタップします。
  8. 作成したばかりのVPN接続を選択し、ページ上部のスイッチをタップすると、接続されます。

Androidから接続する

証明書をインポートする手順は以下の通りです:

  1. 自分宛にCA証明書を添付したメールを送信します。CA証明書をダウンロードフォルダーに保存します。
  2. PlayストアからStrongSwan VPNクライアントをダウンロードします。
  3. アプリを開きます。右上隅の「もっと」アイコン()をタップし、CA証明書を選択します。
  4. 上部右隅の「もっと見る」アイコンをタップします(. . .)。証明書のインポートを選択します。
  5. ダウンロードフォルダ内のCA証明書ファイルに移動し、それをアプリにインポートするために選択します。

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

  1. アプリで、上部にあるVPNプロファイルの追加をタップします。
  2. サーバーに、VPNサーバーのドメイン名またはパブリックIPアドレスを入力します。
  3. VPNタイプとしてIKEv2 EAP(ユーザー名/パスワード)が選択されていることを確認してください。
  4. ユーザー名パスワードに、サーバーで定義した資格情報を入力します。
  5. CA証明書セクションで自動選択を解除し、CA証明書を選択をクリックします。
  6. 画面の上部にあるIMPORTEDタブをタップし、インポートしたCAを選択します(「DN」を以前に変更していない場合、「VPNルートCA」という名前になります)。
  7. 必要な場合は、プロファイル名(任意)により記述的な名前を入力します。

VPNに接続する場合は、StrongSwanアプリで作成したプロファイルをクリックします。

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

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

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

最後に、ドメイン名を使用している場合は、VPN構成でleftid値が@記号で構成されていることを確認してください。

/etc/ipsec.conf
    leftid=@vpn.example.com

IPアドレスを使用している場合は、@記号が省略されていることを確認してください。また、server-cert.pemファイルを生成する際に、--san @IPアドレスおよび--san IPアドレスフラグの両方を含めたことを確認してください。

結論

このチュートリアルでは、IKEv2プロトコルを使用するVPNサーバーを構築しました。サーバーおよびクライアントの接続のleftおよびright側を制御するディレクティブについて学びました。また、Windows、macOS、iOS、Android、またはLinuxクライアントをVPNに接続するために構成しました。

/etc/ipsec.secrets内の各行は1人のユーザーに対応していますので、ユーザーの追加や削除、またはパスワードの変更はファイルを編集するだけで済みます。

これで、どこにいてもインターネットにアクセスするために使用するデバイスに関係なく、オンライン活動が安全であることを保証できます。

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-22-04