はじめに
Ubuntu 26.04をインストールしたGPD Pocketから、自宅のYAMAHAルーター(RTX1200)へVPN接続できるようにしてみました。今回使用するのは、YAMAHAルーターですでに設定してある L2TP/IPsec(IKEv1) のVPN接続です。iPhoneなどからは普通に接続できているVPNですが、Ubuntuから接続しようとすると少し勝手が違いました。今回は、以下の要素を組み合わせて構築しています。
- IPsec:strongSwan
- L2TP:xl2tpd
- PPP:pppd
最終的にはコマンドからVPNを接続・切断できるところまで確認できました。なお、YAMAHAルーターのL2TP/IPsec設定については、すでに動作しているものを使用しています。
今回の構成
大まかな通信の流れは次のようになります。
Ubuntu 26.04
│
│ strongSwan
│ IKEv1 / IPsec
▼
インターネット
│
▼
YAMAHAルーター(RTX1200)
│
│ L2TP / PPP
▼
自宅LANUbuntuでは、IPsec部分とL2TP部分を別々のソフトウェアで担当します。
strongSwan
↓
IPsecトンネル確立
↓
xl2tpd
↓
L2TPトンネル確立
↓
pppd
↓
PPPインターフェース作成この構造を理解しておくと、接続できないときに「IPsecで止まっているのか」「L2TPで止まっているのか」を切り分けやすくなります。
環境
今回使用した環境です。
PC:初代GPD Pocket
OS:Ubuntu 26.04 LTS
strongSwan:6.0.4
xl2tpd:1.3.20
接続先:YAMAHAルーター
VPN方式:L2TP/IPsec(IKEv1)
まず、今回使用するstrongSwan、xl2tpdなどをインストールします。
sudo apt update
sudo apt install charon-systemd strongswan-swanctl xl2tpd今回の構成では、strongSwanはsystemdと連携する charon-systemd を使用し、設定や接続操作には swanctl を使用します。
xl2tpdからPPP接続を行うために必要なpppdは、xl2tpdの依存パッケージとしてインストールされます。
インストール後、バージョンを確認しました。
sudo swanctl --version 2>/dev/null
xl2tpd -v
pppd --version
strongSwanのパッケージを「dpkg -l | grep -E ‘strongswan|libstrongswan’」で確認します。

strongSwanでIPsecを設定する
strongSwanの設定ファイルを作成します。今回は以下に作成しました。
/etc/swanctl/conf.d/yamaha-l2tp.conf
設定の内容は次のようになります。
connections {
yamaha-l2tp {
version = 1
remote_addrs = <YAMAHAルーターのホスト名>
proposals = aes128-sha1-modp1024
local {
auth = psk
}
remote {
auth = psk
}
children {
l2tp {
mode = transport
local_ts = dynamic[udp/1701]
remote_ts = dynamic[udp/1701]
esp_proposals = aes128-sha1
}
}
}
}
secrets {
ike-yamaha {
secret = <事前共有鍵>
}
}ポイントは、version = 1としてIKEv1を使用することと、mode = transportとしてL2TP/IPsecで使用するIPsec Transport Modeにすることです。
また、接続先にはIPアドレスを直接書かず、YAMAHAのNetVolante DNSなどのホスト名を指定しました。接続先IPアドレスが変わる環境では、IPアドレスを設定ファイルへ決め打ちしてしまうと、アドレス変更後に接続できなくなるためです。
設定ファイルの権限を変更
設定ファイルには事前共有鍵が入るため、root以外から簡単に読めないようにしておきます。
sudo chmod 600 /etc/swanctl/conf.d/yamaha-l2tp.conf確認し、以下のようになっていればOKです。
sudo ls -l /etc/swanctl/conf.d/yamaha-l2tp.conf
-rw------- 1 root root ...
strongSwanへ設定を読み込ませる
以下のコマンドで設定を読み込みます。
sudo swanctl --load-all今回の環境では、使用していないstrongSwanプラグインについて、plugin ‘xxx’: failed to loadというメッセージが大量に表示されました。
最初はかなり不安になりますが、最後に、
loaded ike secret ‘ike-yamaha’
loaded connection ‘yamaha-l2tp’
successfully loaded 1 connections, 0 unloaded
と表示され、必要な接続設定自体は正常に読み込まれました。


