UbuntuでのVPN(IKEv2)サーバの設定(strongswan charon-systemd 版)

スポンサーリンク
スポンサーリンク

Ubuntu22.04 での VPN(IKEv2)サーバの構築方法です。strongswan は charon-systemd 版です。strongSwan 5.8.0 以降で対応している記述方法での説明です。
WindowsではVPNの種類でIKEv2を選択、AndroidではタイプIKEv2/IPSec MSCHAPv2 を選択で接続できるようになります。

RockyLinux8/9,AlmaLinux8/9 の場合は、次の記事を参照してください。

VPN(IKEv2)サーバーの設定(strongswan5.8以降) – パソコン鳥のブログ

スポンサーリンク

ここで構築するVPN

・VPNサーバは Ubuntu22.04
・VPNサーバーに Let’s Encryptの証明書を導入済み
・VPNクライアントのアドレスは 192.168.11.128-192.168.11.254 の範囲から割り振る
・VPN接続後、クライアントの全ての通信は VPNサーバ経由で行われます。
・VPN接続用ユーザ/パスワードは、サーバ側のファイルで指定
・VPNクライアント同士は接続できません
・Windows,スマホ(Android)からVPNサーバーへ接続可能(iOSは未確認です)。WindowsではVPNの種類でIKEv2を選択、AndroidではタイプIKEv2/IPSec MSCHAPv2 を選択で接続

必要パッケージのインストール

必要パッケージをインストールします。

apt install charon-systemd strongswan-swanctl
apt install libcharon-extra-plugins libcharon-extauth-plugins

RaspberryPi + Ubuntu の場合は、さらに次をインストールします。

apt install linux-modules-extra-raspi

swanctlの設定

Let’s Encrypt の証明書へのリンクを張ります。
[サーバーのFQDN] の箇所は、各自の環境に合わせてください。

ln /etc/letsencrypt/archive/[サーバーのFQDN]/privkey1.pem /etc/swanctl/private/privkey.pem
ln -s /etc/letsencrypt/live/[サーバーのFQDN]/fullchain.pem /etc/swanctl/x509/fullchain.pem
ln -s /etc/letsencrypt/live/[サーバーのFQDN]/chain.pem /etc/swanctl/x509ca/chain.pem

privkey.pem はハードリンクを張っています。
どうも swanctlは、privkey.pem の実体が /etc/swanctl 以下(サブディレクトリ含む)にないと起動時にエラーとなるようです。そのため、ハードリンクを張っています。

ディレクトリ /etc/swanctl/conf.d/ 下に次の内容のファイルを拡張子 .conf で作成します。
ここでは、vpn-ikev2.conf とします。

id = の箇所で、VPNサーバーのFQDN を記述してください。
dns = の箇所で、VPN接続時にVPNクライアントが参照するDNSサーバーを指定します。このDNSサーバーはVPNサーバーから参照できる必要があります。ここでは 8.8.8.8, 8.8.4.4 にしています。
secretsセクションで、VPN接続用のユーザー名とパスワードを記述してください。idにユーザー名、secretにパスワードを指定します。
con-ikev2,children-ikev2,eap-1,eap-2,pool-ipv6,pool-ipv4 の名称は自由に決めてください。

connections {
    con-ikev2 {
        version = 2
        proposals = default,aes256gcm16-sha256-modp1024
        unique = never
        dpd_delay = 30s
        send_cert = always
        pools = pool-ipv6,pool-ipv4
        fragmentation = yes

        local {
            id = VPNサーバーのFQDN
            certs = fullchain.pem
        }
        remote {
            auth = eap-mschapv2
            eap_id = %any
        }
        children {
            children-ikev2 {
                local_ts = ::/0,0.0.0.0/0
            }
        }
    }
}

pools {
    pool-ipv4 {
        addrs = 192.168.11.128-192.168.11.254
        dns = 8.8.8.8, 8.8.4.4
    }
    pool-ipv6 {
        addrs = fd00:1234:5678::192:168:11:128-fd00:1234:5678::192:168:11:254
        dns = 2001:4860:4860::8888, 2001:4860:4860::8844
    }
}

secrets {
    eap-1 {
        id=user1
        secret="XXXXXXXXXXXX"
    }
    eap-2 {
        id=user2
        secret="XXXXXXXXXXXX"
    }
}

パスワードを記述しているので、所有者にのみ読み取り権限を設定します。

chmod 600 /etc/swanctl/conf.d/vpn-ikev2.conf

strongswan がシステム起動時に自動起動するようにします。

systemctl enable strongswan
systemctl start strongswan

Linuxカーネルパラメータの設定

VPN接続が可能になるように、ネットワークに関するカーネルパラメータを設定します。

/etc/sysctl.conf の末尾に以下の内容を追加します。

/etc/sysctl.conf

net.ipv4.ip_forward = 1

次のコマンドで設定を反映します。

sysctl -p

ファイアウォール設定

ファイアウォールの設定を行います。

ufw enable
ufw allow to any port 4500
ufw allow to any port 500
ufw allow to any proto esp
ufw allow to any proto ah

/etc/ufw/before.rules

末尾に下記を追加します。

*nat
-A POSTROUTING -s 192.168.11.128/25 -j MASQUERADE
COMMIT

*mangle
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -s 192.168.11.128/25 -m tcpmss --mss 1351:1536  -j TCPMSS --set-mss 1350
COMMIT

/etc/default/ufw

DEFAULT_FORWARD_POLICY を ACCEPT にします。

設定を反映させます。

ufw reload

以上、Ubuntu でのVPNサーバの設定でした。

クライアントの設定

VPN(IKEv2)サーバーの設定(strongswan5.8以降) – パソコン鳥のブログ の「クライアントの設定」を参照してください。

2024.5.3 追記
AdnroidスマホからのVPN接続で、下記画面のように「接続処理中…」のままになる場合は、右側の設定ボタン(歯車アイコン)を押して設定画面を出し、そのまま[保存]を押すと、接続処理が終了します。
このようになる場合は、上記の「クライアントの設定」の「strongSwan公式アプリからの接続」の方の説ぞ方法でVPN接続してください。

参考

Ubuntu20.04(Hyper-V仮想マシン)とStrongSwanでIPsecのテスト – はまあさんはブログを使っています。
strongSwanの新しい設定方法(vici)
strongSwanでIPv4 over IPv6のVPNトンネルを構成する #AWS – Qiita
Ubuntuで作るiOS/AndroidでIKEv2接続できるVPN環境のつくりかた #VPN – Qiita
Ubuntu 22.04 Installation failure · strongswan/strongswan · Discussion #1638 · GitHub

コメント

タイトルとURLをコピーしました