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

前書き

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

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

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

前提条件

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

  • sudo非rootユーザーとファイアウォールを含むthe Ubuntu 16.04 initial server setup guideをフォローすることによって構成された、複数のCPUを備えた1つのUbuntu16.04サーバー。

さらに、IPTablesに精通している必要があります。 続行する前に、How the Iptables Firewall Worksを確認してください。

[[step-1 -—- installing-strongswan]] ==ステップ1—StrongSwanのインストール

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

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

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

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

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

[[step-2 -—- creating-a-certificate-authority]] ==ステップ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

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

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

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

[[step-3 -—- generate-a-certificate-for-the-vpn-server]] ==ステップ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サーバーの信頼性を確認できます。 すべての証明書の準備ができたので、ソフトウェアの構成に進みます。

[[step-4 -—- configuring-strongswan]] ==ステップ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に、デバッグのためにデーモンステータスを記録し、重複した接続を許可するように指示します。 これらの行をファイルに追加します。

/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=@server_name_or_ip
  leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
  leftsendcert=always
  leftsubnet=0.0.0.0/0

[。注意]##

Note:サーバーID(leftid)を構成するとき、VPNサーバーがドメイン名で識別される場合にのみ@文字を含めます。

サーバーが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パラメーターを構成したので、ユーザーがサーバーに接続できるようにアカウントの作成に移りましょう。

[[step-5 -—- configuring-vpn-authentication]] ==ステップ5—VPN認証の構成

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

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

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

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

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サービスをリロードします。

sudo ipsec reload

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

[[step-6 -—- configuring-the-firewall-amp-kernel-ip-forwarding]] ==ステップ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パケットが信頼できないネットワークを通過するときに追加のセキュリティを提供します。

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ディスカバリを無効にします。

  • また、man-in-the-middle攻撃を防ぐために、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

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

sudo reboot

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

[[step-7 -–- testing-the-vpn-connection-on-windows-ios-and-macos]] ==ステップ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であることを確認してください。

vpn_root_certificate.pemファイルをコンピューターにダウンロードしたら、VPNへの接続をセットアップできます。

Windowsから接続する

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

  1. WINDOWS+Rを押してRunダイアログを表示し、mmc.exeと入力してWindows管理コンソールを起動します。

  2. FileメニューからAdd or Remove Snap-inに移動し、使用可能なスナップインのリストからCertificatesを選択して、Addをクリックします。

  3. VPNを任意のユーザーと連携させたいので、Computer Accountを選択し、Nextをクリックします。

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

  5. Console Rootノードの下で、Certificates (Local Computer)エントリを展開し、Trusted Root Certification Authoritiesを展開してから、Certificatesエントリを選択します。
    Certificates view

  6. ActionメニューからAll Tasksを選択し、Importをクリックして、証明書のインポートウィザードを表示します。 Nextをクリックして、紹介を通過します。

  7. File to Import画面で、Browseボタンを押して、保存した証明書ファイルを選択します。 次に、Nextをクリックします。

  8. Certificate StoreTrusted Root Certification Authoritiesに設定されていることを確認し、Nextをクリックします。

  9. Finishをクリックして証明書をインポートします。

次に、次の手順でVPNを構成します。

  1. Control Panelを起動し、Network and Sharing Centerに移動します。

  2. Set up a new connection or networkをクリックしてから、Connect to a workplaceを選択します。

  3. Use my Internet connection (VPN)を選択します。

  4. VPNサーバーの詳細を入力します。 サーバーのドメイン名またはIPアドレスをInternet addressフィールドに入力し、Destination nameにVPN接続を説明するものを入力します。 次に、Doneをクリックします。

新しいVPN接続がネットワークのリストの下に表示されます。 VPNを選択し、Connectをクリックします。 ユーザー名とパスワードの入力を求められます。 それらを入力し、OKをクリックすると、接続されます。

iOSから接続する

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

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

  2. iOSデバイスでメールを開き、添付の証明書ファイルをタップしてから、Installをタップしてパスコードを入力します。 インストールしたら、Doneをタップします。

  3. SettingsGeneralVPNに移動し、Add VPN Configurationをタップします。 これにより、VPN接続構成画面が表示されます。

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

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

  6. [Server]および[Remote ID]フィールドに、サーバーのドメイン名またはIPアドレスを入力します。 Local IDフィールドは空白のままにすることができます。

  7. Authenticationセクションにユーザー名とパスワードを入力し、Doneをタップします。

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

macOSからの接続

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

  1. 証明書ファイルをダブルクリックします。 Keychain Accessがポップアップし、「キーチェーンアクセスがシステムキーチェーンを変更しようとしています。 これを許可するにはパスワードを入力してください。」

  2. パスワードを入力し、Modify Keychainをクリックします

  3. 新しくインポートされたVPN証明書をダブルクリックします。 これにより、信頼レベルを指定できる小さなプロパティウィンドウが表示されます。 IP Security (IPSec)Always Trustに設定すると、パスワードの入力を再度求められます。 この設定は、パスワードを入力すると自動的に保存されます。

証明書が重要で信頼されたので、次の手順でVPN接続を構成します。

  1. System Preferencesに移動し、Networkを選択します。

  2. ネットワークのリストの左下にある小さな「プラス」ボタンをクリックします。

  3. 表示されるポップアップで、InterfaceVPNに設定し、VPN TypeIKEv2に設定して、接続に名前を付けます。

  4. [Server]および[Remote ID]フィールドに、サーバーのドメイン名またはIPアドレスを入力します。 Local IDは空白のままにします。

  5. Authentication Settingsをクリックし、Usernameを選択して、VPNユーザー用に構成したユーザー名とパスワードを入力します。 次に、OKをクリックします。

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

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

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

VPNに接続できない場合は、使用したサーバー名またはIPアドレスを確認してください。 サーバーのドメイン名またはIPアドレスは、証明書の作成時に一般名(CN)として設定したものと一致する必要があります。 一致しない場合、VPN接続は機能しません。 CNがvpn.example.comの証明書を設定した場合、VPNサーバーの詳細を入力するときにmustvpn.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にも興味があるかもしれません。