strongSwan で IKEv2 VPN 備忘録です.

はじめに
これまで長いこと使ってきた Softether VPN ですが,残念なことに IKEv2 に対応していません.しかし,セキュリティ的に L2TP/IPSec をこれ以上使い続けるのもあまり望ましくはありませんし,実際 Android 13 からは L2TP/IPSec が排除されています.
したがって,そろそろ L2TP/IPSec は廃止して,IKEv2 に移行しなきゃならないな,とは思っていたのですが,最近,Softether VPN Server をメインテンスする機会がありましたので,合わせて IKEv2 への移行も行うことにしました.

構築環境
IKEv2 サーバソフトウェア
まず,IKEv2 Server を実現するソフトウェアは strongSwan です.

OS
strongSwan を実行する OS として,これまで Softether VPN Server として利用してきた Alpine Linux ver. 3.18.4 を使います.ただし,Softether VPN Server を廃止するのではなく,これまで通り Softether VPN で独自プロトコル,および MS-SSTP VPN 接続を提供し,StrongSwan で IKEv2 接続を提供します.
ネットワーク
strongSwan を実行するサーバはルータ(ファイヤーウォール)の背後,つまりプライベートネットワーク側に設置します.
プライベートネットワークは IPv4 のみをサポートする環境です.また,IP アドレスの配布や DNS Server などは既存の DHCP Server 等を出来る限り利用します.
さらに VPN 接続してきたクライアントは IPv4 による通信を全て VPN 接続先を経由して行うようにします.実は,当初は必要最低限の通信のみを VPN 接続先と行うよう設定を試みたのですが,全く上手くいかないか,できたとしてもクライアント側に設定を入れ込まなければならず断念しました.この辺りのことについて知りたい方は,Windows の場合は,

の記事を,macOS の場合は,

をご覧ください.
なお,本稿では,ルータの設定等については詳しくは記しません.基本的には,ESPプロトコルと UDP の500, 4500番ポートを IKEv2 Server と通信できるように設定を変更すれば良いだけのはずです(もちろん NAT とかの設定も必要).
クライアント
IKEv2 接続を行うクライアントとしては,本稿執筆時点で最新の比較的よく知られた OS 全てを仮定します.つまり,
- Windows 10/11
- macOS Sonoma / iOS 17 / iPad OS 17
- Android 13
- Linux (Ubuntu 22.04)
からの利用を前提とします.
サーバ証明書
strongSwan で IKEv2 Server を作る際,サーバ証明書が必要になりますが,今回これはあらかじめ用意してある正規のもの(中間証明とサーバ証明)を用います.
なお,証明書として,Let’s Encrypt のものや,オレオレ証明を使うこともできるようです.この辺りについては,
を参考にされてください.
IKEv2 認証方式
最後に,IKEv2 の認証方式については MS-CHAPv2 方式による ID とパスワードによるものとします.
本来ならクライアント証明等を用いた方が良いのだろうとは思いますが,この辺りについては理解が追いついていないので,今回は諦めました.と言うか,クライアントごとに証明書が必要になってきますし,その更新の問題も発生するので,正直面倒だってのもあります.
strongSwan の導入と設定
2025/1/1 追記:この節の内容は情報が古くなっており,現在の strongSwan の推奨設定ではありません.現在の推奨の設定の方法を以下の記事にまとめていますのでこちらを参照されてください.

