Meraki MX non-Meraki VPN peer と IOS-XE ルータ接続サンプル

## Meraki以外のVPNピア 
Meraki MX では サイト間VPNとして Auto VPN機能を実装しています。これはMeraki MX が自動的に接続先MXのIPアドレスやNATトラバーサルなどを必要な設定を行い、ワンクリックでサイト間VPNトンネルを作成できる独自のソリューションです。

https://documentation.meraki.com/%E6%97%A5%E6%9C%AC%E8%AA%9E/Security_and_SD-WAN/Site-to-site_VPN/Site-to-site_VPN_Settings


ただし、この Auto VPN機能はMeraki MXの独自の実装であるため、拠点にそれぞれMXアプライアンスが設置されている必要があります。
ネットワークのマイグレーションの一環でMeraki MX以外の機器とのIPsecが必要な場合、他社との接続、Azure/AWS/GCPなどのパブリッククラウドとの接続などの場合で、Meraki MX以外の機器とIPsec VPNを構築したい場合もあると思います。

それを実現するのが「Meraki以外のVPNピア」 (non-Meraki VPN peer) です。
こちらはIPSECパラメータを指定することで、Meraki MX以外の機器とのIPsec接続を実現することができます。

対抗機器側の設定サンプルとして、IOS-XEルータで接続設定、接続確認ができましたので、記録としてこちらに記事として記載します。

## Mrakiダッシュボード側の設定
「セキュリティ&SD-WAN」「サイト間VPN」で、下の方にある「オーガナイゼーション全体の設定」にある「Meraki以外のVPNピア」の項目を設定していきます。

IOS-XEとの対抗を前提とした設定項目は以下です
1\. 名前
2\. IKEバージョン
3\. IPsecポリシー
4\. Public IP / Hostname
5\. プライベートサブネット
6\. 事前共有シークレット
7\. 利用可否

### 名前
IPsec接続先をMerakiダッシュボード認識するための名称になります。
対抗先機器のIPsec設定パラメータに影響はありませんので、任意の値を設定可能です

### IKEバージョン
IKEv1、もしくは、IKEv2 から選択可能です。対抗機器に設定予定のパラメータを考慮して決定しましょう。

### IPsecポリシー
IPsec設定の各種パラメータであるフェーズ1の暗号、認証、Diffie-Hellman、ライフタイム等の設定を行います。デフォルト設定値、AWS/Azure/Umblrellaなど向けの設定値の他、カスタムでの設定が可能です。
![Screenshot 2024-03-29 at 10.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/a56904e0-d52e-9afd-b32d-dea2a20d762f.png)
![Screenshot 2024-03-29 at 10.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/d2f94053-2243-7e94-4c80-66743a9aae62.png)
![Screenshot 2024-03-29 at 10.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/a0ac3a49-c688-481f-724d-810e912fd5ce.png)
今回は今使っている環境に合わせてカスタムでパラメータを設定しました

### Public IP / Hostname
接続先のIPアドレスを入力します

### プライベートサブネット
対抗拠点のIPアドレスセグメントを入力します

### 事前共有シークレット
IPsecの事前共有シークレットを設定します

### 利用可否
この「Meraki以外のVPNピア」がどのMXに設定するかを指定する項目になります。デフォルト状態ではすべてのMXでこの「Meraki以外のVPNピア」が有効になります（対抗先もその通り設定する必要があります）。
一方で特定のサイトでのみ「Meraki以外のVPNピア」を有効にしたい場合は、ここにネットワークのタグを指定します。今回は特定のサイトのみで有効化したいため、タグを指定します。

ネットワークのタグはネットワークの一覧から確認、設定が可能です
![Screenshot 2024-03-29 at 11.11.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/809fe97d-cf14-69b4-f691-fc3003ab9582.png)

最終的にMeraki Dashboardでの設定はこちらのようになりました
![Screenshot 2024-03-29 at 11.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/752f6c9a-6681-8c5c-1776-db4c8b9d36b1.png)



## IOS-XEの設定
IOS-XEでIPsecを設定するのに当たって、crypto-mapをあてるのか、vtiなのか、vtiのときに tunnel mode はtunnelなのかtransportなのか、tunnel mode は gre なのか ipsec なのか、色々迷いました。以下にASA向けの設定サンプルがあり、こちらでは crypto-map で設定がされていたので、これにそった設定をしていきたいと思います。

https://documentation.meraki.com/MX/Site-to-site_VPN/MX_to_Cisco_ASA_Site-to-site_VPN_Setup