IPsecを接続する
いよいよIPsecの接続を開始します。以下のコマンドを打ちます。
sudo swanctl --initiate --child l2tp正常に接続できると、以下のように表示されます。
selected proposal: ESP:AES_CBC_128/HMAC_SHA1_96/NO_EXT_SEQ
CHILD_SA l2tp established
initiate completed successfully

IPsec SAを確認する
接続状態は次のコマンドで確認できます。
sudo swanctl --list-sas今回の環境では、yamaha-l2tp: #1, ESTABLISHED, IKEv1となり、AES_CBC-128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024で接続されていることを確認できました。
CHILD_SAについても、INSTALLED, TRANSPORT-in-UDPとなっていれば、IPsec部分は確立しています。


ここまででIPsecは完成です。ただし、まだL2TP/PPP接続は完成していません。
xl2tpdを設定する
続いてL2TPを担当するxl2tpdを設定します。設定ファイルは、「/etc/xl2tpd/xl2tpd.conf」です。今回使用するLACを作成します。
[global]
port = 1701
[lac yamaha]
lns = <YAMAHAルーターの接続先>
pppoptfile = /etc/ppp/options.xl2tpd.yamaha
length bit = yes
redial = noPPPの設定ファイルを作成する
xl2tpdからPPP接続を行うため、pppdの設定ファイルを作成します。
先ほど作成した /etc/xl2tpd/xl2tpd.conf では、以下のようにPPP設定ファイルを指定しています。
pppoptfile = /etc/ppp/options.xl2tpd.yamahaそのため、/etc/ppp/options.xl2tpd.yamaha を作成します。
sudo vi /etc/ppp/options.xl2tpd.yamaha今回の環境では、以下の内容としました。
name <ユーザー名>
refuse-eap
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
noauth
noccp
nodefaultroute
mtu 1258
mru 1258
persist
maxfail 0
debugnameにはYAMAHAルーターへ接続するときに使用するPPPユーザー名を指定します。認証方式については、refuse-eap、refuse-pap、refuse-chap、refuse-mschapで使用しない認証方式を拒否し、require-mschap-v2でMS-CHAPv2を使用するようにしています。
また、今回の構成では以下を指定しています。
nodefaultrouteこれにより、PPP接続時にデフォルトルートをVPN側へ変更しないようにしています。通常のインターネット通信はWi-Fi側へ流し、自宅LANなど必要なネットワークだけをVPNへ流す構成にするためです。
MTUとMRUについては、今回の環境では以下の値を使用しました。
mtu 1258
mru 1258MTU/MRUは通信環境によって適切な値が異なります。今回は接続検証の中で 1258 として正常に通信できたため、この値を使用しています。
PPPの認証情報を設定する
続いて、YAMAHAルーターへPPP認証するためのユーザー名とパスワードを設定します。
options.xl2tpd.yamahaで設定したユーザー名でYAMAHAルーターへ認証します。認証方式にはMS-CHAPv2を使用するため、認証情報を /etc/ppp/chap-secrets に登録します。
以下のコマンドで編集します。
sudo vi /etc/ppp/chap-secrets以下の形式でユーザー名とパスワードを記載します。
"ユーザー名" * "PPPのパスワード" *各項目は、以下の順になっています。
ユーザー名
接続先サーバー名
パスワード
許可するIPアドレス今回は接続先サーバー名とIPアドレスを「*」としているため、ユーザー名とパスワードの組み合わせで認証します。なお、ここで指定するパスワードは、IPsecの事前共有鍵(PSK)とは別物です。
IPsecでは /etc/swanctl/conf.d/yamaha-l2tp.conf に設定したPSKを使用し、その内側で行われるPPP認証では /etc/ppp/chap-secrets に設定したユーザー名とパスワードを使用します。
つまり今回のL2TP/IPsec接続では、以下のような二段階の認証になります。
IPsec認証
↓
事前共有鍵(PSK)L2TP
↓
PPP認証
↓
ユーザー名・パスワード(MS-CHAPv2)認証情報が記載されているファイルなので、念のためrootユーザー以外から読み取れない権限になっていることも確認します。
sudo chmod 600 /etc/ppp/chap-secretssudo ls -l /etc/ppp/chap-secrets以下のようにrootのみ読み書きできる状態であればOKです。
-rw------- 1 root root … /etc/ppp/chap-secretsxl2tpdを起動する
設定後、xl2tpdを再起動します。
sudo systemctl restart xl2tpd以下のコマンドで起動状態を確認しましょう。
sudo systemctl status xl2tpd --no-pager正常なら、Active: active (running)となります。さらに、Listening on IP address 0.0.0.0, port 1701と表示されました。
ここで表示される 0.0.0.0:1701 は、このUbuntu上でxl2tpdがUDP/1701を待ち受けていることを示しています。今回UbuntuはLAC(L2TPクライアント)として動作しますが、L2TPの通信を行うためxl2tpd自身もローカルでUDP/1701を使用します。

