strongSwan で IKEv2 VPN 備忘録(その2)

Networks
Photo by hyt.

strongSwan で IKEv2 VPN 備忘録(その2)です.

図解即戦力 暗号と認証のしくみと理論がこれ1冊でしっかりわかる教科書
図解即戦力 暗号と認証のしくみと理論がこれ1冊でしっかりわかる教科書

はじめに

strongSwan ver.5.8.0 から推奨になった strongswan-sanctl で MS-CHAPv2 方式での IKEv2 VPN サーバーを構築してみた備忘録です.

Amazon | TP-Link Omada ギガビット マルチWAN VPNルーター ER605 | TP-Link | 無線・有線LANルーター 通販
TP-Link Omada ギガビット マルチWAN VPNルーター ER605が無線・有線LANルーターストアでいつでもお買い得。当日お急ぎ便対象商品は、当日お届け可能です。アマゾン配送商品は、通常配送無料(一部除く)。

Modern Unit と Legacy Unit

strongSwan ver. 5.8.0 より,systemd service unit の strongSwan のユニット名が strongswan-swanctl に変更となり,合わせて設定も swanctl.conf を用いたものに変更となりました.これが modern unit です.

Version 5.8.0 - strongSwan
Redmine

これに対して以前の legacy unit は strongswan-starter と呼ばれていて,以前の記事,

strongSwan で IKEv2 VPN 備忘録
strongSwan で IKEv2 VPN 備忘録です.はじめにこれまで長いこと使ってきた Softether VPN ですが,残念なことに IKEv2 に対応していません.しかし,セキュリティ的に L2TP/IPSec をこれ以上使い続...

はこの strongswan-starter を用いる前提でした.

今回,この設定を改めて modern unit である strongswan-swanctl でやり直してみましたので,以下,その設定について解説します.

Amazon.co.jp: ヤマハルーターでつくるインターネットVPN [第5版] eBook : 井上 孝司, のびきよ, ヤマハ株式会社(協力): Kindleストア
Amazon.co.jp: ヤマハルーターでつくるインターネットVPN eBook : 井上 孝司, のびきよ, ヤマハ株式会社(協力): Kindleストア

strongswan-swanctl の設定

以前の記事との関係

今回の記事は,

strongSwan で IKEv2 VPN 備忘録
strongSwan で IKEv2 VPN 備忘録です.はじめにこれまで長いこと使ってきた Softether VPN ですが,残念なことに IKEv2 に対応していません.しかし,セキュリティ的に L2TP/IPSec をこれ以上使い続...

からの変更点のみ記します.変更があるのは「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

とするだけです.

なお,以下の記事によると,一度旧ユニットで起動してしまうと,新ユニットが起動しなくなること,また,その対策について記されていますが,私の場合は特に問題なく起動してきましたので,ディストリビューションによる違いなのかもしれません(細かくは調べていません).

strongSwan で iOS 対応の VPN を作成する(charon-systemd 版) | seinolab
Technology, mechanism and ideas.

接続ステータス等の確認

旧ユニットのときは,接続ステータスの確認は 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:......
Amazon.co.jp

おわりに

新ユニットになって随分設定がシンプルになった気がします.

なお,旧ユニットから新ユニットに設定を変更したのは,実は単に新しい設定を試してみたかったからではなくて,ikev2 を証明書による認証に対応させたかったからというのが元々の動機です.旧ユニットだとこれがどうしてもうまくいきませんでした.

一応,この証明書を用いた認証についても,現在一応設定できていて,現在,不具合がないかをいろいろ試してみている最中なので,これが一段落したらまた記事にしたいと思っています.

以上!

NetworksServer
スポンサーリンク
Following hyt!
タイトルとURLをコピーしました