teru_0x01.log

技術メモと雑記

v6プラスだとL2TP/IPsecでVPN接続ができない理由と対処法

前提

IPv4 IPsecのサーバに接続したくて,そのサーバは触れないとします.

結論

IPv4IPsecだとv6プラスを利用している限りは不可能っぽいです.VPNサーバ管理者にお願いしてIPv6IPsecを利用する必要があります.

できない理由

  • v6プラスで使われているMAP-EはHGWに対してグローバルIPv4アドレスと,特定の範囲のポート(*)を割り当て,それをもとに通信を行います.
    • IPv4アドレス, (*)に含まれるポートの1つ)のペアでホストを一意に特定します.
    • よって,(*)以外のポートにWAN側から接続できません.
  • L2TP/IPsecは,IPsecで構築されるセキュアトンネルの中にL2TPトンネルを構築します.
  • IPsecが利用するポートは,(*) に含まれていません.
    • 従って,通信できません.

対処法

L2TP/IPsecをどうしても使いたい

  • IPv4 PPPoEを有効にしたルータを別途用意してWAN側に設置し,そのルータでIPv6パススルーを設定する
  • (上と逆)IPv4 PPPoEを有効にしたルータを別途用意してLAN側に設置し,元あったルータにPPPoEパススルーを設定する

L2TP/IPsec以外のVPNでも良い

この記事は誰向け?

  • なんか速いって聞いたからとりあえずv6プラスに加入してみたけど,L2TP/IPsecVPNが使えなくて困ってる人
  • v6プラス加入したいけどVPNで問題が起こるって聞いた,具体的に何がダメで,回避方法について知りたい人

背景

  • v6プラスに加入し,IPoE + IPv4 over IPv6による快適なインターネットを手に入れた
  • L2TP/IPsecを利用しようとした際,接続が失敗した
  • そもそも,何でできないの?
  • できるものなら,v6プラス環境でもL2TP/IPsecが利用したい

関連技術

無限にあります.ややこしいです.

一般的なインターネット接続構成

基本的には家庭内のホストは次のようにインターネットに繋がっています.

[ホスト] -- [ホームゲートウェイ(HGW)] -- [アクセスネットワーク] -- [ISP] -- [インターネット]

以降,フレッツ網に限った話になります(他のアクセスネットワークでも正しいかもしれませんが,よく知らないので...).

PPPoE (Point to Point over Ethernet)

インターネットを利用する時にISPと契約すると思うのですが,加入者を識別するためにはこの時作成されるアカウントを認証する必要があります.この時の認証に広く利用されるのがPPPoEです(ピーピーピーオーイーと読む.トリプルピーオイーではないらしい).

新しいISPと契約した時,ルータでPPPoEの画面からユーザとパスワードを入力するイベントが発生することがありますが,このときはルータがPPPoEクライアントの役割を担っています.このクライアントはアクセスネットワーク内にあるPPPoEサーバとセッションを張り,アクセスネットワークでトンネリングを行います.図にするとこんな感じです.ルータだけでなくホストがPPPoEクライアントになることも可能です.

[ホスト] -- [ホームゲートウェイ(HGW) 兼 PPPoEクライアント] -- [アクセスネットワーク -- PPPoEサーバ -- 網終端装置(NTE)] -- [ISP] -- [インターネット]

ホストのパケットはPPPoEトンネルを通ってNTEからISPネットワークへと流れていきます.

認証以外のPPPoEの重要な役割として,IPアドレスの払い出しというものがあります.DHCPみたいですね.払い出されたグローバルIPアドレスはHGWのWAN側に割り振られます.

IPoE (IP over Ethernet)

PPPoE方式と対で語られるのが,IPoEと呼ばれる技術です.NGN IPoEとも呼ばれ,NTTのフレッツ網(NTT東西のNGN)に固有の用語のようです.「イーサネットの上にIP」なので,当たり前のことを言っているように思いますが,PPPoEのようにユーザ認証のためにパケットをカプセル化する必要がないという特徴を表しています.

IPv4, IPv6共に使われるPPPoEとは異なり,こちらはIPv6でのみ利用されます.

VNE

