前書き

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

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

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

前提条件

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

さらに、IPTablesに精通している必要があります。 続行する前にhttps://www.digitalocean.com/community/tutorials/how-the-iptables-firewall-works[Iptables Firewallの仕組み]を確認してください。

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

まず、VPNサーバーとして構成するオープンソースのIPSecデーモンであるStrongSwanをインストールします。 また、証明書ベースの認証ではなく、クライアントのパスワード認証を可能にするStrongSwan EAPプラグインもインストールします。 この構成の一部として特別なファイアウォールルールを作成する必要があるため、新しいファイアウォールルールを永続化できるユーティリティもインストールします。

次のコマンドを実行して、これらのコンポーネントをインストールします。

sudo apt-get install strongswan strongswan-plugin-eap-mschapv2 moreutils iptables-persistent

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

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

IKEv2サーバーには、クライアントに対して自身を識別するための証明書が必要です。 必要な証明書の作成を支援するために、StrongSwanには認証局とサーバー証明書を生成するユーティリティが付属しています。 まず、作業中のすべてのものを保存するディレクトリを作成しましょう。

mkdir vpn-certs
cd vpn-certs

すべてを保存するディレクトリができたので、ルートキーを生成しましょう。 これは、ルート認証局の署名に使用される4096ビットのRSAキーになるため、* root *ユーザーのみが読み取れるようにすることで、このキーを保護することも非常に重要です。

次のコマンドを実行して、キーを生成および保護します。

ipsec pki --gen --type rsa --size 4096 --outform pem >
chmod 600

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

ipsec pki --self --ca --lifetime 3650 \
--in server-root-key.pem \
--type rsa --dn "" \
--outform pem >

国、組織、一般名などの_識別名_(DN)の値は、必要に応じて別の値に変更できます。 ここでの一般名は単なるインジケータであるため、何かを構成することもできます。

後で、ルート証明書( + server-root-ca.pem +)をクライアントデバイスにコピーして、接続時にサーバーの信頼性を検証できるようにします。

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

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

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

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

ipsec pki --gen --type rsa --size 4096 --outform pem >

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

ipsec pki --pub --in  \
--type rsa | ipsec pki --issue --lifetime 1825 \
--cacert  \
--cakey  \
--dn "C=US, O=VPN Server, CN=" \
--san  \
--flag serverAuth --flag ikeIntermediate \
--outform pem >

StrongSwanが証明書を読み取ることができるパスに証明書をコピーします。

sudo cp ./
sudo cp ./

最後に、* root *ユーザーのみが読み取れるようにキーを保護します。

sudo chown root
sudo chgrp root
sudo chmod 600

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

ステップ4-StrongSwanの構成

必要な証明書はすべて作成済みであるため、StrongSwan自体を構成します。

StrongSwanにはデフォルトの構成ファイルがありますが、変更を行う前に、何か問題が発生した場合に備えて参照ファイルを作成できるように、まずバックアップを取りましょう。

sudo cp /etc/ipsec.conf

サンプルファイルは非常に長いため、設定の誤りを防ぐために、デフォルトの設定ファイルを消去し、独自の設定を最初から記述します。 最初に、元の構成を消去します。

echo '' | sudo tee /etc/ipsec.conf

次に、テキストエディターでファイルを開きます。

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

次に、StrongSwanに、VPNに使用する暗号化アルゴリズムを伝えます。 次の行を追加します。

/etc/ipsec.conf

 ike=aes256-sha1-modp1024,3des-sha1-modp1024!
 esp=aes256-sha1,3des-sha1!

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

/etc/ipsec.conf

 dpdaction=clear
 dpddelay=300s
 rekey=no

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

/etc/ipsec.conf

 left=%any
 leftid=
 leftcert=
 leftsendcert=always
 leftsubnet=0.0.0.0/0

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

/etc/ipsec.conf

 right=%any
 rightid=%any
 rightauth=eap-mschapv2
 rightsourceip=
 rightdns=
 rightsendcert=never

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

/etc/ipsec.conf

 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
   ike=aes256-sha1-modp1024,3des-sha1-modp1024!
   esp=aes256-sha1,3des-sha1!
   dpdaction=clear
   dpddelay=300s
   rekey=no
   left=%any
   leftid=
   leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
   leftsendcert=always
   leftsubnet=
   right=%any
   rightid=%any
   rightauth=eap-mschapv2
   rightdns=
   rightsourceip=
   rightsendcert=never
   eap_identity=%identity

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

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

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

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

  • サーバーがデータを暗号化および復号化できるように、サーバー証明書の秘密キーの場所をStrongSwanに伝える必要があります。

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

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

sudo nano /etc/ipsec.secrets

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

/etc/ipsec.secrets

: RSA

次に、ユーザー資格情報を作成します。 任意のユーザー名またはパスワードの組み合わせを作成できますが、このユーザーがどこからでも接続できるようにStrongSwanに指示する必要があります。

/etc/ipsec.secrets

%any% : EAP

ファイルを保存して閉じます。 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  -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

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

sudo iptables -A FORWARD --match policy --pol ipsec --dir in  --proto esp -s  -j ACCEPT
sudo iptables -A FORWARD --match policy --pol ipsec --dir out --proto esp -d  -j ACCEPT

VPNサーバーは、VPNクライアントとインターネット間のゲートウェイとして機能します。 VPNサーバーにはパブリックIPアドレスが1つしかないため、クライアントに代わってサーバーがインターネットからのデータを要求できるようにマスカレードを構成する必要があります。これにより、VPNクライアントからインターネットにトラフィックが流れるようになります。

sudo iptables -t nat -A POSTROUTING -s  -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s  -o eth0 -j MASQUERADE

一部のクライアントでIPパケットの断片化を防ぐために、IPTablesに、パケットの最大セグメントサイズを調整してパケットのサイズを小さくするように指示します。 これにより、一部のVPNクライアントの問題が回避されます。

sudo iptables -t mangle -A FORWARD --match policy --pol ipsec --dir in -s  -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ディスカバリを無効にします。

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

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

/etc/sysctl.conf

. . .

# Uncomment the next line to enable packet forwarding for IPv4


. . .

# Do not accept ICMP redirects (prevent MITM attacks)

# Do not send ICMP redirects (we are not a router)


. . .

これらの変更を行い、ファイルを保存して、エディターを終了します。 その後、サーバーを再起動します。

sudo reboot

再起動するとサーバーから切断されますが、それは当然のことです。 サーバーの再起動後、sudoの非rootユーザーとしてサーバーに再度ログインします。 クライアントで接続をテストする準備が整いました。

ステップ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 +」であることを確認してください。

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

`+ vpn root certificate.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]をクリックすると、接続されます。

iOSから接続する

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

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

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

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

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

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

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

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

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

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に接続されます。

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

証明書をインポートできない場合は、ファイルの拡張子が「+ .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のこのガイド]にも興味があるかもしれません。