L2TP接続を開始する
xl2tpdには制御用のFIFO(名前付きパイプ)があります。これは、起動中のxl2tpdに接続・切断などの命令を渡すための窓口です。今回の環境では、/var/run/xl2tpd/l2tp-controlに作成されていました。
確認します。
sudo ls -l /var/run/xl2tpd/l2tp-controlL2TP接続を開始するには、以下を実行します。
echo "c yamaha" | sudo tee /var/run/xl2tpd/l2tp-controlc はconnect、yamaha は xl2tpd.conf の [lac yamaha] で定義した接続名です。「yamahaというLACへ接続する」という意味になります。FIFOにc yamahaを書き込むことで、起動中のxl2tpdにyamahaというLACへの接続を指示します。

VPN先ネットワークへのルートを追加する
L2TP/PPP接続が確立すると、ppp0インターフェースが作成され、PPPの対向アドレスへのルートは自動的に追加されます。ただし、今回アクセスしたいのはPPPの対向アドレスだけではなく、その先にある自宅LANです。今回の環境では、VPN接続時に以下のネットワークをppp0へ向ける必要があります。
192.168.100.0/24
192.168.111.0/25そこで、PPP接続時に実行される/etc/ppp/ip-up.d/にルート追加用のスクリプトを作成しました。
sudo nano /etc/ppp/ip-up.d/90-yamaha-routes内容は以下の通りです。
#!/bin/sh
#Yamaha L2TP VPN 接続時のみ実行
[ "$IFNAME" = "ppp0" ] || exit 0
ip route replace 192.168.100.0/24 dev "$IFNAME"
ip route replace 192.168.111.0/25 dev "$IFNAME"
exit 0ip-up.d配下のスクリプトはPPP接続時に実行されます。
ここでは、[ “$IFNAME” = “ppp0” ] || exit 0として、対象インターフェースがppp0の場合だけルートを追加するようにしています。$IFNAMEにはPPP接続時のインターフェース名が渡されるため、その後のルート設定でも、dev “$IFNAME”としています。
※今回の環境ではVPN接続時に作成されるPPPインターフェースが ppp0 だったため、この名前で判定しています。ほかのPPP接続を使用している環境では ppp1 などになる場合があるため、環境に合わせて変更してください。
また、ip route addではなく、ip route replaceを使用しました。これなら同じルートがすでに存在する場合でも、既存のルートを置き換えられます。
スクリプトには実行権限を付けておきましょう。
sudo chmod +x /etc/ppp/ip-up.d/90-yamaha-routes確認します。
sudo ls -l /etc/ppp/ip-up.d/90-yamaha-routes
今回はいわゆるスプリットトンネルです。スプリットトンネルとは、VPN接続中でも、通信先によって「VPNを通す通信」と「通常のインターネット回線を使う通信」を分ける方式です。
先ほど作成した /etc/ppp/options.xl2tpd.yamaha では、nodefaultrouteを指定しています。
そのため、VPN接続後もデフォルトルートは普段使用しているWi-Fi側のままになります。すべてのインターネット通信をVPNへ流すのではなく、VPN経由にしたいネットワークだけを明示的にppp0へ向ける構成です。
VPN接続後、以下のコマンドでルーティングテーブルを確認します。
ip route今回の環境では、以下のようになりました。
default via 192.168.11.1 dev wlp1s0 proto dhcp src 192.168.11.15 metric 600
192.168.11.0/24 dev wlp1s0 proto kernel scope link src 192.168.11.15 metric 600
192.168.100.0/24 dev ppp0 scope link
192.168.100.100 dev ppp0 proto kernel scope link src 192.168.100.200
192.168.111.0/25 dev ppp0 scope linkデフォルトルートは、default via 192.168.11.1 dev wlp1s0のままなので、通常のインターネット通信はWi-Fi側へ流れます。
一方、VPNより先の2つのネットワーク宛ての通信はVPN側のppp0へ流れます。
192.168.100.0/24 dev ppp0
192.168.111.0/25 dev ppp0接続後の確認
接続後は、以下のコマンドでインターフェースを確認します。
ip -br addrさらに、ルーティングも確認しておきます。
ip routeL2TP/PPPまで正常に確立すると、PPPインターフェースが作成されます。

