rabbit51

it's since Nov.30 2005
May.29 2014, transferred from broach

Win10でNVR500 L2TP/IPsec VPNへ接続した時のMTUを確認

2019-04-09 10:00:00 | NVR500
Windows10でNVR500へL2TP/IPsec VPN接続しWIresharkでパケット解析が出来るようになった。pingパケットを解析中に「Don't fragment」フラグをセットしているのに経路中の最小MTUを超えた長さでも応答があった。
確認してみる。

(1)準備
Windows10(Version 1803/OS build 17134.648)のL2TP/IPsec接続パラメータ

NVR500(Rev 11.00.38)
「ipsec sa policy 2 2 esp aes-cbc sha-hmac」「syslog debug on」

VPN接続後、「show ipsec sa」で接続を確認(シリアルコンソール)


「show ipsec sa gateway 2 detail」で暗号鍵を確認(シリアルコンソール)


ログからIPSAKMPのIKEv1鍵とESP鍵を抽出(シリアルコンソール)


鍵をセットして復号したパケットを確認

プロトコル「L2TP」は、「ESP」から復号されたパケット。

(2)pingで経路のmtuを確認する
NVR500のL2TP/IPsec(「ip pp mtu 1258」)のMTUは、MTU=1258バイト。IPsecの
MTUは、MTU=1280バイト。aes-cbc/sha-hmacのESPに必要なMTUは、MTU=1344バイトとなる。

VPN接続後Windowsコマンドから「ping -4 -f -n 5 -l 1230 192.168.12.1」でL2TP/ipsecの疎通を確認。

NVR500のLAN2(PR-S300SEとの接続インターフェース)でパケットをキャプチャ。Win10(192.168.11.6)から192.168.12.1へのICMPパケットを含むL2TP/IPsecパケットがPPPoE上でキャプチャされ復号状態で表示。

パケット#7423「Etherヘッダー14バイト+PPPoEヘッダー6バイト+PPPヘッダー2バイト+VLANタグ4バイト+IPv4 ESPパケット1344バイト=1370バイト(FCSは、Wiresharkでカウントされない)」は、パケット#7424「Etherヘッダー14バイト+復号されたICMPパケット1258バイト=1272バイト」のIPv4パケットで、192.168.1.1ゲートウェイを経由して192.168.12.1へ転送される。
192.168.12.1からのreplyパケット#7425(1276バイト VLANタグ4バイトを含む)は、NVR500のPPインターフェースからL2TP/IPsec1344バイトに変換され、PPPoEパケット#7426(1366バイト VLANタグなし)でWin10へ転送される。フラグメントされていない事が確認出来る。

L2TPのパケット長を「+1(1231バイト)」してフラグメントが発生するか確認する。
IPsec(ESP)パケットのPayloadは、16の倍数となるよう「Pad(n)」が挿入されるため、IPsec Payload=1296バイト、IPsec ESPに必要なMTUは、MTU=1360バイトとなる。

「ping -4 -f -n 5 -l 1231 192.168.12.1」でフラグメントするか確認した。「-f」でフラグメントしない指定をしたが、応答がある。
ヤマハL2TP/IPsecの解説には、「送信する物理インターフェースのMTUに従い、必要に応じてフラグメントして送信」とある。L2TP中のIPv4 icmpパケットは、「Don't fragment」だが、L2TP/IPsecのESPパケットは、「fragment」でNVR500に到達している。

Win10からの16バイト増加したL2TP/IPsecパケット#8113(1386バイト)を受け、IPv4 ICMP(Don't fragment)#8114(1273バイト)でMTU=1500バイトのインターフェースに転送されるのが記録される。

192.168.12.1からreplyパケットは、NVR500のPPPインターフェースに設定された「ip pp mtu 1258」に従い、#8115と#8116にフラグメントされる。IPv4のフラグメントは、送信先インターフェースのMTU内になるようIPv4 Payload部が8の倍数となるよう分割される。また、分割されたPayload部がEthernetの最小Payload長46バイト以上となるよう不足分がPad(n)として挿入されEtherフレーム長(FCSを含め)最小64バイトが確保される。
IPv4 Fragmentを下表で検証してみた。
パケット#1、#2の「targetMTU」欄は、Etherの最小フレーム長を考慮したMTU値を計算設定。Etherの最小データ長46バイト以上としている。「Wireshark Length」は、キャプチャされたFCSを含まないデータ長として計算評価した。Wiresharkのキャプチャデータ(パケット#8116)では、VLAN IDの4バイトが含まれ64バイトとなっている

