VPN(IKEv2)サーバーの設定(strongswan5.8以降)

ALL
スポンサーリンク

VPN(IKEv2)サーバの RockyLinux8/9,AlmaLinux8/9 での構築方法です。
WindowsではVPNの種類でIKEv2を選択、AndroidではタイプIKEv2/IPSec MSCHAPv2 を選択で接続できるようにする設定です。

スポンサーリンク

ここで構築するVPN

・VPNサーバは RockyLinux8/9,AlmaLinux8/9
・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 を選択で接続

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

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

yum install epel-release
yum --enablerepo=epel install strongswan

swanctlの設定

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

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

ディレクトリ /etc/strongswan/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/strongswan/swanctl/conf.d/vpn-ikev2.conf

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

systemctl enable strongswan
systemctl start strongswan

2024.3.1 追加
/etc/sysctl.conf の末尾に以下の内容を追加します。
VPN経由でのアクセスでは、環境によっては接続できないホストがあり、その対処です。

net.ipv4.ip_no_pmtu_disc = 1

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

/sbin/sysctl -p

ファイアウォール設定

firewalldの場合

2024.3.13 修正

firewall-cmd --permanent --add-service=ipsecs
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --direct --add-rule ipv4 mangle FORWARD 1 -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
firewall-cmd --reload

上記のルールは、VPNクライアント同士のアクセスができないようにしています。
出来るようにするには、次のように3行目を追加してください。

firewall-cmd --permanent --add-service=ipsecs
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 1 -s 192.168.11.128/25 -d 192.168.11.128/25 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 mangle FORWARD 1 -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
firewall-cmd --reload