導入方法
Alpine Linux の場合,strongSwan の導入は,以下のワンライナーです.
# apk add strongswan strongswan-openrc
ipsec.conf の設定
今回は strongSwan の設定を /etc/ipsec.conf ファイルで行います.今回は以下のように設定しました.
# ipsec.conf - strongSwan IPsec configuration file # basic configuration config setup # strictcrlpolicy=yes uniqueids = no # Add connections here. conn %default ike=aes128-sha256-ecp256,aes256-sha384-ecp384,aes128-sha256-modp2048,aes128-sha1-modp2048,aes256-sha384-modp4096,aes256-sha256-modp4096,aes256-sha1-modp4096,aes128-sha256-modp1536,aes128-sha1-modp1536,aes256-sha384-modp2048,aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha256-modp1024,aes128-sha1-modp1024,aes256-sha384-modp1536,aes256-sha256-modp1536,aes256-sha1-modp1536,aes256-sha384-modp1024,aes256-sha256-modp1024,aes256-sha1-modp1024! esp=aes128gcm16-ecp256,aes256gcm16-ecp384,aes128-sha256-ecp256,aes256-sha384-ecp384,aes128-sha256-modp2048,aes128-sha1-modp2048,aes256-sha384-modp4096,aes256-sha256-modp4096,aes256-sha1-modp4096,aes128-sha256-modp1536,aes128-sha1-modp1536,aes256-sha384-modp2048,aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha256-modp1024,aes128-sha1-modp1024,aes256-sha384-modp1536,aes256-sha256-modp1536,aes256-sha1-modp1536,aes256-sha384-modp1024,aes256-sha256-modp1024,aes256-sha1-modp1024,aes128gcm16,aes256gcm16,aes128-sha256,aes128-sha1,aes256-sha384,aes256-sha256,aes256-sha1! dpdaction=clear dpddelay=300s rekey=no conn IPSec-IKEv2 keyexchange=ikev2 compress=no type=tunnel fragmentation=yes forceencaps=yes left=%any4 leftsubnet=0.0.0.0/0 leftid=hogehoge.net leftcert=hogehoge.cer leftsendcert=always right=%any4 rightid=%any rightdns=192.168.0.1 rightsourceip=%dhcp auto=add conn IPSec-IKEv2-EAP also="IPSec-IKEv2" rightauth=eap-mschapv2 eap_identity=%any
各設定項目の詳細な説明は割愛しますが,以下いくつかの設定項目について注意をしておきます.
- leftsubnet=0.0.0.0/0 が全ての IPv4 の通信をVPN経由で行うための設定です.この部分を 192.168.0.0/24 とすれば 192.168.0.0/24 宛の通信のみVPNで行う設定となります.
- leftid=hogehoge.net にはサーバ証明書に記されているFQDNを記しています.
- leftcert=hogehoge.cer はサーバ証明書のファイル名です.
- rightsourceip=%dhcp でローカルの DHCP サーバを用いてクライアントに IP アドレスやゲートウェイの配布を行うことを示しています.この部分を 192.168.0.200 – 192.168.100.220 のように指定することもできます.
なお,ipsec.conf ファイルを用いて設定するのは「古いやり方」のようで,現在は /etc/strongswan.conf と /etc/strongswan.d 以下のファイルを用いての設定が推奨のようです.実際,今回もいくつかの設定はこれらのファイルを用いてやらざるを得ませんでした.
strongswan.conf の設定
同じ ID / PASSWORD を用いて複数の PC から「同時」に接続を許すために,/etc/strongswan.conf を以下の通り設定しました.
# strongswan.conf - strongSwan configuration file # # Refer to the strongswan.conf(5) manpage for details # # Configuration changes should be made in the included files charon { load_modular = yes plugins { include strongswan.d/charon/*.conf dhcp { identity_lease = no } } }
strongswan.d/charon/bypass-lan.conf の設定
IKEv2 サーバに接続したクライアントに適当な IP アドレスを割り当て,ローカルネットワークと機器とは NAT 経由で通信する
のような場合は不要(多分)なのではないかと思いますが,今回のようにクライアントに DHCP で直接ローカルネットワークの機器と同じサブネットのアドレスを配布する場合は,/etc/strongswan.d/charon/bypass-lan.conf の設定を無効化(bypass-lan プラグインを無効化)しないといけないようです.
bypass-lan { # A comma-separated list of network interfaces for which connected subnets # should be ignored, if interfaces_use is specified this option has no # effect. # interfaces_ignore = # A comma-separated list of network interfaces for which connected subnets # should be considered. All other interfaces are ignored. # interfaces_use = # Whether to load the plugin. Can also be an integer to increase the # priority of this plugin. load = no }
サーバ証明書の配置
サーバ証明書は以下のように配置すれば良いようです.
- /etc/ipsec.d/private/hogehoge.net.key: 秘密鍵
- /etc/ipsec.d/certs/hogehoge.net.cer: 公開鍵
- /etc/ipsec.d/cacerts/certauth.cer: 中間証明
ipsec.secrets の設定
クライアントが VPN 接続する際に用いる ID / PASSWORD の組みを /etc/ipsec.secrets に設定します.
# vi /etc/ipsec.secrets ----- # ipsec.secrets - strongSwan IPsec secrets file : RSA "hogehoge.net.key" user01 : EAP "xxxxxxxxxxxxxxxxxxxxxx" user02 : EAP "xxxxxxxxxxxxxxxxxxxxxx" ----- # chmod 600 /etc/ipsec.secrets
strongswan の起動と自動起動の設定
strongSwan を起動します.また,OS 再起動時に自動的に strongSwan が起動するようにします.
# rc-update add strongswan # /etc/init.d/strongswan start
クライアントの設定
macOS / iOS / iPadOS
macOS / iOS / iPadOS の場合は,「システム設定」の「VPN」の「VPN構成を追加」から「IKEv2」を選んで IKEv2 VPN の設定を行います.
設定する際注意しなければならないことは以下の通りです.
- リモートID: /etc/ipsec.conf の leftid に設定した内容を記す(今回の設定例だと hogehoge.net)
なお,macOS / iOS / iPadOS の場合,IKEv2 VPN 接続した時点で IPv6 での接続が行えなくなります.これは恐らく今回接続しているローカルネットワークが IPv4 のみをサポートしたネットワークだからなのではないかと思います.
実際,IKEv2 VPN 接続をする前と後は以下のように IPv6 Gateway が書き換えられてしまいます.
IKEv2 VPN 接続前 ----- $ netstat -rn .... Internet6: Destination Gateway Flags Netif Expire default fe80::ffff:ffff:ffff:fff1%en5 UGcg en5 default fe80::ffff:ffff:ffff:fff1%en0 UGcIg en0 default fe80::%utun0 UGcIg utun0 .... ----- IKEv2 VPN 接続後 ----- $ netstat -rn .... Internet6: Destination Gateway Flags Netif Expire default fe80::ffff:ffff:ffff:ffff%en5 UGcIg en5 default fe80::ffff:ffff:ffff:ffff%en0 UGcIg en0 default fe80::%utun0 UGcIg utun0 .... -----
したがって,改めて,
$ sudo route add -inet6 default fe80::ffff:ffff:ffff:ffff%en5
のように IPv6 のデフォルトゲートを設定すれば IPv6 の通信は VPN 接続前と同様に行えるようになります.
strongSwan の設定でこの辺りをなんとかできないか少し調べてはみたのですが,いまのところ見つかっていません.
Android 13
Android ver. 13 の場合は,「設定」アプリから「ネットワークとインターネット」「VPN」を選び,VPN のプロファイルを追加してやることで IKEv2 VPN 接続を設定できます.
設定する際注意しなければならないことは以下の通りです.
- タイプとして「IKEv2/IPSec MSCHAPv2」を選ぶ
- IPSecID に /etc/ipsec.conf の leftid に設定した内容を記す(今回の設定例だと hogehoge.net)
Android 13 の場合も macOS / iOS / iPadOS と同様に IKEv2 VPN 接続した時点で IPv6 での接続が行えなくなることを注意しておきます.
Windows 11
Windows 11 の場合は,「設定」「ネットワークとインターネット」「VPN」「VPN を追加」の順に選択すれば IKEv2 VPN 接続の設定を行えます.また,設定項目に特に注意しなければならないものもありません.
ただし,今回のように接続先が IPv4 のみのサポートの場合は,以下の手順で「インターネットプロトコルバージョン6 (TCP/IPv6)」を無効化しておけば,IKEv2 VPN 接続後も IPv6 接続を維持することができます.
Linux (Ubuntu 22.04)
Ubuntu の場合,IKEv2 のクライアントと GUI 設定アプリは,
$ sudo apt install network-manager-strongswan $ sudo apt install libcharon-extra-plugins
とすることで導入できます.
GUI 設定アプリで設定する際,気をつけなければならないことは以下の通りです.
- Authentification の項目は EAP (Username/Password) を選ぶ
- Option Algorithms として,Request an inner IP address と Enfore UDP encapsulation を選ぶ
- IPv6 設定を無効化する
Ubuntu 22.04 の場合も上記の通り設定することで IKEv4 VPN 接続の際,IPv6 接続が維持できています.
参考
今回設定するにあたって非常に参考になった記事を以下2つ記しておきます.