### IOS-XEでのCrypto Mapサポート終了について
Cisco IOS-XEにおいてIPsecに使用されるCrypto Map機能のサポート終了がアナウンスされています。

https://www.cisco.com/c/en/us/products/collateral/ios-nx-os-software/ios-xe-17/bulletin-c25-744830.html

Crypto Mapを使用IPsec機能はIOS-XE 17.6.6までのサポートになります。よって、今回はマイグレーション方法として機能追加されたMulti-SA VTI機能の紹介とMulti-SA VTIで設定していきます。
Multi-SA VTIは IOS-XE 16.12で機能実装しており、Crypto Mapとのコンパチ接続をサポートする機能になります。


### IOS-XEの設定
Cisco IOS XEルータでのマルチSA仮想トンネルインターフェイスの設定というドキュメントがあるので、そちらを参考にいただくと分かりやすいのです。

https://www.cisco.com/c/ja_jp/support/docs/security-vpn/ipsec-negotiation-ike-protocols/214728-configure-multi-sa-virtual-tunnel-interf.html

私の環境ではDMVPN向けの設定を適宜流用してこのような設定をおこないました。

```
crypto ikev2 proposal default
 encryption aes-cbc-256 aes-cbc-192 aes-cbc-128
 integrity sha512 sha384 sha256
 group 19 14 21

crypto ikev2 keyring MERAKI_KR
 peer MERAKI_PEER
  address 192.0.2.1 255.255.255.255
  pre-shared-key 0 cisco123
 !
crypto ikev2 profile MERAKI_PROFILE
 match identity remote address 192.0.2.1
 authentication remote pre-share
 authentication local pre-share
 keyring local MERAKI_KR
 dpd 30 5 on-demand
crypto ipsec security-association replay window-size 1024
crypto ipsec transform-set MERAKI_TRANSFORM esp-aes 256 esp-sha256-hmac
 mode tunnel
crypto ipsec fragmentation after-encryption
crypto ipsec profile MERAKI_IPSEC
 set transform-set MERAKI_TRANSFORM
 set ikev2-profile MERAKI_PROFILE
 reverse-route
!
interface Tunnel1
 ip unnumbered GigabitEthernet0/0/0
 tunnel source GigabitEthernet0/0/0
 tunnel mode ipsec ipv4
 tunnel destination 192.0.2.1
 tunnel protection ipsec policy ipv4 CRYPTO_ACL
 tunnel protection ipsec profile MERAKI_IPSEC
!
ip access-list extended CRYPTO_ACL
 10 permit ip 192.168.0.0 0.0.0.255 172.16.0.0 0.0.0.255

 ```
ポイントとしては、
- crypto ipsec profile に  reverse-route がはいること
- ACL (CRYPTO_ACL) で暗号化対象のトラフィックを指定すること
- IPsec接続後、このACLがルーティングテーブルに載る
- ipsec mode ipsec ipv4 , mode tunnel
- tunnel のIPはMeraki側の指定がないのでなんでもよいのですが、ip unnumbred で WANポートを指定しています

IKEv2のパラメータは他の拠点向けにつかっているものを踏襲しています。それぞれの環境にあわせていただければと思います。


### 確認
```
#show crypto ikev2 sa
 IPv4 Crypto IKEv2  SA

Tunnel-id Local                 Remote                fvrf/ivrf            Status
1         x.x.x.x/4500   y.y.y.y/4500     none/lab             READY
      Encr: AES-CBC, keysize: 256, PRF: SHA256, Hash: SHA256, DH Grp:14, Auth sign: PSK, Auth verify: PSK
      Life/Active Time: 86400/50700 sec
      CE id: 1051, Session-id: 27
      Local spi: C708D696D384DD39       Remote spi: AB6BAC2D39E9DE04
```

