さくらVPS上のUbuntuにstrongswanでIKEv2 VPNサーバー(証明書認証)を構築する

2018年4月11日VPNサーバーIPSec, strongswan, VPN, VPS, さくらインターネット

普段はUbuntu上に構成したStrongswanを用いているのだが、さくらのVPSで構築したOpenVPNサーバーが意外と良かったので、今回はstrongswanでIPSecなVPNサーバーを構築していく。
なぜLibreswanやopenswanを使わないかというと、自宅サーバーに構築をした際になぜかうまくいかなかったから。strongswanのほうが継続的開発が行われていることもあり、こちらをオススメしたい。

strongswanのインストール

aptで実施。

インストール自体はこれで終了だ。なお、必要に応じていくつかモジュールをいれる必要があるが、基本的には自動でインストールされるはずである。

証明書の用意

今回はクライアント証明書を用いた認証を行うので、そのための証明書を用意していく。
CA証明書を作成したあとにクライアント証明書を作成し、必要なファイルをPKCS12形式にまとめてあげるだけだ。

なお、証明書たちは全て「/etc/ipsec.d/」の決められたフォルダのなかに格納しなくてはならない点に注意。

CA用秘密鍵とCA証明書の作成

ipsecコマンドで実施する。

これでルートCA証明書用の秘密鍵ができあがった。これに自己署名をする形で、証明書を生成する。

中身を一応コマンドで確認してみる。

きちんと作成されていることが確認出来る。

サーバー証明書の作成

続いて、サーバー証明書の作成を行う。まずは秘密鍵から。

続いて、サーバー証明書に先ほどのCA証明書を用い署名をする。ここで重要なのは、CA証明書とCNの値を合わせること。sanオプションについても同様。とくにMacやiOSでは、この部分がシビアに見られる。

“–flag serverAuth”はWindowsのために、”–flag ikeIntermediate”はMacの古いバージョンのために必要。

クライアント証明書の作成

上記で作成したCA証明書を用いて、クライアント証明書を作成していく。なお、ここの部分はどこに保存しても構わない。

まずは暗号鍵を作成してあげる。

そして、これを先ほどのCA証明書を用いて署名をする。なお、ここで入力するCNとSANは、両方ともuser@(…)の形式を採用すること。
ちなみに、sanは複数指定することが可能である。

あとは、クライアント証明書用秘密鍵・クライアント証明書・CA証明書をまとめてPKCS12形式に固める。のだが、CA証明書をder形式で作ってしまっているため、先にこれをpem形式に変更しておく。

気を取り直して、PKCS12形式を作成。

これでP12ファイルが作成された。
おさらいしておくと、作ったファイルは次の通りだ。

ファイル 内容
/etc/ipsec.d/private/caprivatekey.der CA証明書用秘密鍵
/etc/ipsec.d/cacerts/cacert.der CA証明書
/etc/ipsec.d/cacerts/cacert.pem CA証明書(PEM形式)
/etc/ipsec.d/private/serverkey.der サーバー証明書用秘密鍵
/etc/ipsec.d/certs/servercert.der サーバー証明書
client.pem クライアント証明書用秘密鍵
clientcert.pem クライアント証明書
sakura.p12 PKCS12形式(クライアント証明書+秘密鍵+CA証明書)

P12ファイルはあらかじめiPhone等に転送をしインストールしておこう。

ipsec.secretsの編集

事前秘密鍵(ないし事前パスワード)を設定するファイルが、/etc/ipsec.secretsである。ここにはサーバー証明書の秘密鍵を配置してあげる。

ipsec.confの編集

今回はIKEv2を採用するので、IKEv2用に次のような設定をした。

Mac、Windows、iOS等に対応しつつ、割り当てるIPは192.168.200.100/26としている。DNSはGoogle DNSを利用。

ちなみに、パスワード認証を併用したい場合は、次の設定をいれておけば大丈夫だ。

IPtablesの設定変更

最後に、iptablesの設定をする。接続ポートは500と4500。また、NATをきちんと設定することで、外部ネットワークへきちんと接続出来るようにした。今回は、先に記載したとおり192.168.200.0/24をVPN用のアドレスとして利用する。

サービスを開始し、クライアントに証明書をインストールする

ここまできたら、サービスを開始しよう。

状況を確認し、エラーがなければクライアント端末に以下の2つをインストールする。

  • PKCS12形式のファイル
  • サーバー証明書

Macの場合、サーバー証明書を「常に信頼する」にすれば、p12ファイルは自動的に信頼される形となっている。「キーチェーンアクセス」を用いて、サーバー証明書を手動で信頼設定にする。

keychain-w489

これにより、自動的にP12ファイルのほうも信頼される形となる。
ちなみに、iOSの場合はP12ファイルをメールに添付し送付すれば問題ない。

クライアント端末からアクセスする

最後に、クライアント端末からアクセスをしよう。次のような形で、先ほどクライアント証明書を作成する際に「CN」 で使用した値を「ローカルID」に指定する。リモートIDには、サーバー証明書の「CN」で使用した値を入れる(なお、両方ともSANで指定したエイリアスでも問題ない)。

settings-client-w387

接続をして、次のようになれば成功だ。

これで証明書を用いたIKEv2を使用したVPNをVPS上に構築することが出来る。自宅の環境よりも安定しているようで、非常に速い速度が出ているような気がする。本格的な速度は、OpenVPNなどとも比較してみることとしたい。