IPoEではVirtual Network Enabler (VNE)という組織が登場します.この人たちはIPv6インターネットへの接続性を提供するのが役割です.ISPがやれば良いのでは?と思うのですが,技術的な制約によりNGNと接続できる事業者の数に制限があるため,少数のVNEがそれを行い,ユーザと契約したISPはVNEにIPv6インターネットへの接続性を委託するという形をとっています.

インターネット開通から接続までの流れ

  1. NGNに接続した段階で,NGNだけで利用できるIPv6プリフィックスが払い出される
  2. ISPと契約していると,ISPに委託されたVNEの開通サーバが開通オーダを出す
  3. 開通オーダを受けたNGN内サービスは,DHCPv6を用いて1.で割り当てられたユーザのIPv6プリフィックスを,VNEが保有するIPv6プリフィックスに変更(リナンバといいます)し,開通となる.
  4. NGNゲートウェイルータ (GWR)に届いたユーザのパケットは,そのソースIPを基にポリシーベースルーティングされ,VNEのネットワークへと転送される
  5. その後, パケットはIPv6インターネットへルーティングされる.

PPPoEのように認証のためにパスワードを入力したりする必要はありません.2.の開通オーダーの時にユーザの情報が渡され,3.で回線との紐付けを行なっているからだそうです(どうやってるんだろう).

ホストからインターネットまでを図にするとこんな感じです.

[ホスト] -- [ホームゲートウェイ(HGW)] -- [アクセスネットワーク -- ゲートウェイルータ(GWR)] -- [VNE] -- [IPv6インターネット]

ISPと契約する時によく「PPPoEよりもIPoEが速くて良い」と言われるのは,この構成の違いが影響しています.PPPoEの時はNTEが混雑の原因となっていましたが,IPoEではそれがなくなっています.代わりにアクセスネットワークの端に置かれるGWRは,より大容量の設備となっているため,現時点では空いていて速いという状況が生まれています(今後どうなるかはわかりません..).

IPv4 over IPv6

前述したIPoEですが,IPv6限定の技術なのでインターネット側のサービスもIPv6に対応している必要があります.阿部 寛のホームページのように*1全てのサイトがIPv6対応していれば良いのですが,jpドメインのサイトを始めまだ対応途中というものが多いようです.

そこでIPv4パケットをIPv6パケットでカプセル化し,トンネルを構築する技術がIPv4 over IPv6です.こうすることで,IPv4ネットワークの直前まではIPv6ネットワークを通ることが可能になります.

A over Bの順序で混乱しがちですが,プロトコルスタックでどちらが上のレイヤになるかを考えればわかりやすいです(今回はIPv4パケットが上のレイヤに来る).

v6プラス

v6プラスは規格などではなく,VNEであるJPNE社が提供しているサービスの名前です.IPv4 over IPv6方式の1つであるMAP-Eを用いてHGWからVNEまでトンネルを構成することで,IPoEによるIPv4インターネット接続を可能にします.

MAP-E方式

MAP-EのRFCを読むのが一番分かりやすいと思います.

