序章
仮想プライベートネットワーク(VPN)を使用すると、コーヒーショップ、会議、空港などの信頼できないネットワークを通過するトラフィックを安全に暗号化できます。
IKEv2 、またはインターネットキーエクスチェンジv2は、サーバーとクライアント間の直接IPSecトンネリングを可能にするプロトコルです。 IKEv2 VPNの実装では、IPSecはネットワークトラフィックの暗号化を提供します。 IKEv2は、新しいプラットフォーム(OS X 10.11以降、iOS 9.1以降、およびWindows 10)でネイティブにサポートされており、追加のアプリケーションは必要ありません。また、クライアントの一時的な中断を非常にスムーズに処理します。
このチュートリアルでは、Ubuntu16.04サーバーでStrongSwan を使用してIKEv2VPNサーバーをセットアップし、Windows、iOS、およびmacOSクライアントからサーバーに接続します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Ubuntu 16.04初期サーバーセットアップガイドに従って構成された、複数のCPUを備えた1つのUbuntu 16.04サーバー(sudo非rootユーザーとファイアウォールを含む)。
さらに、IPTablesに精通している必要があります。 先に進む前に、IptablesFirewallの仕組みを確認してください。
ステップ1—StrongSwanをインストールする
まず、VPNサーバーとして構成するオープンソースのIPSecデーモンであるStrongSwanをインストールします。 また、StrongSwan EAPプラグインをインストールします。これにより、証明書ベースの認証ではなく、クライアントのパスワード認証が可能になります。 この構成の一部としていくつかの特別なファイアウォールルールを作成する必要があるため、新しいファイアウォールルールを永続化できるユーティリティもインストールします。
次のコマンドを実行して、これらのコンポーネントをインストールします。
- sudo apt-get install strongswan strongswan-plugin-eap-mschapv2 moreutils iptables-persistent
注:iptables-persistent
のインストール中に、インストーラーは現在のIPv4およびIPv6ルールを保存するかどうかを尋ねます。 以前のファイアウォール構成を同じままにしておきたいので、両方のプロンプトで[はい]を選択します。
すべてがインストールされたので、証明書の作成に移りましょう。
ステップ2—認証局を作成する
IKEv2サーバーには、クライアントに対して自身を識別するための証明書が必要です。 必要な証明書の作成を支援するために、StrongSwanには認証局とサーバー証明書を生成するユーティリティが付属しています。 まず、作業するすべてのものを格納するディレクトリを作成しましょう。
- mkdir vpn-certs
- cd vpn-certs
すべてを保存するディレクトリができたので、ルートキーを生成しましょう。 これは、ルート認証局に署名するために使用される4096ビットのRSAキーになるため、 root ユーザーのみが読み取ることができるようにすることで、このキーも保護することが非常に重要です。
次のコマンドを実行して、キーを生成して保護します。
- ipsec pki --gen --type rsa --size 4096 --outform pem > server-root-key.pem
- chmod 600 server-root-key.pem
キーができたので、キーを使用してルート認証局に署名し、ルート認証局の作成に進むことができます。
- ipsec pki --self --ca --lifetime 3650 \
- --in server-root-key.pem \
- --type rsa --dn "C=US, O=VPN Server, CN=VPN Server Root CA" \
- --outform pem > server-root-ca.pem
必要に応じて、識別名(DN)の値(国、組織、一般名など)を別の値に変更できます。 ここでの一般名は単なるインジケーターなので、何かを作ることもできます。
後で、ルート証明書(server-root-ca.pem
)をクライアントデバイスにコピーして、接続時にサーバーの信頼性を検証できるようにします。
ルート認証局が稼働しているので、VPNサーバーが使用する証明書を作成できます。
ステップ3—VPNサーバーの証明書を生成する
次に、VPNサーバーの証明書とキーを作成します。 この証明書により、クライアントはサーバーの信頼性を検証できます。
まず、次のコマンドを使用してVPNサーバーの秘密鍵を作成します。
- ipsec pki --gen --type rsa --size 4096 --outform pem > vpn-server-key.pem
次に、前の手順で作成した認証局のキーを使用してVPNサーバー証明書を作成して署名します。 次のコマンドを実行しますが、[共通名(CN)]フィールドと[サブジェクト代替名(SAN)]フィールドをVPNサーバーのDNS名またはIPアドレスに変更します。
- ipsec pki --pub --in vpn-server-key.pem \
- --type rsa | ipsec pki --issue --lifetime 1825 \
- --cacert server-root-ca.pem \
- --cakey server-root-key.pem \
- --dn "C=US, O=VPN Server, CN=server_name_or_ip" \
- --san server_name_or_ip \
- --flag serverAuth --flag ikeIntermediate \
- --outform pem > vpn-server-cert.pem
証明書を、StrongSwanが証明書を読み取れるパスにコピーします。
- sudo cp ./vpn-server-cert.pem /etc/ipsec.d/certs/vpn-server-cert.pem
- sudo cp ./vpn-server-key.pem /etc/ipsec.d/private/vpn-server-key.pem
最後に、rootユーザーのみが読み取れるようにキーを保護します。
- sudo chown root /etc/ipsec.d/private/vpn-server-key.pem
- sudo chgrp root /etc/ipsec.d/private/vpn-server-key.pem
- sudo chmod 600 /etc/ipsec.d/private/vpn-server-key.pem
このステップでは、クライアントとサーバー間の通信を保護するために使用される証明書ペアを作成しました。 また、ルートキーを使用して証明書に署名したため、クライアントはVPNサーバーの信頼性を検証できます。 すべての証明書の準備ができたので、ソフトウェアの構成に進みます。
ステップ4—StrongSwanを設定する
必要なすべての証明書をすでに作成しているので、StrongSwan自体を構成するときが来ました。
StrongSwanにはデフォルトの設定ファイルがありますが、変更を加える前に、何か問題が発生した場合に備えて参照ファイルを用意できるように、まずそれをバックアップしましょう。
- sudo cp /etc/ipsec.conf /etc/ipsec.conf.original
サンプルファイルは非常に長いため、設定ミスを防ぐために、デフォルトの設定ファイルをクリアして、独自の設定を最初から作成します。 まず、元の構成をクリアします。
- echo '' | sudo tee /etc/ipsec.conf
次に、テキストエディタでファイルを開きます。
- sudo nano /etc/ipsec.conf
まず、StrongSwanに、デバッグのためにデーモンのステータスをログに記録し、重複接続を許可するように指示します。 次の行をファイルに追加します。
config setup
charondebug="ike 1, knl 1, cfg 0"
uniqueids=no
次に、VPNの構成セクションを作成します。 また、StrongSwanにIKEv2 VPNトンネルを作成し、起動時にこの構成セクションを自動的にロードするように指示します。 次の行をファイルに追加します。
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
次に、VPNに使用する暗号化アルゴリズムをStrongSwanに指示します。 これらの行を追加します。
ike=aes256-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha1,3des-sha1!
また、クライアントが予期せず切断した場合に「ぶら下がっている」接続をクリアするようにデッドピア検出を構成します。 次の行を追加します。
dpdaction=clear
dpddelay=300s
rekey=no
次に、サーバー(左側)側のIPSecパラメーターを構成します。 これをファイルに追加します。
left=%any
leftid=@server_name_or_ip
leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
注:サーバーID(leftid
)を構成するときは、VPNサーバーがドメイン名で識別される場合にのみ@
文字を含めてください。
leftid=@vpn.example.com
サーバーがIPアドレスで識別される場合は、IPアドレスを次のように入力します。
leftid=111.111.111.111
次に、使用するプライベートIPアドレス範囲やDNSサーバーなどのクライアント(右側)側のIPSecパラメーターを構成します。
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に、クライアントが接続するときにユーザーの資格情報を要求するように指示します。
eap_identity=%identity
構成ファイルは次のようになります。
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
ike=aes256-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha1,3des-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=@server_name_or_ip
leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightdns=8.8.8.8,8.8.4.4
rightsourceip=10.10.10.0/24
rightsendcert=never
eap_identity=%identity
図のように構成したことを確認したら、ファイルを保存して閉じます。
VPNパラメーターを構成したので、ユーザーがサーバーに接続できるようにアカウントの作成に移りましょう。
ステップ5—VPN認証の構成
VPNサーバーはクライアント接続を受け入れるように構成されていますが、まだ資格情報が構成されていないため、ipsec.secrets
という特別な構成ファイルでいくつか構成する必要があります。
- サーバーがデータを暗号化および復号化できるように、サーバー証明書の秘密鍵の場所をStrongSwanに通知する必要があります。
- また、VPNへの接続を許可されるユーザーのリストを設定する必要があります。
シークレットファイルを開いて編集しましょう。
- sudo nano /etc/ipsec.secrets
まず、StrongSwanに秘密鍵の場所を教えます。
server_name_or_ip : RSA "/etc/ipsec.d/private/vpn-server-key.pem"
次に、ユーザーの資格情報を作成します。 ユーザー名またはパスワードの任意の組み合わせを作成できますが、このユーザーがどこからでも接続できるようにStrongSwanに指示する必要があります。
your_username %any% : EAP "your_password"
ファイルを保存して閉じます。 VPNパラメータの操作が終了したので、VPNサービスをリロードして、構成が適用されるようにします。
- sudo ipsec reload
VPNサーバーがサーバーオプションとユーザー資格情報の両方で完全に構成されたので、次に最も重要な部分であるファイアウォールの構成に移ります。
ステップ6—ファイアウォールとカーネルのIP転送を構成する
VPNサーバーを構成したので、VPNトラフィックを転送して許可するようにファイアウォールを構成する必要があります。 これにはIPTablesを使用します。
まず、UFWを設定している場合は無効にします。これは、構成する必要のあるルールと競合する可能性があるためです。
- sudo ufw disable
次に、UFWによって作成された残りのファイアウォールルールをすべて削除します。
- iptables -P INPUT ACCEPT
- iptables -P FORWARD ACCEPT
- iptables -F
- iptables -Z
SSHセッションからロックアウトされるのを防ぐために、すでに受け入れられている接続を受け入れます。 また、サーバーへの将来のSSH接続のために、ポート22
(または構成したポート)を開きます。 次のコマンドを実行します。
- sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
また、ローカルループバックインターフェイスで接続を受け入れる必要があります。
- sudo iptables -A INPUT -i lo -j ACCEPT
次に、IPTablesにIPSec接続を受け入れるように指示します。
- sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT
- sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT
次に、VPNクライアントが接続できるように ESP (Encapsulating Security Payload)トラフィックを転送するようにIPTablesに指示します。 ESPは、VPNパケットが信頼できないネットワークを通過するときに、VPNパケットに追加のセキュリティを提供します。
- sudo iptables -A FORWARD --match policy --pol ipsec --dir in --proto esp -s 10.10.10.10/24 -j ACCEPT
- sudo iptables -A FORWARD --match policy --pol ipsec --dir out --proto esp -d 10.10.10.10/24 -j ACCEPT
私たちのVPNサーバーは、VPNクライアントとインターネットの間のゲートウェイとして機能します。 VPNサーバーにはパブリックIPアドレスが1つしかないため、サーバーがクライアントに代わってインターネットからデータを要求できるようにマスカレードを構成する必要があります。 これにより、トラフィックがVPNクライアントからインターネットに、またはその逆に流れることができます。
- sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
- sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -j MASQUERADE
一部のクライアントでIPパケットの断片化を防ぐために、IPTablesに、パケットの最大セグメントサイズを調整してパケットのサイズを減らすように指示します。 これにより、一部のVPNクライアントでの問題を防ぐことができます。
- sudo iptables -t mangle -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.10/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
セキュリティを強化するために、構成したルールに一致しない他のすべてを削除します。
- sudo iptables -A INPUT -j DROP
- sudo iptables -A FORWARD -j DROP
次に、ファイアウォール構成を永続化して、再起動時にすべての構成作業が消去されないようにします。
- sudo netfilter-persistent save
- sudo netfilter-persistent reload
最後に、サーバーでパケット転送を有効にします。 パケット転送は、サーバーが1つのIPアドレスから別のIPアドレスにデータを「ルーティング」することを可能にするものです。 基本的に、サーバーをルーターのように機能させています。
ファイル/etc/sysctl.conf
を編集します。
- sudo nano /etc/sysctl.conf
ここでいくつか設定する必要があります。
- まず、IPv4パケット転送を有効にします。
- パケットの断片化の問題を防ぐために、パスMTU探索を無効にします。
- また、中間者攻撃を防ぐために、ICMPリダイレクトを受け入れたりICMPリダイレクトを送信したりすることもありません。
ファイルに加える必要のある変更は、次のコードで強調表示されています。
. . .
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
. . .
# Do not accept ICMP redirects (prevent MITM attacks)
net.ipv4.conf.all.accept_redirects = 0
# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0
. . .
net.ipv4.ip_no_pmtu_disc = 1
これらの変更を行い、ファイルを保存して、エディターを終了します。 次に、サーバーを再起動します。
- sudo reboot
サーバーが再起動するとサーバーから切断されますが、それは予想されることです。 サーバーが再起動したら、root以外のsudoユーザーとしてサーバーに再度ログインします。 これで、クライアントで接続をテストする準備が整いました。
ステップ7– Windows、iOS、およびmacOSでのVPN接続のテスト
すべての設定が完了したので、試してみましょう。 まず、作成したルート証明書をコピーして、VPNに接続するクライアントデバイスにインストールする必要があります。 これを行う最も簡単な方法は、サーバーにログインして次のコマンドを実行し、証明書ファイルの内容を表示することです。
- cat ~/vpn-certs/server-root-ca.pem
次のような出力が表示されます。
Output-----BEGIN CERTIFICATE-----
MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE
. . .
EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
BayqOb/Q
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
および-----END CERTIFICATE-----
行を含むこの出力をコンピューターにコピーし、vpn_root_certificate.pem
などの認識可能な名前のファイルに保存します。 作成するファイルの拡張子が.pem
であることを確認してください。
または、SFTPを使用してファイルをコンピューターに転送します。
vpn_root_certificate.pem
ファイルをコンピューターにダウンロードしたら、VPNへの接続を設定できます。
Windowsから接続する
まず、次の手順に従ってルート証明書をインポートします。
-
WINDOWS+R
を押して実行ダイアログを表示し、mmc.exe
と入力してWindows管理コンソールを起動します。 -
ファイルメニューからスナップインの追加または削除に移動し、使用可能なスナップインのリストから証明書を選択して、追加[ X156X]。
-
VPNをすべてのユーザーと連携させたいので、コンピューターアカウントを選択し、次へをクリックします。
-
ローカルコンピューターで設定しているので、ローカルコンピューターを選択し、完了をクリックします。
-
コンソールルートノードで、証明書(ローカルコンピューター)エントリを展開し、信頼されたルート証明機関を展開して、証明書を選択します。エントリ:
-
アクションメニューからすべてのタスクを選択し、インポートをクリックして証明書のインポートウィザードを表示します。 次へをクリックして、紹介を通過します。
-
インポートするファイル画面で、参照ボタンを押して、保存した証明書ファイルを選択します。 次に、次へをクリックします。
-
証明書ストアが信頼されたルート証明機関に設定されていることを確認し、次へをクリックします。
-
完了をクリックして証明書をインポートします。
次に、次の手順でVPNを構成します。
- コントロールパネルを起動し、ネットワークと共有センターに移動します。
- 新しい接続またはネットワークのセットアップをクリックし、職場に接続するを選択します。
- インターネット接続(VPN)を使用するを選択します。
- VPNサーバーの詳細を入力します。 サーバーのドメイン名またはIPアドレスをインターネットアドレスフィールドに入力し、宛先名にVPN接続を説明するものを入力します。 次に、完了をクリックします。
新しいVPN接続がネットワークのリストの下に表示されます。 VPNを選択し、接続をクリックします。 ユーザー名とパスワードの入力を求められます。 それらを入力し、 OK をクリックすると、接続されます。
iOSから接続する
iOSデバイスでVPN接続を構成するには、次の手順に従います。
- ルート証明書を添付したメールを自分に送信します。
- iOSデバイスでメールを開き、添付の証明書ファイルをタップしてから、インストールをタップしてパスコードを入力します。 インストールしたら、完了をタップします。
- 設定、一般、 VPN に移動し、VPN構成の追加をタップします。 これにより、VPN接続構成画面が表示されます。
- Type をタップし、IKEv2を選択します。
- 説明フィールドに、VPN接続の短い名前を入力します。 これはあなたが好きなものなら何でもかまいません。
- サーバーおよびリモートIDフィールドに、サーバーのドメイン名またはIPアドレスを入力します。 ローカルIDフィールドは空白のままにすることができます。
- 認証セクションにユーザー名とパスワードを入力し、完了をタップします。
- 作成したVPN接続を選択し、ページ上部のスイッチをタップすると接続されます。
macOSから接続する
証明書をインポートするには、次の手順に従います。
- 証明書ファイルをダブルクリックします。 Keychain Access は、「KeychainAccessがシステムキーチェーンを変更しようとしています。 これを許可するには、パスワードを入力してください。」
- パスワードを入力し、キーチェーンの変更をクリックします
- 新しくインポートしたVPN証明書をダブルクリックします。 これにより、信頼レベルを指定できる小さなプロパティウィンドウが表示されます。 IPセキュリティ(IPSec)を常に信頼に設定すると、パスワードの入力を再度求められます。 この設定は、パスワードを入力すると自動的に保存されます。
証明書が重要で信頼できるので、次の手順でVPN接続を構成します。
- システム環境設定に移動し、ネットワークを選択します。
- ネットワークのリストの左下にある小さな「プラス」ボタンをクリックします。
- 表示されるポップアップで、InterfaceをVPNに設定し、 VPNTypeをIKEv2に設定して、接続に名前を付けます。
- サーバーおよびリモートIDフィールドに、サーバーのドメイン名またはIPアドレスを入力します。 ローカルIDは空白のままにします。
- 認証設定をクリックし、ユーザー名を選択して、VPNユーザー用に構成したユーザー名とパスワードを入力します。 次に、OKをクリックします。
最後に、接続をクリックしてVPNに接続します。 これで、VPNに接続されているはずです。
接続のトラブルシューティング
証明書をインポートできない場合は、ファイルに.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のこのガイドにも興味があるかもしれません。