strongSwan で IKEv2 VPN 備忘録(その2)です.
はじめに
strongSwan ver.5.8.0 から推奨になった strongswan-sanctl で MS-CHAPv2 方式での IKEv2 VPN サーバーを構築してみた備忘録です.
Modern Unit と Legacy Unit
strongSwan ver. 5.8.0 より,systemd service unit の strongSwan のユニット名が strongswan-swanctl に変更となり,合わせて設定も swanctl.conf を用いたものに変更となりました.これが modern unit です.
これに対して以前の legacy unit は strongswan-starter と呼ばれていて,以前の記事,
はこの strongswan-starter を用いる前提でした.
今回,この設定を改めて modern unit である strongswan-swanctl でやり直してみましたので,以下,その設定について解説します.
strongswan-swanctl の設定
以前の記事との関係
今回の記事は,
からの変更点のみ記します.変更があるのは「strongSwan の導入と設定」の部分だけです.
導入方法
前回は Alpine Linux に導入しましたが,今回は,Debian ver. 12 (Bookworm) を前提とします(正確には DietPi で構築していますが,DietPi は Bookworm ベースなので違いはないはずです).
strongSwan の導入は以下のようにパッケージを導入するだけです.
$ sudo apt install charon-cmd charon-systemd libcharon-extauth-plugins libcharon-extra-plugins libstrongswan-extra-plugins libstrongswan-standard-plugins strongswan-charon
なお,本稿執筆時点で導入される ver. は 5.9.8 でした(strongSwan 自体は ver. 6 がすでに出ています).
ikev2-mschapv2.conf の設定
以下の内容のファイルを /etc/swanctl/conf.d に配置します.なお,****.conf の形式であればファイル名は他のものでも構いません.また,sercrets 以下はクライアントが VPN 接続する際に用いる ID / PASSWORD の組です.
$ sudo vi /etc/swanctl/conf.d/ikev2-mschapv2.conf connections { eap-mschapv2 { version = 2 encap = yes dpd_delay = 30s send_cert = always pools = dhcp local { auth = pubkey id = hogehoge.net certs = hogehoge.cer } remote { auth = eap-mschapv2 eap_id = %any } children { eap-mschapv2 { local_ts = 0.0.0.0/0 } } } } secrets { eap-mschapv2-user01 { id = user01 secret = "xxxxxxxxxxxxxxxxxxxxxx" } eap-mschapv2-user02 { id = user02 secret = "xxxxxxxxxxxxxxxxxxxxxx" } }
なお,legacy unit のときは,
- connections の内容: /etc/ipsec.conf に記述
- secrets の内容: /etc/ipsec.secrets に記述
でしたが,書き方が大きく変わっています.また,modern unit でも /etc/ipsec.secrets を設置する場合は secrets 以下は記さなくても構わないようです.
strongswan.conf の設定
この部分は以前の記事と同じですが,記事を行き来するのが面倒だとおもいますので,そのまま同じ内容を記します./etc/strongswan.conf を以下の通り設定します.
$ sudo vi /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 の設定
これも前回の記事と同じです.クライアントに DHCP で直接ローカルネットワークの機器と同じサブネットのアドレスを配布する場合は以下の設定が必要です.
$ sudo vi /etc/strongswan.d/charon/bypass-lan.conf 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 }
strongswan.d/charon-logging.conf の設定
この設定は前回の記事からの追加です./var/log/charon.log にログを残す設定です.長いので後半は端折っています.
$ sudo vi /etc/strongswan.d/charon-logging.conf charon { # Section to define file loggers, see LOGGER CONFIGURATION in # strongswan.conf(5). filelog { # <name> may be the full path to the log file if it only contains # characters permitted in section names. Is ignored if path is # specified. charon { # Loglevel for a specific subsystem. # <subsystem> = <default> # If this option is enabled log entries are appended to the existing # file. append = no # Default loglevel. default = 1 # Enabling this option disables block buffering and enables line # buffering. # flush_line = no # Prefix each log entry with the connection name and a unique # numerical identifier for each IKE_SA. ike_name = yes # Add the log level of each message after the subsystem (e.g. # [IKE2]). # log_level = no # Optional path to the log file. Overrides the section name. Must be # used if the path contains characters that aren't allowed in # section names. path = /var/log/charon.log # Adds the milliseconds within the current second after the # timestamp (separated by a dot, so time_format should end with %S # or %T). # time_add_ms = no # Prefix each log entry with a timestamp. The option accepts a # format string as passed to strftime(3). time_format = %b %e %T } } ....
サーバ証明書の配置
サーバー証明書は以下に配置すれば良いようです.必ず証明書の Common Name (CN) の値を VPN サーバーのインターネット側からアクセス可能なホスト名 (FQDN) にするようにしてください.また,前回と同様に,これはオレオレ証明ではなく,正規の証明書を使う前提です.
- /etc/swanctl/private: 秘密鍵
- /etc/swanctl/x509: 公開鍵
- /etc/swanctl/x509ca: 中間証明
strongswan の起動と自動起動の設定
以前の legacy unit を使用していた場合は,まず,
$ sudo systemctl stop strongswan-starter.service $ sudo systemctl disable strongswan-starter.service
として旧ユニットが起動しないようにしてください.
新ユニットを起動するには,
$ sudo systemctl stop strongswan.service $ sudo systemctl enable strongswan.service
とするだけです.
なお,以下の記事によると,一度旧ユニットで起動してしまうと,新ユニットが起動しなくなること,また,その対策について記されていますが,私の場合は特に問題なく起動してきましたので,ディストリビューションによる違いなのかもしれません(細かくは調べていません).
接続ステータス等の確認
旧ユニットのときは,接続ステータスの確認は ipsec statusall で調べていましたが,新ユニットの場合は swanctl コマンドを使って以下のように行うようです.
まず,接続設定については以下の通りです.
$ sudo swanctl --list-conns eap-mschapv2: IKEv2, no reauthentication, rekeying every 14400s, dpd delay 30s local: %any remote: %any local public key authentication: id: hogehoge.net certs: C=JP, ST=*****, L=*****, O=*****, CN=hogehoge.net remote EAP_MSCHAPV2 authentication: eap_id: %any eap-mschapv2: TUNNEL, rekeying every 3600s, dpd action is none local: 0.0.0.0/0 remote: dynamic
確立した IPSec トンネルの詳細は以下の通り.
$ sudo swanctl --list-sas eap-mschapv2: #18, ESTABLISHED, IKEv2, ***********_i ***********_r* local 'hogehoge.net' @ 192.168.0.100[4500] remote '192.168.0.***' @ 172.20.1.1[64942] EAP: 'user01' [192.168.0.***] AES_CBC-256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256 established 3s ago, rekeying in 14216s eap-mschapv2: #2, reqid 1, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-256 installed 3s ago, rekeying in 3367s, expires in 3957s in cee7e9ca, 50098 bytes, 226 packets, 0s ago out 02ca409f, 98813 bytes, 193 packets, 0s ago local 0.0.0.0/0 remote 192.168.0.***/32
証明書の認識状況は以下の通りです.
$ sudo swanctl --list-certs List of X.509 End Entity Certificates subject:......
おわりに
新ユニットになって随分設定がシンプルになった気がします.
なお,旧ユニットから新ユニットに設定を変更したのは,実は単に新しい設定を試してみたかったからではなくて,ikev2 を証明書による認証に対応させたかったからというのが元々の動機です.旧ユニットだとこれがどうしてもうまくいきませんでした.
一応,この証明書を用いた認証についても,現在一応設定できていて,現在,不具合がないかをいろいろ試してみている最中なので,これが一段落したらまた記事にしたいと思っています.
以上!