L2TP/IPsec VPNサーバの構築 で構築したVPNサーバを日常的に利用していましたが、これもAlmaLinuxのサーバに載せ替えます。 手順としてはほぼ同じですが、libreswan のバージョンが上がったため設定に変更がありました。
結論から言うと、中国の4GネットワークでのiPhoneの接続は確認できていません。中国の自宅の有線LANからは接続できるので、一旦手順を公開します。 後日修正するかもしれません。
以下のパッケージをインストールします。
$ sudo dnf install -y xl2tpd libreswan
インストールされたバージョンを確認します。
$ rpm -q xl2tpd libreswan
xl2tpd-1.3.17-1.el9.x86_64
libreswan-4.12-1.el9.x86_64
xl2tpd 1.3.8 → 1.3.17、 libreswan 3.15 → 4.12 とバージョンが上がっています。
前回の設定 ではネット上にある設定例を参考にしました*2が、今回設定がうまく行かず調査したところ、libreswanのページにそのものズバリの 設定例 があったので、これをベースに設定していきます。
設定内容の妥当性は以下のコマンドで確認できるので、随時確認しながら進めます。
$ sudo ipsec verify
設定するファイルは
です。 man 5 ipsec.conf および man 5 ipsec.secrets にドキュメントがインストールされています。
--- /etc/ipsec.conf 2024/01/26 23:27:20 1.1
+++ /etc/ipsec.conf 2024/01/26 23:29:15
@@ -8,7 +8,7 @@
# If logfile= is unset, syslog is used to send log messages too.
# Note that on busy VPN servers, the amount of logging can trigger
# syslogd (or journald) to rate limit messages.
- #logfile=/var/log/pluto.log
+ logfile=/var/log/pluto.log
#
# Debugging should only be used to find bugs, not configuration issues!
# "base" regular debug, "tmi" is excessive (!) and "private" will log
@@ -33,8 +33,11 @@
# To enable IKE and IPsec over TCP for VPN client, also specify
# tcp-remote-port=4500 in the client's conn section.
+ ikev1-policy=accept
+ uniqueids=no
+
# if it exists, include system wide crypto-policy defaults
-include /etc/crypto-policies/back-ends/libreswan.config
+#include /etc/crypto-policies/back-ends/libreswan.config
# It is best to add your IPsec connections as separate files
# in /etc/ipsec.d/
このファイルには全体に関わる config セクションのみを記述し、個々の接続方法設定する conn セクションは
include /etc/ipsec.d/*.conf
のようにインクルードします。
ipsec.conf から読み込まれるファイルです。 新規に作成し、以下の内容でL2TP VPN用の conn セクションを設定します。
conn L2TP-PSK
authby=secret
pfs=no
auto=add
rekey=no
left=%defaultroute
right=%any
ikev2=never
type=transport
leftprotoport=17/1701
rightprotoport=17/%any
dpddelay=15
dpdtimeout=30
dpdaction=clear
conn L2TP-PSK-NAT
also=L2TP-PSK
rightsubnet=0.0.0.0/0
現在の版ではL2TP(すなわちIKEv1)を使う場合 ikev2 に never を指定する必要があります。(以前との変更点)
ここでは設定は行わず、
include /etc/ipsec.d/*.secrets
と個々の接続方法ごとにインクルードします。
isecd.conf から読み込まれるファイルです。 L2TP VPN用の「共有シークレット」*3を設定します。
: PSK "psksecrets"
psksecrets が共有シークレットです。 本来は16バイト以上で設定すべきらしいですが、「共有」として周知される内容なので短く設定される場合が多いようです。
設定するファイルは
です。
xl2tpd の設定ファイルです。 man 5 xl2tpd.conf にドキュメントがあります。
--- /etc/xl2tpd/xl2tpd.conf 2024/01/26 23:35:15 1.1
+++ /etc/xl2tpd/xl2tpd.conf 2024/01/26 23:36:45
@@ -15,7 +15,7 @@
; will be used by xl2tpd as its address on pppX interfaces.
[global]
-; listen-addr = 192.168.1.98
+listen-addr = 160.16.70.50
;
; requires openswan-2.5.18 or higher - Also does not yet work in combination
; with kernel mode l2tp as present in linux 2.6.23+
@@ -29,8 +29,8 @@
; debug tunnel = yes
[lns default]
-ip range = 192.168.1.128-192.168.1.254
-local ip = 192.168.1.99
+ip range = 192.168.0.101-192.168.0.105
+local ip = 192.168.0.1
require chap = yes
refuse pap = yes
require authentication = yes
xl2tpd が pppd 起動時に指定するオプション(man 8 pppd にドキュメントがあります)を設定するファイルです。 ファイル名は xl2tpd.conf の pppoptfile の指定と一致させる必要があります。
--- /etc/ppp/options.xl2tpd 2024/01/26 23:37:32 1.1
+++ /etc/ppp/options.xl2tpd 2024/01/26 23:38:20
@@ -6,7 +6,7 @@
# ms-dns 192.168.1.3
# ms-wins 192.168.1.2
# ms-wins 192.168.1.4
-noccp
+# noccp
auth
#obsolete: crtscts
idle 1800
@@ -25,3 +25,10 @@
# You need to join the domain on the server, for example using samba:
# http://rootmanager.com/ubuntu-ipsec-l2tp-windows-domain-auth/setting-up-openswan-xl2tpd-with-native-windows-clients-lucid.html
+name xl2tpd
+refuse-pap
+refuse-chap
+refuse-mschap
+require-mschap-v2
+persist
+logfile /var/log/xl2tpd.log
ログファイルはあらかじめ作成しておきます。
$ sudo touch /var/log/xl2tpd.log
pppd のCHAP認証設定ファイルです。 xl2tpd 用の認証設定を追加します。
--- /etc/ppp/chap-secrets 2024/01/26 23:40:01 1.1
+++ /etc/ppp/chap-secrets 2024/01/26 23:40:59
@@ -1,2 +1,3 @@
# Secrets for authentication using CHAP
# client server secret IP addresses
+"user" "xl2tpd" "password" *
/etc/ppp/options.xl2tpd
の name の設定値と合わせるファイアウォールを設定します。 IPsec(500/UDP, 4500/UDP, 4500/TCP)と L2TP(1701/UDP, 4500/UDP)が使用するポートを開放し、IPマスカレードを有効にします。
$ sudo firewall-cmd --permanent --add-service=ipsec
$ sudo firewall-cmd --permanent --add-port=1701/udp
$ sudo firewall-cmd --permanent --add-port=4500/udp
$ sudo firewall-cmd --permanent --add-masquerade
$ sudo firewall-cmd --reload
設定状態を確認します。
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens3
sources:
services: cockpit dhcpv6-client ipsec ssh
ports: 1701/udp 4500/udp
protocols:
forward: yes
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
/etc/sysctl.d/50-libreswan.conf を修正します。
--- /etc/sysctl.d/50-libreswan.conf 2024/01/24 21:36:17 1.1
+++ /etc/sysctl.d/50-libreswan.conf 2024/01/24 23:20:59
@@ -10,3 +10,12 @@
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
+
+net.ipv4.ip_forward = 1
+net.ipv4.conf.default.rp_filter = 0
+net.ipv4.conf.all.rp_filter = 0
+net.ipv4.conf.ens3.rp_filter = 0
+net.ipv4.conf.ens4.rp_filter = 0
+net.ipv4.conf.ens5.rp_filter = 0
+net.ipv4.conf.lo.rp_filter = 0
+net.ipv4.conf.ip_vti0.rp_filter = 0
ip_forward を有効に、各インタフェースの rp_filter を無効に設定します。
設定をカーネルに反映します。
$ sudo sysctl --system
IPsec および L2TP のサービスを起動します。
$ sudo systemctl enable ipsec
$ sudo systemctl enable xl2tpd
$ sudo systemctl restart ipsec
$ sudo systemctl restart xl2tpd
最後に設定状況を確認します。
$ sudo ipsec verify
Verifying installed system and configuration files
Version check and ipsec on-path [OK]
Libreswan 4.12
Checking for IPsec support in kernel [OK]
NETKEY: Testing XFRM related proc values
ICMP default/send_redirects [OK]
ICMP default/accept_redirects [OK]
XFRM larval drop [OK]
Pluto ipsec.conf syntax [OK]
Checking rp_filter [OK]
Checking that pluto is running [OK]
Pluto listening for IKE on udp 500 [OK]
Pluto listening for IKE/NAT-T on udp 4500 [OK]
Pluto ipsec.secret syntax [OBSOLETE]
003 WARNING: using a weak secret (PSK)
Checking 'ip' command [OK]
Checking 'iptables' command [OK]
Checking 'prelink' command does not interfere with FIPS [OK]
Checking for obsolete ipsec.conf options [OK]
共有シークレットの長さに問題ありますが、それ以外はOKという結果です。
実際に接続してみます。
自宅の中国聯通の有線LANからは接続できますが、同じ中国聯通の4GネットワークからiPhone SEで接続を試みると、/var/log/pluto.log
に以下のログが残されて接続できません。
Jan 27 09:03:09.011443: "L2TP-PSK"[4] 42.84.233.5 #6: responding to Main Mode from unknown peer 42.84.233.5:39311
Jan 27 09:03:09.011688: "L2TP-PSK"[4] 42.84.233.5 #6: WARNING: connection L2TP-PSK PSK length of 3 bytes is too short for HMAC_SHA2_256 PRF in FIPS mode (16 bytes required)
Jan 27 09:03:09.011792: "L2TP-PSK"[4] 42.84.233.5 #6: sent Main Mode R1
Jan 27 09:03:09.175897: "L2TP-PSK"[4] 42.84.233.5 #6: sent Main Mode R2
Jan 27 09:03:09.326878: "L2TP-PSK"[4] 42.84.233.5 #6: ignoring informational payload IPSEC_INITIAL_CONTACT, msgid=00000000, length=28
Jan 27 09:03:09.326947: "L2TP-PSK"[4] 42.84.233.5 #6: Peer ID is ID_IPV4_ADDR: '10.19.90.102'
Jan 27 09:03:09.327518: "L2TP-PSK"[4] 42.84.233.5 #6: IKE SA established {auth=PRESHARED_KEY cipher=AES_CBC_256 integ=HMAC_SHA2_256 group=MODP2048}
Jan 27 09:03:12.386691: "L2TP-PSK"[4] 42.84.233.5 #6: retransmitting in response to duplicate packet; already STATE_MAIN_R3
Jan 27 09:03:15.577079: "L2TP-PSK"[4] 42.84.233.5 #6: retransmitting in response to duplicate packet; already STATE_MAIN_R3
Jan 27 09:03:18.756693: "L2TP-PSK"[4] 42.84.233.5 #6: discarding duplicate packet -- exhausted retransmission; already STATE_MAIN_R3
Jan 27 09:03:31.446583: "L2TP-PSK"[4] 42.84.233.5 #6: discarding duplicate packet -- exhausted retransmission; already STATE_MAIN_R3
同じiPhoneで自宅の有線LANに設置したWi-Fiルータを経由して接続すると接続できるので、4Gネットワークの問題ではないかと疑っています。 しかしながら CentOS + libreswan 3.15 で構築したVPNサーバのときは4Gから接続できていたので、設定でカバーできるのではと思い、パラメータ変更を試みます。