泥沼SEの備忘録

やってみたいこと、やってみたことを記録しています

GPD Pocket Linux Ubuntu

Ubuntu 26.04からYAMAHAルーター(RTX1200)へL2TP/IPsec VPN接続してみた【strongSwan + xl2tpd】

投稿日:2026年8月13日 更新日:

はじめに

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
    ▼
自宅LAN

Ubuntuでは、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 = no

PPPの設定ファイルを作成する

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

debug

nameには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 1258

MTU/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-secrets
sudo ls -l /etc/ppp/chap-secrets

以下のようにrootのみ読み書きできる状態であればOKです。

-rw------- 1 root root … /etc/ppp/chap-secrets

xl2tpdを起動する

設定後、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-control

L2TP接続を開始するには、以下を実行します。

echo "c yamaha" | sudo tee /var/run/xl2tpd/l2tp-control

c は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 0

ip-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 route

L2TP/PPPまで正常に確立すると、PPPインターフェースが作成されます。


また、xl2tpdのログは、以下で確認できます。

sudo journalctl -u xl2tpd --since "2 minutes ago" --no-pager

PPPを含めて確認したい場合は、以下で確認すると情報を追いやすくなります。

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 関連の記事」 一覧

-GPD Pocket, Linux, Ubuntu
-,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Ubuntu 26.04のGPD PocketでiPadを無線サブモニターにしてみた【Wayland使用・HDMIダミープラグ不要】

はじめに Ubuntu 26.04をインストールした初代GPD Pocketをいろいろ触っています。GPD Pocketは7インチという小さな画面が特徴ですが、実際に使っていると、「もう少し画面が広け …

Ubuntuでターミナル操作を自動的にログ保存する

はじめに LinuxDesktopを使っていて少し気になったことがあります。それはターミナルのログが保存できていないことです。今までWindowsからTeraTermでsshをしていたため、TeraT …

初代GPD PocketにUbuntu 26.04 LTSをインストールし、日本語入力設定でハマった話。IBus + MozcからFcitx5 + Mozcへ。やったことを振り返ってみる

はじめに GPD Pocketをご存知でしょうか?中国のGPD社が2017年に発売した7インチ液晶搭載の超小型ノートPC(UMPC)です。約480gの軽量アルミボディにWindows 10とフルキーボ …

iPad × Ubuntuで快適リモートデスクトップ!XRDPでつなぐ手順と注意点

はじめに Linuxのデスクトップ環境を使いたい。。。昨年から急にそう思うようになりました。Linuxのデスクトップ環境、デスクトップLinuxを使いたくなることってありますよね。その昔、学生の頃にD …

BotFatherでTelegram Botを作成し、Ubuntuから通知を送る方法

はじめに サーバーで動かしているプログラムから、スマートフォンへ通知を送りたいことはありませんか?メールでも通知はできますが、メール通知だと気付きにくいし、LINE Notifyも終了してしまいました …

関東のSIerでSEをやっています。

Linuxやネットワーク、サーバー、ガジェットなど、気になったことを実際に試しています。

過去に調べたことや、やってみたもののうまくいかなかったことも含めて、試行錯誤の記録を残しています。

同じところで困っている方にとって、少しでも解決の手がかりになれば幸いです。