strongSwan で IKEv2 VPN 備忘録

Networks
Photo by hyt.

strongSwan で IKEv2 VPN 備忘録です.

はじめに

これまで長いこと使ってきた Softether VPN ですが,残念なことに IKEv2 に対応していません.しかし,セキュリティ的に L2TP/IPSec をこれ以上使い続けるのもあまり望ましくはありませんし,実際 Android 13 からは L2TP/IPSec が排除されています.

したがって,そろそろ L2TP/IPSec は廃止して,IKEv2 に移行しなきゃならないな,とは思っていたのですが,最近,Softether VPN Server をメインテンスする機会がありましたので,合わせて IKEv2 への移行も行うことにしました.

L2TP/IPSec と SSTP VPN を SoftetherVPN 開発版 on Alpine Linux で使う備忘録
L2TP/IPSec と SSTP VPN を SoftetherVPN 開発版 on Alpine Linux で使う備忘録です. これまで長く利用してきた Softether VPN のメインテナンスを行ったのですが,その L2TP/I...

構築環境

IKEv2 サーバソフトウェア

まず,IKEv2 Server を実現するソフトウェアは strongSwan です.

strongSwan - IPsec VPN for Linux, Android, FreeBSD, macOS, Windows
strongSwan is an open-source, modular and portable IPsec-based VPN solution

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 の場合は,

How to Enable VPN Split Tunneling in Windows 10
A complete guide to set up VPN split tunneling on Windows 10: edit VPN or router properties, use PowerShell or a commerc...

の記事を,macOS の場合は,

Native IKEv2 macOS implementation routes ALL traffic over the VPN tunnel
We wanted to upgrade our existing L2TP connections to IKEv2 for connecting to our corporate servers. The problem is as f...

をご覧ください.

なお,本稿では,ルータの設定等については詳しくは記しません.基本的には,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 のものや,オレオレ証明を使うこともできるようです.この辺りについては,

strongSwanでLet’s Encrypt証明書を使ったIKEv2 VPNサーバーを作る – World203

を参考にされてください.

IKEv2 認証方式

最後に,IKEv2 の認証方式については MS-CHAPv2 方式による ID とパスワードによるものとします.

本来ならクライアント証明等を用いた方が良いのだろうとは思いますが,この辺りについては理解が追いついていないので,今回は諦めました.と言うか,クライアントごとに証明書が必要になってきますし,その更新の問題も発生するので,正直面倒だってのもあります.

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
        fragmentation=yes
    auto=add

conn IPSec-IKEv2-EAP
    also="IPSec-IKEv2"
    rightauth=eap-mschapv2
    eap_identity=%any
    auto=add

各設定項目の詳細な説明は割愛しますが,以下いくつかの設定項目について注意をしておきます.

  • 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 経由で通信する

strongSwanでIKEv2環境を整える(NAT使用) | Citizen of undefined

のような場合は不要(多分)なのではないかと思いますが,今回のようにクライアントに 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

}
strongSwan - ArchWiki

サーバ証明書の配置

サーバ証明書は以下のように配置すれば良いようです.

  • /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 接続を維持することができます.

Photo by hyt.

Photo by hyt.

Photo by hyt.

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つ記しておきます.

Buffalo OpenWrt化WZR-HP-G300NHでIKEv2 VPN over ぷららIPv6 IPoE接続 - rabbit51
OpenWrt化WZR-HP-G300NHに「StrongSwan」を導入し、「ぷららIPv6IPoE」経由でイントラネットに「IPsecIKEv2VPN」接続する(ヤマハNVR500のL2TP/IPsecでは、IPv6経由のVPN接続が出...
strongSwan - Documentation
NetworksServer
スポンサーリンク
Following hyt!
タイトルとURLをコピーしました