リモートアクセスにおける「アプリ疲れ」問題
先日、外出の多い50人の営業チームを抱えるクライアント向けにデプロイを完了しました。彼らは社内のCRMツールへのセキュアなアクセスを必要としていましたが、大きなハードルがありました。ユーザーの多くがITに詳しくなかったのです。WireGuardの導入を提案したところ、すぐにフィードバックが返ってきました。「.confファイルの管理や追加アプリのダウンロード、公開鍵の設定などはしたくない。iPhoneやWindowsノートパソコンに標準で備わっている設定だけでVPNを使いたい」というものでした。
現場では、これはよくあるシナリオです。WireGuardやTailscaleのようなモダンなプロトコルは、回線容量の90%に達することもある素晴らしい速度を提供しますが、互換性の面では依然としてL2TP/IPsecが王座に君臨しています。サードパーティのソフトウェアを一切使わずに、プロフェッショナルなサービスを提供できるからです。ユーザーが5年前のAndroidタブレットを使っていようが、最新のWindows 11ワークステーションを使っていようが、クライアント機能はすでに設定メニューの中で待機しています。
なぜネイティブVPNは「ブラックボックス」のように感じられるのか
L2TP/IPsecの設定が難しいのは、2つの異なるサービスを連携させる必要があるためです。strongSwanが担当するIPsecは暗号化されたシェルを提供し、xl2tpdが担当するL2TPはデータトンネルを作成します。これら2つが完全に同期していないと、ユーザーには「セキュリティ層で処理エラーが発生しました」といった汎用的なエラーが表示されます。
失敗の主な原因は2つあります。IKE(Internet Key Exchange)バージョンの不一致、またはNATトラバーサルの問題です。モバイルデバイスはほぼ常にキャリアNATの背後にあり、クラウドサーバーも独自の内部IPを持っていることが多いため、これらのレイヤーを整合させるには、IPsecポリシーとPPP(Point-to-Point Protocol)認証の精密な設定が必要になります。
適切なプロトコルの選択
ターミナルを叩く前に、L2TP/IPsecが競合と比べてどうなのかを見てみましょう:
- WireGuard: 非常に高速でモダンです。しかし、すべてのデバイスにアプリが必要であり、一部の企業フリートにとっては決定的な障害となります。
- OpenVPN: 非常に柔軟ですが、リソースを大量に消費します。WireGuardと同様に、サードパーティのクライアントが必要です。
- PPTP: 高速で標準搭載されていますが、根本的に脆弱です。現代のGPUなら1日足らずでPPTPの暗号化を解読できてしまいます。これは避けてください。
- L2TP/IPsec: セキュアで標準搭載されています。WireGuardよりも10〜15%ほどオーバーヘッドが大きいですが、エンドユーザーにとって「ゼロタッチ」で導入できる点は大きなメリットです。
堅牢なL2TP/IPsecの設定
ここでは暗号化にstrongSwan、トンネルにxl2tpdを使用します。このガイドでは、パブリックIPを持つクリーンなUbuntu 22.04またはDebianサーバーを使用していることを前提としています。
ステップ1:コアパッケージのインストール
システムを更新し、必要なバイナリを取得します。異なるOSが要求する多様な暗号化スイートを確実にサポートするために、libcharon-extra-pluginsを含めています。
sudo apt update
sudo apt install strongswan xl2tpd libcharon-extra-plugins -y
ステップ2:暗号化レイヤーの定義 (strongSwan)
サーバーに初期ハンドシェイクの処理方法を教える必要があります。/etc/ipsec.confを編集します。古いクライアント向けのIKEv1をサポートしつつ、強力な暗号を維持する設定を使用します。
# /etc/ipsec.conf
config setup
uniqueids=no
conn L2TP-IPsec-Native
type=transport
authby=secret
keyexchange=ikev1
left=%any
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
auto=add
ike=aes128-sha1-modp2048,aes256-sha1-modp2048,3des-sha1-modp1024
esp=aes128-sha1,aes256-sha1,3des-sha1
次に、/etc/ipsec.secretsで事前共有鍵(PSK)を定義します。これはユーザーがデバイスの設定に入力する「共有シークレット」になります。
# /etc/ipsec.secrets
%any %any : PSK "あなたの非常に強力な共有シークレット"
ステップ3:トンネルの構築 (xl2tpd)
暗号化の設定ができたら、L2TPデーモンにトラフィックのルーティング方法を伝えます。/etc/xl2tpd/xl2tpd.confを編集して、内部IP範囲を定義します。
[global]
port = 1701
[lns default]
ip range = 192.168.42.10-192.168.42.250
local ip = 192.168.42.1
refuse pap = yes
refuse chap = yes
refuse mschap = yes
require mschap-v2 = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
ステップ4:ユーザー認証
PPPオプションファイルでユーザーのログイン方法を管理します。/etc/ppp/options.xl2tpdを作成します。MTUを1200に設定している点に注目してください。これにより、不安定なモバイルネットワーク上でのパケット断片化を防ぎます。
ms-dns 8.8.8.8
ms-dns 8.8.4.4
auth
mtu 1200
mru 1200
nodefaultroute
proxyarp
silent
name l2tpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
iocp
logfile /var/log/xl2tpd.log
次に、ユーザーを/etc/ppp/chap-secretsに追加します。フォーマットは単純で、"ユーザー名" "サービス名" "パスワード" "許可するIP"です。
# /etc/ppp/chap-secrets
"sales_user_1" l2tpd "複雑なパスワード99!" *
ステップ5:ネットワークとファイアウォールの設定
このままではVPNはトラフィックをルーティングしません。サーバーがゲートウェイとして機能するように、カーネルでIPフォワーディングを有効にする必要があります。/etc/sysctl.confを編集します。
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
sudo sysctl -pでこれらを適用します。次に、NATマスカレードを処理するようにIPTablesを設定します。eth0を実際のWANインターフェースに置き換えてください(ip routeで確認できます)。
# NATを有効化
iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.42.0/24 -j ACCEPT
# IPsecとL2TP用のUDPポートを開放
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p udp --dport 1701 -j ACCEPT
ステップ6:サービスの有効化
デーモンを再起動してトンネルをオンラインにします。
sudo systemctl restart strongswan-starter
sudo systemctl restart xl2tpd
Windowsの「NAT」の落とし穴
iOSは完璧に接続できるのにWindowsが即座に失敗する場合でも、慌てないでください。デフォルトでは、WindowsはNATの背後にあるサーバーへのIPsec接続を無効にしています。これでデプロイが数日間停滞するのを見たことがあります。これを修正するには、Windowsクライアントマシンでレジストリキーを追加する必要があります。
- regeditを開きます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgentに移動します。AssumeUDPEncapsulationContextOnSendRuleという名前のDWORD (32ビット) 値を作成します。- 値を
2に設定します。 - コンピュータを再起動します。
なぜこの構成が優れているのか
L2TP/IPsecは最新のプロトコルではないかもしれませんが、その普及率は強力な武器です。このガイドに従うことで、シームレスな体験を提供できます。ユーザーは設定画面に行き、サーバーIP、共有シークレット、そして自分の認証情報を入力するだけです。ダウンロードも混乱もなく、ただオフィスへの安全な経路が確保されます。
もし行き詰まったら、/var/log/syslogを確認してください。ほとんどの接続問題は、特定のデバイスのセキュリティポリシーを満たすために、ikeまたはespの行に不足している暗号を追加するだけで解決します。

