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接続できます。
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
コメント