また、VPN経由でのアクセスでは、環境によっては –mss 1351:1536 -j TCPMSS –set-mss 1350 の行の設定をしないと、つながらないホストがあります。
(https://www.itmedia.co.jp/ 、 https://www.pref.shimane.lg.jp/ 等)
上記例でもつながらない場合は、–set-mss の値を小さくしてください。また –mss 1351:1536 の 1351の箇所を、–set-mssで指定した値+1 を記述してください。

iptablesの場合

2024.3.13 修正
2024.4.6 修正(追加 iptables -A INPUT -p udp -m udp –dport 4500 -j ACCEPT)

iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -p ah -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 4500 -j ACCEPT
iptables -A FORWARD -s 192.168.11.128/25  -d 192.168.11.128/25 -j DROP
iptables -A FORWARD -d 192.168.11.128/25 -j ACCEPT
iptables -A FORWARD -s 192.168.11.128/25 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.11.128/25 -j MASQUERADE
iptables -t 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

上記のルールは、VPNクライアント同士のアクセスができないようにしています。
出来るようにするには、次のように7行目を追加してください。

iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -p ah -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 500 -j ACCEPT
iptables -A FORWARD -s 192.168.11.128/25  -d 192.168.11.128/25 -j DROP
iptables -A FORWARD -d 192.168.11.128/25 -j ACCEPT
iptables -A FORWARD -s 192.168.11.128/25 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.11.128/25 -d 192.168.11.128/25 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.11.128/25 -j MASQUERADE
iptables -t 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

また、VPN経由でのアクセスでは、環境によっては –mss 1351:1536 -j TCPMSS –set-mss 1350 の行の設定をしないと、つながらないホストがあります。
(https://www.itmedia.co.jp/ 、 https://www.pref.shimane.lg.jp/ 等)
上記例でもつながらない場合は、–set-mss の値を小さくしてください。また –mss 1351:1536 の 1351の箇所を、–set-mssで指定した値+1 を記述してください。

クライアントの設定

Windows10

[スタート] ボタンを選択し、歯車アイコン([設定]) 、[ネットワークとインターネット] 、[VPN]、[VPN 接続を追加する] の順に選択します。

次の画面になります。

以下を設定し、[保存]を押します。

VPN プロバイダー:[Windows (ビルトイン)] を選びます。
接続名:VPN接続名(自由につけます)
サーバー名またはアドレス:VPN サーバーのアドレス。「swanctlの設定」で設定したファイルの id = で指定した内容をここで指定します。
VPN の種類:[IKEv2] を選択
サインイン情報の種類:[ユーザー名とパスワード] を選択
ユーザー名:VPNサーバで設定したユーザ名
パスワード:VPNサーバで設定したユーザ名
ユーザー名、パスワードは、「swanctlの設定」で設定したファイルの id=,secret= で設定したものです。

次の画面に戻るので、先ほど作成した接続を選択し、[接続]を押すと、VPN接続できます。

VPN接続_windows10_2

Windows11

[スタート] ボタンを右クリックし、[ネットワーク接続]-[VPN]-[VPNを追加] の順に選択します。

次の画面になります。

以下を設定し、[保存]を押します。

VPN プロバイダー:[Windows (ビルトイン)] を選びます。
接続名:VPN接続名(自由につけます)
サーバー名またはアドレス:VPN サーバーのアドレス。「swanctlの設定」で設定したファイルの id = で指定した内容をここで指定します。
VPN の種類:[IKEv2] を選択
サインイン情報の種類:[ユーザー名とパスワード] を選択
ユーザー名:VPNサーバで設定したユーザ名
パスワード:VPNサーバで設定したユーザ名
ユーザー名、パスワードは、「swanctlの設定」で設定したファイルの id=,secret= で設定したものです。

VPN接続一覧の画面に戻るので、先ほど作成した接続の箇所の[接続]ボタンを押すと、VPN接続できます。

Android

2024.5.3 strongSwan公式アプリからの接続方法を追加しました

標準機能での接続

Android13の場合です。

[設定] -[ネットワークとインターネット]-[VPN] を順に選択します。

 画面右上の”+”を押すと、次の画面になります。

次の個所を設定後、[保存]を押します。

名前:VPN接続名(自由につけます)
タイプ:[IKEv2/IPSec MSCHAPv2] を選択
サーバーアドレス:VPN サーバーのアドレス。「swanctlの設定」で設定したファイルの id = で指定した内容をここで指定します。
IPSec ID:本記事の設定では何でもいいですが、未指定にはできないので、何か適当に入れてください。
ユーザー名:VPNサーバで設定したユーザ名
パスワード:VPNサーバで設定したユーザ名
ユーザー名、パスワードは、「swanctlの設定」で設定したファイルの id=,secret= で設定したものです。

VPN接続一覧の画面に戻るので、先ほど作成した接続名をタップして[接続]を押すと、VPN接続できます。

strongSwan公式アプリからの接続

次の箇所から strongSwanの公式VPNクライアントアプリをインストールします。

strongSwan VPN Client – Google Play のアプリ

アプリで「ADD VPN PROFILE」の箇所をタップします。

次の個所を設定後、[SAVE]を押します。

Server:VPN サーバーのアドレス。「swanctlの設定」で設定したファイルの id = で指定した内容をここで指定します。
VPN type:このまま [IKEv2 EAP(Username/Password)] を選択します
Username:VPNサーバで設定したユーザ名
Password:VPNサーバで設定したユーザ名
Username、Passwordは、「swanctlの設定」で設定したファイルの id=,secret= で設定したものです。

VPN接続一覧の画面に戻るので、先ほど作成した接続名をタップすると、VPN接続できます。

参考

strongSwan で iOS 対応の VPN を作成する(charon-systemd 版) | seinolab
Ubuntuで作るiOS/AndroidでIKEv2接続できるVPN環境のつくりかた #VPN – Qiita
swanctl.conf :: strongSwan Documentation
strongSwan 5.8.0 の systemd ユニット変更に対応する – ちとくのホームページ
Secure Your Network with IKEv2 IPSec and strongSwan – Shapehost
[linux][VPN] strongSwanのcharonをswanctlに置き換えてみた。 | いつか、そのとき、あの場所で。rev.2
IPsec IKEv2 MSCHAPv2 VPN server – Gentoo Wiki
CentOSでVPN(IKEv2) を 構築する with StrongSwan Part.2 ~ MTU値の調整 ~ – /var/log/soymsk

コメント