フラグメントされた2個のパケット(#8117と#8118)は、それぞれ下記のようにESPパケットに変換され、「PPPoE(6)+PPP(2)(+8バイト)」ヘッダーが追加されWin10へ転送される。#2の最小Etherパケットは、Pad(n)が取り除かれESPパケットとして転送される。



Windows10 L2TP/IPsec VPNのインターフェースMTUを調べてみる
「netsh interface ipv4 show interfaces」で確認(VPN接続状態である事が必要)

「MTU=1400バイト」となっている。

「MTU=1400バイト」でpingしてみる

replyが返って来る


「MTU=(1400+1)バイト」でpingしてみる

Win10のIPsecインターフェースでフラグメントされない(送出されない)。


「MTU=1400バイト」のL2TP/IPsecパケットをWiresharkでキャプチャ(NVR500のPPPoE接続部)してみると、パケット#4914、#4915とNVR500に到達する前にフラグメントされている。

NGNのIPv4 MTUが1454バイトなのでフラグメントが発生する。Wireshark上の#4914(Length=1478バイト)、#4915(Length=82バイト)パケット長は、VLANタグが追加されるので下表値より+4バイトの長さとなる。

フラグメントされたパケットは、NVR500で再構成と復号が行われ、IPv4パケット#4916『Eth(14)+IPv4(20)+ICMP(8)+Payload(1372)(Don't fragment)」として192.168.1.1経由で192.168.12.1へ転送される。

応答パケットは、192.168.12.1からNVR500のL2TP/IPsec用PPインターフェース「MTU=1258バイト」に合わせてフラグメントされ返送される。

Wireshark上では、VLANタグ4バイトが付加され、#4917(Length=1270バイト)、#4918(Length=186バイト)で受取り、L2TP/IPsecとしてIPv4 ESPで転送される。
#4917パケットは、L2TP/IPsec化され「PPPoE(6)+PPP(2)」ヘッダーが追加され#4919(Length=1366バイト)応答パケットとして送出される。

#4918パケットもL2TP/IPsec化され「PPPoE(6)+PPP(2)」ヘッダーが追加され#4920(Length=278バイト)応答パケットとして送出される。


NVR500のL2TP/IPsecは、送出するインターフェースのMTUに従いフラグメントされるため、ぷららのIPv4 PPPoEインターフェース「ppp lcp mru on 1454」へ送出する時にフラグメントされる事になる。しかし、L2TP生成時の「ip pp mtu 1258」で制限されるため、フラグメントは発生しない。

Windows10のL2TP/IPsecに設定されているMTU=1400バイトは、IPv4 over PPPoE on NGNでは、フラグメントされるため、下表で示すMTU=1354バイトが最適であるが、

iPhone(iOS)やmacOSのL2TP/IPsecのIPsecインターフェースMTUがMTU=1280バイトである事からWindows10 L2TP/IPsec VPNのMTUをMTU=1258バイトとする事にした。


(3)Windows10 L2TP/IPsec VPNのMTUを変更する

(a)Windows10のL2TP/IPsec VPNインターフェースのインターフェースを調べる。
L2TP/IPsec VPNを接続する(接続しないとインターフェースが表示されない。設定も出来ない。)
「netsh interface ipv4 show interfaces」
(b)「netsh interface ipv4 set interface interface="L2TP IPsec on NVR500" mtu=1258」を設定する。「interface=」には、VPNの「接続名」を設定する。


(c)レジストリー情報
「L2TP/IPsecインターフェースのGUIDが不明なため、L2TP/IPsec VPN接続後、上記(1)(2)のようにMTUを設定し、設定したMTU値をレジストリ検索する事で「GUID」を確認する。GUID特定後は、未接続状態でもレジストリのMTU値変更で設定可能。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{GUID}
MTU = (DWORD) 0 <-デフォルト値(1400)
MTU = (DWORD)0x000004ea(1258)
MTU = (DWORD)0x0000054a(1354)
MTU = (DWORD)0x00000578(1400)

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« フレッツ「サービス情報サイ... | トップ | フレッツ「サービス情報サイ... »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

NVR500」カテゴリの最新記事