序章

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

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

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

前提条件

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

さらに、IPTablesに精通している必要があります。 先に進む前に、IptablesFirewallの仕組みを確認してください。

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

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

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

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

iptables-persistentのインストール中に、インストーラーは現在のIPv4およびIPv6ルールを保存するかどうかを尋ねます。 以前のファイアウォール構成を同じままにしておきたいので、両方のプロンプトで[はい]を選択します。

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

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

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

  1. mkdir vpn-certs
  2. cd vpn-certs

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

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

  1. ipsec pki --gen --type rsa --size 4096 --outform pem > server-root-key.pem
  2. chmod 600 server-root-key.pem

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

  1. ipsec pki --self --ca --lifetime 3650 \
  2. --in server-root-key.pem \
  3. --type rsa --dn "C=US, O=VPN Server, CN=VPN Server Root CA" \
  4. --outform pem > server-root-ca.pem

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

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

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

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

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

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

  1. ipsec pki --gen --type rsa --size 4096 --outform pem > vpn-server-key.pem

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

  1. ipsec pki --pub --in vpn-server-key.pem \
  2. --type rsa | ipsec pki --issue --lifetime 1825 \
  3. --cacert server-root-ca.pem \
  4. --cakey server-root-key.pem \
  5. --dn "C=US, O=VPN Server, CN=server_name_or_ip" \
  6. --san server_name_or_ip \
  7. --flag serverAuth --flag ikeIntermediate \
  8. --outform pem > vpn-server-cert.pem

証明書を、StrongSwanが証明書を読み取れるパスにコピーします。

  1. sudo cp ./vpn-server-cert.pem /etc/ipsec.d/certs/vpn-server-cert.pem
  2. sudo cp ./vpn-server-key.pem /etc/ipsec.d/private/vpn-server-key.pem

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

  1. sudo chown root /etc/ipsec.d/private/vpn-server-key.pem
  2. sudo chgrp root /etc/ipsec.d/private/vpn-server-key.pem
  3. sudo chmod 600 /etc/ipsec.d/private/vpn-server-key.pem

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

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

必要なすべての証明書をすでに作成しているので、StrongSwan自体を構成するときが来ました。

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

  1. sudo cp /etc/ipsec.conf /etc/ipsec.conf.original

サンプルファイルは非常に長いため、設定ミスを防ぐために、デフォルトの設定ファイルをクリアして、独自の設定を最初から作成します。 まず、元の構成をクリアします。

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

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

  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

次に、VPNに使用する暗号化アルゴリズムをStrongSwanに指示します。 これらの行を追加します。

/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=@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パラメーターを構成します。

/etc/ipsec.conf
  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
  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=@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への接続を許可されるユーザーのリストを設定する必要があります。

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

  1. sudo nano /etc/ipsec.secrets

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

/etc/ipsec.secrets
server_name_or_ip : RSA "/etc/ipsec.d/private/vpn-server-key.pem"

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

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

ファイルを保存して閉じます。 VPNパラメータの操作が終了したので、VPNサービスをリロードして、構成が適用されるようにします。

  1. sudo ipsec reload

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

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

VPNサーバーを構成したので、VPNトラフィックを転送して許可するようにファイアウォールを構成する必要があります。 これにはIPTablesを使用します。

まず、UFWを設定している場合は無効にします。これは、構成する必要のあるルールと競合する可能性があるためです。

  1. sudo ufw disable

次に、UFWによって作成された残りのファイアウォールルールをすべて削除します。

  1. iptables -P INPUT ACCEPT
  2. iptables -P FORWARD ACCEPT
  3. iptables -F
  4. iptables -Z

SSHセッションからロックアウトされるのを防ぐために、すでに受け入れられている接続を受け入れます。 また、サーバーへの将来のSSH接続のために、ポート22(または構成したポート)を開きます。 次のコマンドを実行します。

  1. sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  2. sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

また、ローカルループバックインターフェイスで接続を受け入れる必要があります。

  1. sudo iptables -A INPUT -i lo -j ACCEPT

次に、IPTablesにIPSec接続を受け入れるように指示します。

  1. sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT
  2. sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT

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

  1. sudo iptables -A FORWARD --match policy --pol ipsec --dir in --proto esp -s 10.10.10.10/24 -j ACCEPT
  2. 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クライアントからインターネットに、またはその逆に流れることができます。

  1. sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
  2. sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -j MASQUERADE

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

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

セキュリティを強化するために、構成したルールに一致しない他のすべてを削除します。

  1. sudo iptables -A INPUT -j DROP
  2. sudo iptables -A FORWARD -j DROP

次に、ファイアウォール構成を永続化して、再起動時にすべての構成作業が消去されないようにします。

  1. sudo netfilter-persistent save
  2. sudo netfilter-persistent reload

最後に、サーバーでパケット転送を有効にします。 パケット転送は、サーバーが1つのIPアドレスから別のIPアドレスにデータを「ルーティング」することを可能にするものです。 基本的に、サーバーをルーターのように機能させています。

ファイル/etc/sysctl.confを編集します。

  1. sudo nano /etc/sysctl.conf

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

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

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

/etc/sysctl.conf

. . .

# 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

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

  1. sudo reboot

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

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

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

  1. 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から接続する

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

  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 をクリックすると、接続されます。

iOSから接続する

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

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

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に接続されているはずです。

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

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