今まで少し面倒だったので触れてこなかったMeraki MXでのNon-Meraki VPNの挙動についてまとめておきたいと思います。
過去にMeraki MXでのAuto-VPN機能の基本動作についてまとめたことがありました。
Auto-VPNにおいては、対向のデバイスがMeraki MX通しであることが大前提となるので、Auto-VPNではDFビットは建てられず、小さいサイズのMTU値を通過する場合はAuto-VPNパケットはFragmentされ、対向のMXにてReassembleされる動作となっていることを確認しました。
Auto-VPNトンネル内はオーバーヘッド値(MXのFirmwareにより若干異なる)を差し引いたMTU値となるのですが、Internetの途中経路にて小さなMTU値が存在した場合においても通信が成立することになります。

検証構成
今回のNon-Meraki VPNの検証としてMXの対向にCisco ISR4K Routerを用意しました。

ISR4K IPsec設定
検証にて設定したIOS-XEのIPsec設定は下記の通りです。
IOS-XEにおけるIPsec設定の解説は多くのサイトでまとめられていますので、本記事では取り上げません。
crypto ikev2 proposal IKEV2_PROP
encryption aes-cbc-256
integrity sha256
group 14
!
crypto ikev2 policy IKEV2_POLICY
match address local 172.16.1.22
proposal IKEV2_PROP
!
crypto ikev2 keyring K_RING
peer REMOTE_SITE
address 172.16.1.21
pre-shared-key <PASSWORD>
!
crypto ikev2 profile IKEV2_PROF
match address local interface GigabitEthernet0/0/1
match identity remote address 172.16.1.21 255.255.255.255
authentication remote pre-share
authentication local pre-share
keyring local K_RING
!
crypto ipsec transform-set ESP_AES_SHA esp-aes 256 esp-sha256-hmac
mode tunnel
!
crypto ipsec profile IPSEC_PROF
set transform-set ESP_AES_SHA
set ikev2-profile IKEV2_PROF
!
interface Loopback1
ip address 192.168.1.1 255.255.255.255
!
interface Tunnel1
ip unnumbered GigabitEthernet0/0/1
tunnel source GigabitEthernet0/0/1
tunnel mode ipsec ipv4
tunnel destination 172.16.1.21
tunnel protection ipsec profile IPSEC_PROF
!
interface GigabitEthernet0/0/1
ip address 172.16.1.22 255.255.255.0
!
ip route 192.168.2.0 255.255.255.0 Tunnel1
Non-Meraki VPN設定
Non-Meraki VPNを利用するためには必ずAuto-VPN機能を有効にする必要があります。
あくまでもNon-Meraki VPNはAuto-VPNにて構築されているSD-WANに追加として他社とのIPsec通信を行うためだけの機能と考えておいた方が良いのでしょう。
今回は1台のMXのみで検証を行うので、Auto-VPN HUB拠点として設定を行います。
またVPN通信の対象となるサブネット(今回の構成では192.168.2.0/24)を有効にします。

次にIPsec VPNピアの設定を行います。
適当な名前とIKEバージョンを選択します。
今回はIKEv2としました。

次にピアの設定を行います。
対向のISR4KのIPアドレス、PSK、IPsec通信を行う対向のサブネットの設定を行います。
今回利用するMeraki Organizationには一つのNetworkしか存在しないので、Non-Meraki VPNを有効にするMXとして全てのNetworkを選択しました。
Non-Merakiの設定で唯一特殊なのは、この設定はそれぞれのMXに行うものではなく、VPN設定のProfileのようなものを設定しNetwork(≒MX)にマッピングするという形式をとっていることです。
今回の検証からは少し外れますのでこれ以上の解説は割愛します。

次にIPsecポリシーの設定を行います。
対向のIPsecルータに合わせて設定を行ってください。

設定は以上です。
IPsec通信の状態確認
IOS-XE側で状態を確認します。
IKEv2フェーズ1の確認
show crypto ikev2 sa

IKEv2フェーズ2の確認
show crypto ipsec sa

最後にクライアントから通信確認を行います。
今回はISR4Kに設定しているLoopbackアドレスにPingを行います。

Non-Meraki VPNを介して通信ができていることを確認しました。
Non-Meraki VPNのMTU値の確認
ここからがこの記事の本番になります。
Non-Meraki VPN内のMTU値を確認してみます。
ping -D -s 1472 192.168.1.1
Pingの結果、MTU値が1400Byteであると応答がありました。
念の為Packet Captureも取得してみると、ICMP Destination Unreachable : Fragment Neededが帰ってきており、MTU値が1400Byteとなっていることが確認できました。

パケットキャプチャからTCPセッションの確認
上記検証によりNon-Meraki VPNのMTU値が1400Byteとなっていることが確認できました。
更に通信の詳細を確認するためにTCPの3way Handshakeの状態を見ていきたいと思います。
まずは、MXのLAN側Interfaceで取得したPacket Captureです。
SYN、SYN/ACKともに1460Byteとなっていることが確認できます。

次にNone-MerakiVPN内部で取得したPacket Captureです。
こちらでもSYN、SYN/ACKともに1460Byteとなっていることが確認できます。

この検証により、
Non-Meraki VPN内のMTU値は1400Byteとなっているが、MSS値の調整はMXでは行わない
というのが確認できました。
今度はMXのWAN(Internet) Interfaceでパケットキャプチャを取得します。
まずはDFビットをセットしないでPingを行います。
ping 192.168.1.1
IPsecパケットにおいてもDFビットがセットされていないことが確認できました。

次にDFビットをセットしてPingを行います。
ping -D 192.168.1.1
今回はDFビットがセットされていることが確認できました。

これにより、Non-Meraki VPNではオリジナルのパケットのDFビットをIPsec通信にも反映させていることが分かりました。
まとめ
今回の検証により、Non-Meraki VPNはAuto-VPNと挙動が大きく異なることが確認できました。
・MTU値は1400Byte
これは固定値のようです。
MX WAN Interfaceの実MTU値1500ByteからIPsecのオーバーヘッド分を差し引いた数値で計算しているわけではないと思います。
IPsecのオーバーヘッドはざっくり70Byte未満だと思いますので、IPsec内MTU値を1400Byteとしておけば問題はないのでしょう。
・MTU値を超えた通信はPMTUDで調整
ほとんどのクライアントからの通信においては初めからDFビットがセットされた状態で送信されることになります。
1400Byteを超えるPacketを送信した場合は、PMTUDにて1400Byteに自動調整されます。
ここで気になるのは日本におけるPPPoE(1454Byte)、IPoE(1460Byte)の環境での通信に関してです。
IPsecのオーバーヘッドを考慮すると1400Byteを下回ってしまうことになるので、通信が成立しないことになります。
次回はこのような環境でのNon-Meraki VPNの通信についてまとめてみたいと思います。