Windows10でNVR500へL2TP/IPsec VPN接続しWIresharkでパケット解析が出来るようになった。pingパケットを解析中に「Don't fragment」フラグをセットしているのに経路中の最小MTUを超えた長さでも応答があった。
確認してみる。
(1)準備
Windows10(Version 1803/OS build 17134.648)のL2TP/IPsec接続パラメータ
![](https://blogimg.goo.ne.jp/user_image/1d/2a/6e66c2ea1bdb4b59c31729923c9e7cb9.png)
NVR500(Rev 11.00.38)
「ipsec sa policy 2 2 esp aes-cbc sha-hmac」「syslog debug on」
VPN接続後、「show ipsec sa」で接続を確認(シリアルコンソール)
![](https://blogimg.goo.ne.jp/user_image/15/c8/192a2d6ab7f31b971c7d5a07f4c8e536.png)
「show ipsec sa gateway 2 detail」で暗号鍵を確認(シリアルコンソール)
![](https://blogimg.goo.ne.jp/user_image/01/2d/69a17969d21408e5d4bc17e240d2eef2.png)
ログからIPSAKMPのIKEv1鍵とESP鍵を抽出(シリアルコンソール)
![](https://blogimg.goo.ne.jp/user_image/2b/d8/c01e623ce9a45d0e102b38b61db37118.png)
鍵をセットして復号したパケットを確認
![](https://blogimg.goo.ne.jp/user_image/17/f1/89d6aae854d81cd08e23430385fad635.png)
プロトコル「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バイトとなる。
![](https://blogimg.goo.ne.jp/user_image/5c/26/fcc3f075cec8e0c3ee8edfc1a5ba35ca.png)
VPN接続後Windowsコマンドから「ping -4 -f -n 5 -l 1230 192.168.12.1」でL2TP/ipsecの疎通を確認。
![](https://blogimg.goo.ne.jp/user_image/28/58/c44617602203d0510945f04c593e157e.png)
NVR500のLAN2(PR-S300SEとの接続インターフェース)でパケットをキャプチャ。Win10(192.168.11.6)から192.168.12.1へのICMPパケットを含むL2TP/IPsecパケットがPPPoE上でキャプチャされ復号状態で表示。
![](https://blogimg.goo.ne.jp/user_image/1c/b8/a2a325061da8a87cfd43d214d4f7c1eb.png)
パケット#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バイトとなる。
![](https://blogimg.goo.ne.jp/user_image/74/1c/a383138267d506c6e43436ff42a429c0.png)
「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に到達している。
![](https://blogimg.goo.ne.jp/user_image/18/3a/2158debc8ea2d2eba292a7ecaecaeca7.png)
Win10からの16バイト増加したL2TP/IPsecパケット#8113(1386バイト)を受け、IPv4 ICMP(Don't fragment)#8114(1273バイト)でMTU=1500バイトのインターフェースに転送されるのが記録される。
![](https://blogimg.goo.ne.jp/user_image/67/5d/42306a13890755cfcadcca783463564b.png)
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パケットとして転送される。
![](https://blogimg.goo.ne.jp/user_image/21/08/9db1bff2c13dced034e0d42d05343f51.png)
Windows10 L2TP/IPsec VPNのインターフェースMTUを調べてみる
「netsh interface ipv4 show interfaces」で確認(VPN接続状態である事が必要)
![](https://blogimg.goo.ne.jp/user_image/58/08/6c2cfc6a5de2fa916d3681815266ea89.png)
「MTU=1400バイト」となっている。
「MTU=1400バイト」でpingしてみる
![](https://blogimg.goo.ne.jp/user_image/0b/59/89ce3b3ce6bd565d90dc704238bd33fd.png)
replyが返って来る
![](https://blogimg.goo.ne.jp/user_image/1b/a0/d8a1da81d0976bfd88ff1e37c8aa5d3d.png)
「MTU=(1400+1)バイト」でpingしてみる
![](https://blogimg.goo.ne.jp/user_image/79/a1/ebd3b13a7a448667213d8b359a9810e6.png)
Win10のIPsecインターフェースでフラグメントされない(送出されない)。
![](https://blogimg.goo.ne.jp/user_image/5c/32/af8d7303f4cef88a476d65db253ffd5f.png)
「MTU=1400バイト」のL2TP/IPsecパケットをWiresharkでキャプチャ(NVR500のPPPoE接続部)してみると、パケット#4914、#4915とNVR500に到達する前にフラグメントされている。
![](https://blogimg.goo.ne.jp/user_image/0d/e5/3b7f94815176b6cd286decb7a195f75c.png)
NGNのIPv4 MTUが1454バイトなのでフラグメントが発生する。Wireshark上の#4914(Length=1478バイト)、#4915(Length=82バイト)パケット長は、VLANタグが追加されるので下表値より+4バイトの長さとなる。
![](https://blogimg.goo.ne.jp/user_image/17/d5/32ac0fee87fcfdf29c110ba58cfee0fe.png)
フラグメントされたパケットは、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バイト」に合わせてフラグメントされ返送される。
![](https://blogimg.goo.ne.jp/user_image/26/ed/01bfd9cd4941e064cd81cd9deab65f77.png)
Wireshark上では、VLANタグ4バイトが付加され、#4917(Length=1270バイト)、#4918(Length=186バイト)で受取り、L2TP/IPsecとしてIPv4 ESPで転送される。
#4917パケットは、L2TP/IPsec化され「PPPoE(6)+PPP(2)」ヘッダーが追加され#4919(Length=1366バイト)応答パケットとして送出される。
![](https://blogimg.goo.ne.jp/user_image/66/2b/9a48bd68ba1ef329a1b303d5901421a0.png)
#4918パケットもL2TP/IPsec化され「PPPoE(6)+PPP(2)」ヘッダーが追加され#4920(Length=278バイト)応答パケットとして送出される。
![](https://blogimg.goo.ne.jp/user_image/7e/23/7c7b9b6ac3e3f8fc28f2f5e780a19118.png)
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バイトが最適であるが、
![](https://blogimg.goo.ne.jp/user_image/01/af/efcfba3b5d1eb6ce4b8107fa85844507.png)
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の「接続名」を設定する。
![](https://blogimg.goo.ne.jp/user_image/6e/1e/51d1771400cc365c0c6ffe3a305eaf92.png)
(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)
確認してみる。
(1)準備
Windows10(Version 1803/OS build 17134.648)のL2TP/IPsec接続パラメータ
![](https://blogimg.goo.ne.jp/user_image/1d/2a/6e66c2ea1bdb4b59c31729923c9e7cb9.png)
NVR500(Rev 11.00.38)
「ipsec sa policy 2 2 esp aes-cbc sha-hmac」「syslog debug on」
VPN接続後、「show ipsec sa」で接続を確認(シリアルコンソール)
![](https://blogimg.goo.ne.jp/user_image/15/c8/192a2d6ab7f31b971c7d5a07f4c8e536.png)
「show ipsec sa gateway 2 detail」で暗号鍵を確認(シリアルコンソール)
![](https://blogimg.goo.ne.jp/user_image/01/2d/69a17969d21408e5d4bc17e240d2eef2.png)
ログからIPSAKMPのIKEv1鍵とESP鍵を抽出(シリアルコンソール)
![](https://blogimg.goo.ne.jp/user_image/2b/d8/c01e623ce9a45d0e102b38b61db37118.png)
鍵をセットして復号したパケットを確認
![](https://blogimg.goo.ne.jp/user_image/17/f1/89d6aae854d81cd08e23430385fad635.png)
プロトコル「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バイトとなる。
![](https://blogimg.goo.ne.jp/user_image/5c/26/fcc3f075cec8e0c3ee8edfc1a5ba35ca.png)
VPN接続後Windowsコマンドから「ping -4 -f -n 5 -l 1230 192.168.12.1」でL2TP/ipsecの疎通を確認。
![](https://blogimg.goo.ne.jp/user_image/28/58/c44617602203d0510945f04c593e157e.png)
NVR500のLAN2(PR-S300SEとの接続インターフェース)でパケットをキャプチャ。Win10(192.168.11.6)から192.168.12.1へのICMPパケットを含むL2TP/IPsecパケットがPPPoE上でキャプチャされ復号状態で表示。
![](https://blogimg.goo.ne.jp/user_image/1c/b8/a2a325061da8a87cfd43d214d4f7c1eb.png)
パケット#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バイトとなる。
![](https://blogimg.goo.ne.jp/user_image/74/1c/a383138267d506c6e43436ff42a429c0.png)
「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に到達している。
![](https://blogimg.goo.ne.jp/user_image/18/3a/2158debc8ea2d2eba292a7ecaecaeca7.png)
Win10からの16バイト増加したL2TP/IPsecパケット#8113(1386バイト)を受け、IPv4 ICMP(Don't fragment)#8114(1273バイト)でMTU=1500バイトのインターフェースに転送されるのが記録される。
![](https://blogimg.goo.ne.jp/user_image/67/5d/42306a13890755cfcadcca783463564b.png)
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を下表で検証してみた。
![](https://blogimg.goo.ne.jp/user_image/18/f1/3849224119018510b11a23ea6d240cf0.png)
フラグメントされた2個のパケット(#8117と#8118)は、それぞれ下記のようにESPパケットに変換され、「PPPoE(6)+PPP(2)(+8バイト)」ヘッダーが追加されWin10へ転送される。#2の最小Etherパケットは、Pad(n)が取り除かれESPパケットとして転送される。
![](https://blogimg.goo.ne.jp/user_image/21/08/9db1bff2c13dced034e0d42d05343f51.png)
Windows10 L2TP/IPsec VPNのインターフェースMTUを調べてみる
「netsh interface ipv4 show interfaces」で確認(VPN接続状態である事が必要)
![](https://blogimg.goo.ne.jp/user_image/58/08/6c2cfc6a5de2fa916d3681815266ea89.png)
「MTU=1400バイト」となっている。
「MTU=1400バイト」でpingしてみる
![](https://blogimg.goo.ne.jp/user_image/0b/59/89ce3b3ce6bd565d90dc704238bd33fd.png)
replyが返って来る
![](https://blogimg.goo.ne.jp/user_image/1b/a0/d8a1da81d0976bfd88ff1e37c8aa5d3d.png)
「MTU=(1400+1)バイト」でpingしてみる
![](https://blogimg.goo.ne.jp/user_image/79/a1/ebd3b13a7a448667213d8b359a9810e6.png)
Win10のIPsecインターフェースでフラグメントされない(送出されない)。
![](https://blogimg.goo.ne.jp/user_image/5c/32/af8d7303f4cef88a476d65db253ffd5f.png)
「MTU=1400バイト」のL2TP/IPsecパケットをWiresharkでキャプチャ(NVR500のPPPoE接続部)してみると、パケット#4914、#4915とNVR500に到達する前にフラグメントされている。
![](https://blogimg.goo.ne.jp/user_image/0d/e5/3b7f94815176b6cd286decb7a195f75c.png)
NGNのIPv4 MTUが1454バイトなのでフラグメントが発生する。Wireshark上の#4914(Length=1478バイト)、#4915(Length=82バイト)パケット長は、VLANタグが追加されるので下表値より+4バイトの長さとなる。
![](https://blogimg.goo.ne.jp/user_image/17/d5/32ac0fee87fcfdf29c110ba58cfee0fe.png)
フラグメントされたパケットは、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バイト」に合わせてフラグメントされ返送される。
![](https://blogimg.goo.ne.jp/user_image/26/ed/01bfd9cd4941e064cd81cd9deab65f77.png)
Wireshark上では、VLANタグ4バイトが付加され、#4917(Length=1270バイト)、#4918(Length=186バイト)で受取り、L2TP/IPsecとしてIPv4 ESPで転送される。
#4917パケットは、L2TP/IPsec化され「PPPoE(6)+PPP(2)」ヘッダーが追加され#4919(Length=1366バイト)応答パケットとして送出される。
![](https://blogimg.goo.ne.jp/user_image/66/2b/9a48bd68ba1ef329a1b303d5901421a0.png)
#4918パケットもL2TP/IPsec化され「PPPoE(6)+PPP(2)」ヘッダーが追加され#4920(Length=278バイト)応答パケットとして送出される。
![](https://blogimg.goo.ne.jp/user_image/7e/23/7c7b9b6ac3e3f8fc28f2f5e780a19118.png)
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バイトが最適であるが、
![](https://blogimg.goo.ne.jp/user_image/01/af/efcfba3b5d1eb6ce4b8107fa85844507.png)
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の「接続名」を設定する。
![](https://blogimg.goo.ne.jp/user_image/6e/1e/51d1771400cc365c0c6ffe3a305eaf92.png)
(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)