前書き
仮想プライベートネットワーク(VPN)を使用すると、コーヒーショップ、会議、空港などの信頼できないネットワークを通過するトラフィックを安全に暗号化できます。
IKEv2、またはInternet Key Exchange v2は、サーバーとクライアント間の直接IPSecトンネリングを可能にするプロトコルです。 IKEv2 VPN実装では、IPSecはネットワークトラフィックの暗号化を提供します。 IKEv2は一部のプラットフォーム(OS X 10.11以降、iOS 9.1以降、およびWindows 10)でネイティブにサポートされ、追加のアプリケーションは不要であり、クライアントのしゃっくりを非常にスムーズに処理します。
このチュートリアルでは、Ubuntu 18.04サーバーでStrongSwanを使用してIKEv2 VPNサーバーをセットアップし、Windows、macOS、Ubuntu、iOS、およびAndroidクライアントからサーバーに接続します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
sudo
の非rootユーザーとファイアウォールを含むthe Ubuntu 18.04 initial server setup guideに従うことによって構成された1つのUbuntu18.04サーバー。
[[step-1 -—- installing-strongswan]] ==ステップ1—StrongSwanのインストール
まず、VPNサーバーとして構成するオープンソースのIPSecデーモンであるStrongSwanをインストールします。 また、インフラストラクチャの資格情報を提供する認証局を作成できるように、公開キーインフラストラクチャコンポーネントもインストールします。
次のように入力して、ローカルパッケージキャッシュを更新し、ソフトウェアをインストールします。
sudo apt update
sudo apt install strongswan strongswan-pki
すべてがインストールされたので、証明書の作成に進みましょう。
[[step-2 -—- creating-a-certificate-authority]] ==ステップ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
必要に応じて、distinguished name(DN)の値を別の値に変更できます。 ここでの一般的な名前は単なるインジケータであるため、インフラストラクチャ内のどの名前とも一致する必要はありません。
ルート認証局を稼働させたので、VPNサーバーが使用する証明書を作成できます。
[[step-3 -—- generate-a-certificate-for-the-vpn-server]] ==ステップ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=server_domain_or_IP" --san "server_domain_or_IP" \
--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サーバーの信頼性を確認できます。 すべての証明書の準備ができたので、ソフトウェアの構成に進みます。
[[step-4 -—- configuring-strongswan]] ==ステップ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=@server_domain_or_IP
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
[。注意]##
Note:サーバーID(leftid
)を構成するとき、VPNサーバーがドメイン名で識別される場合にのみ@
文字を含めます。
サーバーが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パラメーターを構成したので、ユーザーがサーバーに接続できるようにアカウントの作成に移りましょう。
[[step-5 -—- configuring-vpn-authentication]] ==ステップ5—VPN認証の構成
これで、VPNサーバーはクライアント接続を受け入れるように構成されましたが、まだ資格情報が構成されていません。 ipsec.secrets
という特別な構成ファイルでいくつかのことを構成する必要があります。
-
サーバーがクライアントに対して認証できるように、サーバー証明書の秘密キーの場所をStrongSwanに伝える必要があります。
-
また、VPNへの接続を許可するユーザーのリストを設定する必要があります。
編集のために秘密ファイルを開きましょう。
sudo nano /etc/ipsec.secrets
最初に、StrongSwanに秘密鍵の場所を伝えます。
/etc/ipsec.secrets
: RSA "server-key.pem"
次に、ユーザーの資格情報を定義します。 任意のユーザー名またはパスワードの組み合わせを作成できます。
/etc/ipsec.secrets
your_username : EAP "your_password"
ファイルを保存して閉じます。 VPNパラメータの操作が完了したので、設定が適用されるようにVPNサービスを再起動します。
sudo systemctl restart strongswan
VPNサーバーがサーバーオプションとユーザー資格情報の両方で完全に構成されたので、次は最も重要な部分であるファイアウォールの構成に進みます。
[[step-6 -—- configuring-the-firewall-amp-kernel-ip-forwarding]] ==ステップ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 eth0 proto static
パブリックネットワークインターフェイスがある場合は、テキストエディタで/etc/ufw/before.rules
ファイルを開きます。
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パケットが信頼できないネットワークを通過するときに追加のセキュリティを提供します。
完了したら、ファイルを保存して閉じます。
ファイアウォールを再起動する前に、ネットワークカーネルパラメーターを変更して、あるインターフェイスから別のインターフェイスへのルーティングを許可します。 UFWのカーネルパラメーター構成ファイルを開きます。
sudo nano /etc/ufw/sysctl.conf
ここでいくつかの設定を行う必要があります。
-
まず、IPv4パケット転送を有効にします。
-
パケットフラグメンテーションの問題を防ぐために、パスMTUディスカバリを無効にします。
-
また、man-in-the-middle攻撃を防ぐために、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は、次回の起動時にこれらの変更を適用します。
これで、ファイアウォールを無効にしてから再度有効にすることで、すべての変更を有効にできます。
sudo ufw disable
sudo ufw enable
プロセスの確認を求められます。 Y
と入力して、新しい設定でUFWを再度有効にします。
[[step-7 -–- testing-the-vpn-connection-on-windows-ios-and-macos]] ==ステップ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
であることを確認してください。
ca-cert.pem
ファイルをコンピューターにダウンロードしたら、VPNへの接続をセットアップできます。
Windowsから接続する
まず、次の手順に従ってルート証明書をインポートします。
-
WINDOWS+R
を押してRunダイアログを表示し、mmc.exe
と入力してWindows管理コンソールを起動します。 -
FileメニューからAdd or Remove Snap-inに移動し、使用可能なスナップインのリストからCertificatesを選択して、Addをクリックします。
-
VPNを任意のユーザーと連携させたいので、Computer Accountを選択し、Nextをクリックします。
-
ローカルコンピューターで構成しているので、Local Computerを選択し、Finishをクリックします。
-
Console Rootノードの下で、Certificates (Local Computer)エントリを展開し、Trusted Root Certification Authoritiesを展開してから、Certificatesエントリを選択します。
-
ActionメニューからAll Tasksを選択し、Importをクリックして、証明書のインポートウィザードを表示します。 Nextをクリックして、紹介を通過します。
-
File to Import画面で、Browseボタンを押して、保存した証明書ファイルを選択します。 次に、Nextをクリックします。
-
Certificate StoreがTrusted Root Certification Authoritiesに設定されていることを確認し、Nextをクリックします。
-
Finishをクリックして証明書をインポートします。
次に、次の手順でVPNを構成します。
-
Control Panelを起動し、Network and Sharing Centerに移動します。
-
Set up a new connection or networkをクリックしてから、Connect to a workplaceを選択します。
-
Use my Internet connection (VPN)を選択します。
-
VPNサーバーの詳細を入力します。 サーバーのドメイン名またはIPアドレスをInternet addressフィールドに入力し、Destination nameにVPN接続を説明するものを入力します。 次に、Doneをクリックします。
新しいVPN接続がネットワークのリストの下に表示されます。 VPNを選択し、Connectをクリックします。 ユーザー名とパスワードの入力を求められます。 それらを入力し、OKをクリックすると、接続されます。
macOSからの接続
次の手順に従って、証明書をインポートします。
-
証明書ファイルをダブルクリックします。 Keychain Accessがポップアップし、「キーチェーンアクセスがシステムキーチェーンを変更しようとしています。 これを許可するにはパスワードを入力してください。」
-
パスワードを入力し、Modify Keychainをクリックします
-
新しくインポートされたVPN証明書をダブルクリックします。 これにより、信頼レベルを指定できる小さなプロパティウィンドウが表示されます。 IP Security (IPSec)をAlways Trustに設定すると、パスワードの入力を再度求められます。 この設定は、パスワードを入力すると自動的に保存されます。
証明書が重要で信頼されたので、次の手順でVPN接続を構成します。
-
System Preferencesに移動し、Networkを選択します。
-
ネットワークのリストの左下にある小さな「プラス」ボタンをクリックします。
-
表示されるポップアップで、InterfaceをVPNに設定し、VPN TypeをIKEv2に設定して、接続に名前を付けます。
-
[Server]および[Remote ID]フィールドに、サーバーのドメイン名またはIPアドレスを入力します。 Local IDは空白のままにします。
-
Authentication Settingsをクリックし、Usernameを選択して、VPNユーザー用に構成したユーザー名とパスワードを入力します。 次に、OKをクリックします。
最後に、ConnectをクリックしてVPNに接続します。 これで、VPNに接続されます。
Ubuntuから接続する
Ubuntuマシンから接続するには、StrongSwanをサービスとして設定および管理するか、接続するたびに1回限りのコマンドを使用します。 手順は両方に提供されます。
サービスとしてのStrongSwanの管理
-
ローカルパッケージキャッシュを更新します:
sudo apt update
-
StrongSwanと関連ソフトウェア
sudo apt install strongswan libcharon-extra-plugins
をインストールします -
CA証明書を
/etc/ipsec.d/cacerts
ディレクトリにコピーします:sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts
-
VPNが自動的に開始されないようにStrongSwanを無効にします:
sudo systemctl disable --now strongswan
-
/etc/ipsec.secrets
ファイルでVPNユーザー名とパスワードを構成します:your_username : EAP "your_password"
-
/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に接続するには、次を入力します。
sudo systemctl start strongswan
再度切断するには、次を入力します。
sudo systemctl stop strongswan
1回限りの接続に単純なクライアントを使用する
-
ローカルパッケージキャッシュを更新します:
sudo apt update
-
charon-cmd
および関連ソフトウェアsudo apt install charon-cmd libcharon-extra-plugins
をインストールします -
CA証明書をコピーしたディレクトリに移動します:
cd <^>/path/to/ca-cert.pem
-
サーバーのCA証明書、VPNサーバーのIPアドレス、および構成したユーザー名を使用して、
charon-cmd
でVPNサーバーに接続します:sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_username
-
プロンプトが表示されたら、VPNユーザーのパスワードを入力します。
これで、VPNに接続されます。 切断するには、CTRL+C
を押して、接続が閉じるのを待ちます。
iOSから接続する
iOSデバイスでVPN接続を構成するには、次の手順を実行します。
-
ルート証明書が添付されたメールを自分に送信します。
-
iOSデバイスでメールを開き、添付の証明書ファイルをタップしてから、Installをタップしてパスコードを入力します。 インストールしたら、Doneをタップします。
-
Settings、General、VPNに移動し、Add VPN Configurationをタップします。 これにより、VPN接続構成画面が表示されます。
-
Typeをタップし、IKEv2を選択します。
-
[Description]フィールドに、VPN接続の短い名前を入力します。 これは好きなものにすることができます。
-
[Server]および[Remote ID]フィールドに、サーバーのドメイン名またはIPアドレスを入力します。 Local IDフィールドは空白のままにすることができます。
-
Authenticationセクションにユーザー名とパスワードを入力し、Doneをタップします。
-
作成したVPN接続を選択し、ページ上部のスイッチをタップすると、接続されます。
Androidから接続する
次の手順に従って、証明書をインポートします。
-
CA証明書が添付されたメールを自分に送信します。 CA証明書をダウンロードフォルダーに保存します。
-
PlayストアからStrongSwan VPN clientをダウンロードします。
-
アプリを開きます。 右上隅の“more” iconをタップし(3つのドットアイコン)、CA certificatesを選択します。
-
右上隅の“more” iconをもう一度タップします。 Import certificateを選択します。
-
ダウンロードフォルダー内のCA証明書ファイルを参照して選択し、アプリにインポートします。
証明書がStrongSwanアプリにインポートされたので、次の手順でVPN接続を構成できます。
-
アプリで、上部のADD VPN PROFILEをタップします。
-
ServerにVPNサーバーのドメイン名またはパブリックIPアドレスを入力します。
-
VPNタイプとしてIKEv2 EAP (Username/Password)が選択されていることを確認してください。
-
サーバーで定義した資格情報をUsernameとPasswordに入力します。
-
CA certificateセクションでSelect automaticallyの選択を解除し、Select CA certificateをクリックします。
-
画面上部のIMPORTEDタブをタップし、インポートしたCAを選択します(以前に「DN」を変更しなかった場合は、「VPNルートCA」という名前になります)。
-
必要に応じて、Profile name (optional)にわかりやすい名前を入力してください。
VPNに接続する場合は、StrongSwanアプリケーションで作成したばかりのプロファイルをクリックします。
接続のトラブルシューティング
証明書をインポートできない場合は、ファイルの拡張子が.pem.txt
ではなく.pem
であることを確認してください。
VPNに接続できない場合は、使用したサーバー名またはIPアドレスを確認してください。 サーバーのドメイン名またはIPアドレスは、証明書の作成時に一般名(CN)として設定したものと一致する必要があります。 一致しない場合、VPN接続は機能しません。 CNがvpn.example.com
の証明書を設定した場合、VPNサーバーの詳細を入力するときにmustはvpn.example.com
を使用します。 証明書の生成に使用したコマンドと、VPN接続の作成時に使用した値を再確認してください。
最後に、ドメイン名を使用している場合は、VPN構成を再確認して、leftid
値が@
記号で構成されていることを確認します。
また、IPアドレスを使用している場合は、@
記号が省略されていることを確認してください。
結論
このチュートリアルでは、IKEv2プロトコルを使用するVPNサーバーを構築しました。 これで、どこにいてもオンラインアクティビティの安全性を確保できます。
ユーザーを追加または削除するには、手順5をもう一度見てください。 各行は1人のユーザー用であるため、ユーザーの追加または削除はファイルの編集と同じくらい簡単です。
StrongSwanはログをsyslogにダンプするため、ここからログファイルアナライザーのセットアップを検討することができます。 チュートリアルのHow To Install and Use Logwatch Log Analyzer and Reporter on a VPSには、その設定に関する詳細情報があります。
this guide from the EFF about online privacyにも興味があるかもしれません。