😆
IPv4 over IPv6環境でL2TP/IPsec VPNに接続する
はじめに
対象読者
- L2TP/IPsec VPN を使用する必要がある
- IPv4 over IPv6 回線を使っていて、VPNに接続できない
そんな人向けの記事です。
私は最近まで接続時だけスマホのテザリングに切り替えていました (不毛すぎる)。
解決方針
全体アーキテクチャ
なぜこの構成か
IPv4 over IPv6
環境で L2TP/IPsec VPN
が繋がらない理由は主に2つあります。
-
プロトコルの非互換性
- L2TP/IPsecは古いVPN技術で、IPv6に対応していない
- IPv6トンネル内でIPsecの暗号化パケット(ESP)が正しく通過できない
-
ネットワークの制約
- L2TP/IPsecは特殊なプロトコル(ESP)とポート(UDP 500/4500)を使用
- 多くのISPやルーターがこれらを適切に処理できない
構成
以下のような仕組みを構築しました。
-
自宅 → リレーサーバー間: WireGuard
- IPv4/IPv6両環境から接続可能
- 単一ポート (UDP 51820) 動作する
-
リレーサーバー内での処理: iptables + ip rule
- WireGuardで受信したパケットをマーキング(識別)
- マークされたパケットをL2TPトンネル(ppp0)へルーティング
- 送信元IPアドレスをNAT変換(MASQUERADE)で書き換え
-
リレーサーバー → 客先VPN間: L2TP/IPsec (従来のVPN)
- リレーサーバーは通常のIPv4環境なので、問題なく接続可能
この方式により、IPv6環境からでも透過的に客先VPNに接続できるようになります。
インフラ構築
AWS CDK でインフラもコードで管理することで「作って試してすぐ壊す」が手軽 にできる
実装詳細
(書き起こすと長くなるのでソース読んでください)
その他
- VPNといえば StrongSwanやlibreswanですが、どうしても動きませんでした。手元端末のMacではracoonが使用されており、racoonのLinux実装を探して実装すると動きました。
Discussion