```
#show crypto ipsec sa
interface: Tunnel1
    Crypto map tag: Tunnel8-head-0, local addr 192.0.2.1

   protected vrf: lab
   local  ident (addr/mask/prot/port): (192.168.0.0/255.255.255.0/0/0)
   remote ident (addr/mask/prot/port): (172.16.0.0/255.255.255.0/0/0)
   current_peer 192.0.2.2 port 4500
     PERMIT, flags={origin_is_acl,}
    #pkts encaps: 3, #pkts encrypt: 3, #pkts digest: 3
    #pkts decaps: 3, #pkts decrypt: 3, #pkts verify: 3
    #pkts compressed: 0, #pkts decompressed: 0
    #pkts not compressed: 0, #pkts compr. failed: 0
    #pkts not decompressed: 0, #pkts decompress failed: 0
    #send errors 0, #recv errors 0

     local crypto endpt.: 192.0.2.1, remote crypto endpt.: 192.0.2.2
     plaintext mtu 1390, path mtu 1460, ip mtu 1460, ip mtu idb Tunnel0
     current outbound spi: 0xC99013F6(3381662710)
     PFS (Y/N): N, DH group: none

     inbound esp sas:
      spi: 0xAF132A9(183579305)
        transform: esp-256-aes esp-sha256-hmac ,
        in use settings ={Tunnel UDP-Encaps, }
        conn id: 3440, flow_id: ESG:1440, sibling_flags FFFFFFFF80004048, crypto map: Tunnel8-head-0, initiator : True
         sa timing: remaining key lifetime (k/sec): (4608000/3338)
        IV size: 16 bytes
        replay detection support: Y  replay window size: 1024
        Status: ACTIVE(ACTIVE)

     inbound ah sas:

     inbound pcp sas:

     outbound esp sas:
      spi: 0xC99013F6(3381662710)
        transform: esp-256-aes esp-sha256-hmac ,
        in use settings ={Tunnel UDP-Encaps, }
        conn id: 3439, flow_id: ESG:1439, sibling_flags FFFFFFFF80004048, crypto map: Tunnel8-head-0, initiator : True
         sa timing: remaining key lifetime (k/sec): (4608000/3338)
        IV size: 16 bytes
        replay detection support: Y  replay window size: 1024
        Status: ACTIVE(ACTIVE)

     outbound ah sas:

     outbound pcp sas:

   protected vrf: lab
   local  ident (addr/mask/prot/port): (192.168.0.0/255.255.255.0/0/0)
   remote ident (addr/mask/prot/port): (172.16.0.0/255.255.255.0/0/0)
   current_peer 192.0.2.2 port 4500
     PERMIT, flags={origin_is_acl,}
    #pkts encaps: 8114, #pkts encrypt: 8114, #pkts digest: 8114
    #pkts decaps: 7944, #pkts decrypt: 7944, #pkts verify: 7944
    #pkts compressed: 0, #pkts decompressed: 0
    #pkts not compressed: 0, #pkts compr. failed: 0
    #pkts not decompressed: 0, #pkts decompress failed: 0
    #send errors 0, #recv errors 0

     local crypto endpt.: 192.0.2.1, remote crypto endpt.: 192.0.2.2
     plaintext mtu 1390, path mtu 1460, ip mtu 1460, ip mtu idb Tunnel0
     current outbound spi: 0xC7A6FF6F(3349610351)
     PFS (Y/N): N, DH group: none

     inbound esp sas:
      spi: 0x494E1C77(1229855863)
        transform: esp-256-aes esp-sha256-hmac ,
        in use settings ={Tunnel UDP-Encaps, }
        conn id: 3438, flow_id: ESG:1438, sibling_flags FFFFFFFF80004048, crypto map: Tunnel8-head-0, initiator : True
         sa timing: remaining key lifetime (k/sec): (4607996/3288)
        IV size: 16 bytes
        replay detection support: Y  replay window size: 1024
        Status: ACTIVE(ACTIVE)

     inbound ah sas:

     inbound pcp sas:

     outbound esp sas:
      spi: 0xC7A6FF6F(3349610351)
        transform: esp-256-aes esp-sha256-hmac ,
        in use settings ={Tunnel UDP-Encaps, }
        conn id: 3437, flow_id: ESG:1437, sibling_flags FFFFFFFF80004048, crypto map: Tunnel8-head-0, initiator : True
         sa timing: remaining key lifetime (k/sec): (4607997/3288)
        IV size: 16 bytes
        replay detection support: Y  replay window size: 1024
        Status: ACTIVE(ACTIVE)

     outbound ah sas:

     outbound pcp sas:
```

### 疎通確認
Meraki Dashboard から対抗機器への疎通確認が可能です。
アプライアンスの画面から、ツールでpingが便利ですね。
![Screenshot 2024-03-29 at 11.51.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/b21a0b30-125a-5143-1823-c7d046d9eebc.png)


## 今後の課題
今回はMulti-SA VTIで接続性を確認できました。
今後それ以外の方法（単純にVTIを使うなど)で接続できるのかは試してみたいと思います。

## 謝辞
本資料の作成に当たりこちらの投稿を参考にさせていただきました。私の課題のほぼすべてこちらで解決していたので、大変参考になりました。

https://qiita.com/h_toshik/items/99c9d1286c2913e3e70e