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
コメント