簡単に説明するとこんな技術です.

  • MAP Customer Edge (CE)とMAP Border Relay (BR)がIPv6ヘッダの付与と除去を行い,それらの間にトンネルを構築します.
  • CEは普通HGWが,BRはVNEやISPの機器が担います.
  • 共有IPv4アドレスを使う方法と,共有しないIPv4アドレスを使う方法があります(v6プラスでは前者が使われます) .
  • 共有IPアドレスを使う方法
    • 複数のCEで同じグローバルIPv4アドレスを共有するため,CEとBRはIPv4アドレス+ポートをIPv6アドレスに紐付け,ホストを識別します.
    • CEごとに利用できるポートが定められていて,そのポートの範囲はIPv6アドレスから求めることが可能です(http://ipv4.web.fc2.com/map-e.html やHGWの管理画面で確認できる).またウェルノウンポートは割り当てられないようになっています(RFCの5.1参照)
    • CEは内部的にNAPTが動作していて,外向き,内向き(必要あれば)の通信に対してポートの変換を行います.

検証

利用できるポートが限定されていることを確かめます.

HGWの管理画面です.IPv4アドレスと利用可能なポートが列挙されています.

次にIPv4インターネットに接続されたVPSにWebサーバを立て,そこのアドレスをブラウザで開きます.ローカルのPCでパケットキャプチャした結果がこちら.ソースポートは63942になっています.

対して次の画像はWebサーバのアクセスログです.ソースポートが5237となっており,2つ上の画像で示した利用可能ポートの範囲内の値になっています.これはCE内部のNAPTによりポートの変換が行われたからだと考えられます.

VPN

ここから話が変わってVPNの話題になります.

VPNの分類

トラフィックがどこを流れるかの観点で分類するとこうなります.個人利用目的や小規模組織が利用するものは多くがインターネットVPNだと思います.

  • インターネットを流れる
    • インターネットVPN
      • トラフィックがインターネットを流れる
      • そのため秘匿性の確保は必須
  • 閉域網を流れる

VPNトラフィックをどのように流すかで分類すると次のようになります.

ブログタイトルにあるL2TP/IPsecは認証とトンネリングにL2TPを,秘匿性と完全性の確保にIPsec(のトランスポートモード*2.)を用いるVPNプロトコルです.L2TPのパケットはIPsecによって暗号化されたセキュアトンネルを通過するため,インターネットからは見ることができません.

IPsec

VPNプロトコルの1つであり,それ自体異なる役割を持った複数のプロトコルから構成されています.主に利用されるのは次の3つです.

  • IKE
    • 鍵交換を行い,安全なチャネルを確立します.この時両方のエンドは500番(UDP),NATトラバーサルを行う際は追加で4500番(UDP)ポートを使います.
  • ESP
    • 暗号化とメッセージ認証を行います.
  • AH
    • メッセージ認証を行います.ESPとは異なりIPヘッダまで完全性を保証します.

問題が起こる理由

ここまで説明してきたように,IPsecで利用するIKEでは500番などの固定のポートを利用する必要がありますが,MAP-Eにより割り当てられるポートに1023番以下のポート(ウェルノウンポート)は含まれないようになっています.よって,IPsecを利用するL2TP/IPsecはv6プラスに加入している限り使えない,ということになります.

解決策

IPv4 PPPoEを使う

IPv4 PPPoE方式だと,利用できるポートに制限はないため,普通にL2TP/IPsecは利用できます.しかし,全ての通信をPPPoEにするとv6プラスの意味が無いため,v6プラス用とVPN用でルータを使い分けるという方法があります.例えばこんな感じに,PPPoEの機能を持ったルータにIPv6パススルーを設定します(下段はPPPoEを用いるルータ2が通る).ルータ1と2の順序を逆にして,WAN側のルータにPPPoEパススルーを設定しても良さそうです.

[ホスト] -- [ルータ1(MAP CE)] -- [ルータ2 + IPv6パススルー + PPPoE] -- [アクセスネットワーク -- ゲートウェイルータ(GWR)] -- [VNE -- MAP BR] -- [IPv4インターネット]
                                                                                    |- PPPoEサーバ -- NTE] -- [ISP] -- [IPv4インターネット]

L2TP/IPsecではなく,SSL-VPNを利用する

VPNサーバを触れるという前提が必要ですが,SSL-VPNを利用するとクライアントが利用するポートに縛りがなくなるため,v6プラスでも利用できます.

まとめ

  • v6プラスを利用している限りはL2TP/IPsecを利用するのは不可能
  • PPPoEなど別の接続方法との併用でカバーするしかない

参考

https://www.nic.ad.jp/ja/newsletter/No70/NL70_0800.pdf

https://www.janog.gr.jp/meeting/janog42/application/files/8015/3238/7118/janog42-IPoE-vne_toyama.pdf

https://www.geekpage.jp/blog/?id=2017-12-28-1

https://www.geekpage.jp/blog/?id=2013/1/11/1

https://www.itmedia.co.jp/news/articles/2003/13/news087.html

https://qiita.com/yuyasat/items/81c32d7e235af97515c0

https://xtech.nikkei.com/it/atcl/column/17/011900625/011900003/

https://www.jpne.co.jp/service/v6plus/

https://ez-net.jp/article/58/fSRaWp5J/0qf0pKr7q4Iz/

https://www.infraexpert.com/study/ipsec5.html

https://ja.wikipedia.org/wiki/Layer_2_Tunneling_Protocol#L2TP/IPsec

https://bike8615.blogspot.com/2017/11/v6_20.html

*1:https://www.itmedia.co.jp/news/articles/2003/13/news087.html

*2:IPsecにはトンネルモードというのもあります