また、xl2tpdのログは、以下で確認できます。
sudo journalctl -u xl2tpd --since "2 minutes ago" --no-pagerPPPを含めて確認したい場合は、以下で確認すると情報を追いやすくなります。
sudo journalctl --since "2 minutes ago" --no-pager \
| grep -Ei 'xl2tpd|pppd|chap|mschap|ppp'VPNを切断する
L2TPを切断する場合は、接続時の c に対して d を使用します。
echo "d yamaha" | sudo tee /var/run/xl2tpd/l2tp-control続いて、必要に応じてstrongSwan側のIPsec SAも終了します。
sudo swanctl --terminate --ike yamaha-l2tp接続状態は、以下で確認できます。
sudo swanctl --list-sas

コマンドでVPNを接続する流れ
最終的な接続操作をまとめると、基本的には次の流れです。
接続
まずIPsecを確立します。
sudo swanctl --initiate --child l2tp続いてL2TPを接続します。
echo "c yamaha" | sudo tee /var/run/xl2tpd/l2tp-control接続状態を確認します。
sudo swanctl --list-sas
ip -br addr
ip route切断
L2TPを切断します。
echo "d yamaha" | sudo tee /var/run/xl2tpd/l2tp-control必要に応じてIPsec側も終了し、SAが残っていないことを確認します。
sudo swanctl --terminate --ike yamaha-l2tp
sudo swanctl --list-sas今回ハマったところ
今回、UbuntuからYAMAHAルーターへL2TP/IPsec接続するまでには、いくつかハマるポイントがありました。特に分かりにくかったのが、以下でした。
- strongSwanの
plugin failedが大量に出る - 接続先IPを固定せず、ホスト名で指定する
- IPsecが確立してもL2TP/PPPまで成功したとは限らない
- VPN接続後に自宅LAN向けルートを追加する必要があった
特に、IKE SA = ESTABLISHEDだからといってVPN全体が接続できているとは限らない、という点は重要でした。L2TP/IPsecでは、以下のように段階的に接続されるため、それぞれを個別に確認した方が原因を追いやすくなります。
IKE/IPsec
↓
L2TP
↓
PPPまとめ
Ubuntu 26.04からYAMAHAルーターのL2TP/IPsec VPNへ接続するため、strongSwanとxl2tpdを使って環境を構築しました。
最終的には、以下の構成になります。
strongSwan
↓
IKEv1 / IPsec確立
↓
xl2tpd
↓
L2TP確立
↓
pppd
↓
VPN経由で自宅LANへ接続GUIからボタン一つで接続できるVPNクライアントと比べると設定項目は多いですが、各レイヤーをコマンドで確認できるので、仕組みを理解するには面白い構成でした。そして、GPD Pocketからコマンドを実行するだけで自宅のYAMAHAルーターへVPN接続できるようになりました。
ただ、毎回strongSwanとxl2tpdを順番に操作するのは少し面倒です。
今後は、接続・切断処理をもう少し簡単に扱えるようにしてみたいと思います。
その他
初代GPD Pocket + Ubuntu 26.04 関連の記事はこちら!!
「 初代GPD Pocket + Ubuntu 26.04 関連の記事」 一覧
