IOS-XE Catalyst 9k（CML） で EVPN-VXLANを構築してみた

:::note info 
この記事はシスコの有志による Cisco Systems Japan Advent Calendar 2023 の 10日目として投稿しています。
:::
2017年版: https://qiita.com/advent-calendar/2017/cisco
2018年版: https://qiita.com/advent-calendar/2018/cisco
2019年版: https://qiita.com/advent-calendar/2019/cisco
2020年版 1枚目: https://qiita.com/advent-calendar/2020/cisco
2020年版 2枚目: https://qiita.com/advent-calendar/2020/cisco2
2021年版 1枚目https://qiita.com/advent-calendar/2021/cisco
2021年版 2枚目https://qiita.com/advent-calendar/2021/cisco2
2022年版(1,2): https://qiita.com/advent-calendar/2022/cisco
2023年版: https://qiita.com/advent-calendar/2023/cisco<---こちら
# 初めに
今回はIOS XE で EVPN が構築できるようになったという情報を聞き、CML（Cisco Modeling Lab）のBETA CAT9000V UADPを使ってEVPNの環境をシングルホームとデュアルホームのL2延伸を作ってみました。
IOS XE 16.9.1からVXLANに対応をはじめ、様々な機能がCatalyst9300を中心に追加されています。
CMLには BETA CAT9000V Q200 もありますがこちらはCatalyst9500Xや9600Xに近いものになりますので今回はcatalyst9300と同じASICを積んだUADPの方を使用していきます。

# EVPN-VXLANとは？
EVPN-VXLANとは何なのかについて書いていきます。

まずEVPNとはEthernet VPNの略になります。
Layer 2 network延伸技術の一つです。
オーバーレイ ネットワークを提供し、BGP-MPを使ってMACアドレスやIPアドレス等を広報しています。
デュアルホーム構成による冗長や、VXLANやPBB,MPLS等用途に合わせてデータプレーンを選択できます。
今回使用するVXLANではL2とL3の統合ができ、よりスケールの大きい環境でL2,L3の技術を使用したい場合に活躍してくれます。

# 知っておくべき単語集
EVPNの構築に当たり、ここで知っておくべき単語をご紹介しておきます。

## VXLANについて
VXLANとはL3ネットワーク上に論理的なL2ネットワークを構築するトンネリングプロトコルのことです。
VXLAN IDを使用してイーサネットフレームをカプセル化することでトンネリングを実現しています。
VLANでは最大約4000のネットワークしか構成できないため、大規模なネットワークでは不足していましたが、VXLANを使用することで最大約1600万のネットワークを構成できるようになりました。
### VXLANネットワーク識別子
各 VXLAN セグメントは、VXLAN ネットワーク識別子と呼ばれる 24 ビットのセグメント ID で識別されます。これにより、最大 1,600 万の VXLAN セグメントを同じ管理ドメイン内に存在させることができます。
### 仮想トンネルエンドポイント(VTEP)
すべての VXLAN セグメントには、仮想トンネルエンドポイント（VTEP）と呼ばれるトンネルエッジデバイスがあります。これらのデバイスは VXLAN ネットワークのエッジにあり、VXLAN トンネルのインスタンスを作成し、VXLAN のカプセル化とカプセル化解除を実行します。
今回の記事ではPEルーターとして記載しています。
## VNI(VXLAN Network ID)
VXLANを識別するためのID

## EVI(EVPN インスタンス)
VTEP 上のバーチャル プライベート ネットワーク（VPN）を表します。
レイヤ3VPNのIP VRFに相当するもので、MAC VRFとも呼ばれています。

## アンダーレイマルチキャスト
アンダーレイネットワークでマルチキャストグループを介してトラフィックを複製する方法。
レイヤ 2 VNI をマルチキャストグループにマッピングすることでBUMトラフィックを転送する。


## 入力の複製
入力デバイスがすべてのトラフィックを複製して、個別のユニキャストとして出力デバイスに送信する。

## BUMトラフィック
Broadcast,Unknown Unicast,Multicast のトラフィックのことです。


# シングルホームでL2を延伸してみる
まずはシングルホームでホスト同士L2通信ができるか試してみます。


トポロジはこんな感じでやります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/6372b9b5-f603-7138-e2e4-ae757b5fb367.png)

各ホストは同じセグメントのアドレスを持たせていますが、PEルーター-Pルーター間は別のセグメントのアドレスを持たせています。
EVPNではレイヤ2VNIを使用してアンダーレイマルチキャスト、又は入力の複製方式のどちらかを使用してBUMトラフィックを転送します。

今回は初回なので入力の複製の方式を使います。
~~MultiCastわからなか~~


## 1.  アンダーレイをOSPFで形成する
まずは各ルータにOSPFを設定し、アンダーレイを形成します。
例としてPE1のConfigのみ記載します。
Loopback1はVXLANのLoopbackとして使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/73fd3d22-57ce-7f36-665c-bdfffa387203.png)


```java:PE1
ip routing
!
interface Loopback 0 --ルーティング用ループバック
 ip address 1.1.1.1 255.255.255.255
 ip ospf 1 area 0
!
interface Loopback 1 --VXLAN用ループバック
 ip address 11.11.11.11 255.255.255.255
 ip ospf 1 area 0
!
interface GigabitEthernet 1/0/1  --物理インターフェイス
 no switchport
 ip address 10.0.101.1 255.255.255.0
 ip ospf network point-to-point
 ip ospf 1 area 0
!
router ospf 1  --OSPFプロセス
 router-id 1.1.1.1
!
```

## 2. BGPの設定
続いてBGPでネイバーを張ります。
PルーターをルートリフレクタにしてPEルータ同士でネイバーを張ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/fb86c0a3-cb9b-d469-4560-664887f6d404.png)




```java:PE
interface Loopback 0 --ルーティング用ループバック
 ip address 1.1.1.1 255.255.255.255
 ip ospf 1 area 0
!
router bgp 65001  --BGP有効化
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 neighbor 10.10.10.10 remote-as 65001 --Pルーターとのセッション
 neighbor 10.10.10.10 update-source Loopback0 --BGPのアップデートソースをループバックに設定
 !
 address-family ipv4
 exit-address-family
 !
 address-family l2vpn evpn --アドレスファミリのL2VPN,EVPNを指定
  neighbor 10.10.10.10 activate --Pルーターとの情報交換を有効化
  neighbor 10.10.10.10 send-community both
 exit-address-family
```

```java:P
interface Loopback0
 ip address 10.10.10.10 255.255.255.255
 ip ospf 1 area 0
 !
router bgp 65001 --BGP有効化
 bgp router-id 10.10.10.10
 bgp log-neighbor-changes
 neighbor 1.1.1.1 remote-as 65001 --PEルーターとのセッション
 neighbor 1.1.1.1 update-source Loopback0 --BGPのアップデートソースをループバックに設定
 neighbor 2.2.2.2 remote-as 65001
 neighbor 2.2.2.2 update-source Loopback0
 !
 address-family ipv4
 exit-address-family
 !
 address-family l2vpn evpn --アドレスファミリのL2VPN,EVPNを指定
  neighbor 1.1.1.1 activate --PEルーターとの情報交換を有効化
  neighbor 1.1.1.1 send-community extended
  neighbor 1.1.1.1 route-reflector-client --ルートリフレクタクライアントの設定
  neighbor 2.2.2.2 activate
  neighbor 2.2.2.2 send-community both
  neighbor 2.2.2.2 route-reflector-client
 exit-address-family
 !
```

## 3. EVPNの設定 オーバレイ設定

次にEVPNの設定を入れ、オーバーレイを形成していきます。

VXLANのカプセリングを行うため、VTEPに当たるPEルーターで設定していきます。
また、PEルーターでNVEを使ってTunnelを張るので、Pルーターへの設定は特にもうありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/04a549be-5204-4d8f-b0f6-d3a83e9d98ea.png)


```java:PE
l2vpn evpn --l2VPN のEVPNを有効化
 replication-type ingress --BUMトラフィックの転送方式をingressに設定(マルチキャストを使用する場合は「static」)
!
l2vpn evpn instance 101 vlan-based --EVIを作成
 encapsulation vxlan --カプセリングのプロトコルにVXLANを指定
!
vlan 101 --VLAN を作成
!
vlan configuration 101 
 member evpn-instance 101 vni 10101 --VLAN101とVNI,EVIを紐づけ
!
interface nve1 --NVE インターフェイスを作成
 no ip address
 source-interface Loopback1 --アドレスをループバック1を使用
 host-reachability protocol bgp --BGPをホスト到達可能性プロトコルとして指定
 member vni 10101 ingress-replication --VNIとingressの設定を紐づけ
!
```



## 4. アクセス側インターフェイスの設定
最後にアクセス側のインターフェイスを設定します。
VLAN101をVNIやEVIと紐づけたのでアクセス側のインターフェイスをaccess port にして、VLAN101を割り当てます。

```java:PE
interface GigabitEthernet1/0/1
 switchport access vlan 202
 switchport mode access
```

これでEVPNのシングルホームの設定は完了しました。

## 5. 状態確認
まず、ホスト同士の疎通を確認してみます。

```java:HOST1_EVPN
cisco@inserthostname-here:~$ ping 172.16.1.2
PING 172.16.1.2 (172.16.1.2) 56(84) bytes of data.
64 bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=219 ms
64 bytes from 172.16.1.2: icmp_seq=2 ttl=64 time=124 ms
64 bytes from 172.16.1.2: icmp_seq=3 ttl=64 time=118 ms
64 bytes from 172.16.1.2: icmp_seq=4 ttl=64 time=136 ms
64 bytes from 172.16.1.2: icmp_seq=5 ttl=64 time=195 ms
^C
--- 172.16.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4008ms
rtt min/avg/max/mdev = 118.103/158.434/219.143/40.861 ms
cisco@inserthostname-here:~$ ping 172.16.1.3
PING 172.16.1.3 (172.16.1.3) 56(84) bytes of data.
64 bytes from 172.16.1.3: icmp_seq=1 ttl=64 time=1328 ms
64 bytes from 172.16.1.3: icmp_seq=2 ttl=64 time=642 ms
64 bytes from 172.16.1.3: icmp_seq=3 ttl=64 time=592 ms
64 bytes from 172.16.1.3: icmp_seq=4 ttl=64 time=651 ms
64 bytes from 172.16.1.3: icmp_seq=5 ttl=64 time=584 ms
^C
--- 172.16.1.3 ping statistics ---
6 packets transmitted, 5 received, 16.6667% packet loss, time 5005ms
rtt min/avg/max/mdev = 583.638/759.579/1328.367/285.628 ms, pipe 2
```
ネットワークを介しても、L2通信できました。

EVPNはMACアドレスも学習して通信していますので、PEルータで確認します。

```java:PE1
PE1#show l2route evpn mac 
  EVI       ETag  Prod    Mac Address                                          Next Hop(s) Seq Number
----- ---------- ----- -------------- ---------------------------------------------------- ----------
  101          0 L2VPN 5254.0006.f1fa                                          Gi1/0/3:101          0
  101          0 L2VPN 5254.000c.2df6                                          Gi1/0/3:101          0
  101          0 L2VPN 5254.000d.e06d                                          Gi1/0/2:101          0
  101          0   BGP 5254.0014.3369                                  V:10101 22.22.22.22          0
  101          0   BGP 5254.001c.d70c                                  V:10101 22.22.22.22          0
  101          0 L2VPN 5254.001e.c262                                          Gi1/0/2:101          0
```

```java:PE2
PE2#show l2route evpn mac 
  EVI       ETag  Prod    Mac Address                                          Next Hop(s) Seq Number
----- ---------- ----- -------------- ---------------------------------------------------- ----------
  101          0   BGP 5254.0006.f1fa                                  V:10101 11.11.11.11          0
  101          0   BGP 5254.000c.2df6                                  V:10101 11.11.11.11          0
  101          0   BGP 5254.000d.e06d                                  V:10101 11.11.11.11          0
  101          0 L2VPN 5254.0014.3369                                          Gi1/0/3:101          0
  101          0 L2VPN 5254.001c.d70c                                          Gi1/0/3:101          0
  101          0   BGP 5254.001e.c262                                  V:10101 11.11.11.11          0
```
HOST1 52:54:00:0d:e0:6d
HOST2 52:54:00:06:f1:fa
HOST3 52:54.00:1c.d7:0c 

PEルータが各ホストのMACアドレスを学習できています。

# マルチホームでも延伸してみる
マルチホームもできるとのことですのでこちらもやってみます。
マルチホームにすると、冗長させることができます。
PEルータが止まってしまってももう一方の経路に自動で切り替えて通信させることができます。

:::note warn 
IOS XRのEVPNはオールアクティブモードでも動作させることができ、ロードバランシングによる負荷分散もできますが、IOS XEのEVPNはシングルアクティブモードしかサポートしていないため、オールアクティブモードは使用できません。
:::
構成は下図のようにやっていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/1552a57e-5933-c506-9f23-dc9406404eb2.png)

PE3_MultiとL2 Switch間は冗長の設定ができてからリンクをつなげます。

## 1. シングルホームを構築
今回はシングルホームの環境からマルチホームの環境に移行させて作ってみます。
その際の注意点として、冗長の設定を入れる前にリンクをUPにしてはいけません。
設定を入れる前にリンクをUPにしてしまうとトラフィックのループやブラックホール化が起きてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/cd23e68c-b570-73ed-44ef-605a9f916008.png)


```java:PE1
ip routing
!
l2vpn evpn
 replication-type ingress
!
l2vpn evpn instance 202 vlan-based
 encapsulation vxlan
!
vlan configuration 202
 member evpn-instance 202 vni 20202
!
interface Loopback0
 ip address 1.1.1.1 255.255.255.255
 ip ospf 1 area 0
!
interface Loopback1
 ip address 11.11.11.11 255.255.255.255
 ip ospf 1 area 0
!
interface GigabitEthernet1/0/1
 no switchport
 ip address 10.0.201.1 255.255.255.0
 ip ospf network point-to-point
 ip ospf 1 area 0
!
interface GigabitEthernet1/0/2
 switchport access vlan 202
 switchport mode access
!
interface nve1
 no ip address
 source-interface Loopback1
 host-reachability protocol bgp
 member vni 20202 ingress-replication
!
router ospf 1
 router-id 1.1.1.1
!
router bgp 65001
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 neighbor 10.10.10.10 remote-as 65001
 neighbor 10.10.10.10 update-source Loopback0
 !
 address-family ipv4
 exit-address-family
 !
 address-family l2vpn evpn
  neighbor 10.10.10.10 activate
  neighbor 10.10.10.10 send-community both
 exit-address-family
!
```

```java:P
ip routing
!
interface Loopback0
 ip address 10.10.10.10 255.255.255.255
 ip ospf 1 area 0
!
interface GigabitEthernet1/0/1
 no switchport
 ip address 10.0.201.20 255.255.255.0
 ip ospf network point-to-point
 ip ospf 1 area 0
!
interface GigabitEthernet1/0/2
 no switchport
 ip address 10.0.202.20 255.255.255.0
 ip ospf network point-to-point
 ip ospf 1 area 0
!
interface GigabitEthernet1/0/3
 no switchport
 ip address 10.0.203.20 255.255.255.0
 ip ospf network point-to-point
 ip ospf 1 area 0
!
router ospf 1
 router-id 10.10.10.10
!
router bgp 65001
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 neighbor 1.1.1.1 remote-as 65001
 neighbor 1.1.1.1 update-source Loopback0
 neighbor 2.2.2.2 remote-as 65001
 neighbor 2.2.2.2 update-source Loopback0
 neighbor 3.3.3.3 remote-as 65001
 neighbor 3.3.3.3 update-source Loopback0
 !
 address-family ipv4
 exit-address-family
 !
 address-family l2vpn evpn
  neighbor 1.1.1.1 activate
  neighbor 1.1.1.1 send-community both
  neighbor 1.1.1.1 route-reflector-client
  neighbor 2.2.2.2 activate
  neighbor 2.2.2.2 send-community both
  neighbor 2.2.2.2 route-reflector-client
  neighbor 3.3.3.3 activate
  neighbor 3.3.3.3 send-community both
  neighbor 3.3.3.3 route-reflector-client
 exit-address-family
```

設定は前段のシングルホームとほとんど一緒です。
アドレスやVlanなどは変えていますがそれ以外は基本的には一緒です。

## 2. イーサネットセグメントで冗長性の設定
続いてイーサネットセグメントを設定し、冗長性を持たせます。

この設定はPE2,PE3両方とも同じ設定を入れなければ冗長を組むことはできません。
ESI(Ethernet Segment Id)を設定しますがこれが同じになっていないとお互いが冗長を組むためのペアだということを認識できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/052b84ba-c773-8685-1d00-4f6aa07f2b28.png)


```java:PE
l2vpn evpn ethernet-segment 1
 identifier type 0 00.00.00.00.00.00.00.00.01
 redundancy single-active
```

## 3. イーサネットセグメントと VTEP 上のインターフェイスとの関連付け

関連付けはアクティブになっているリンクから設定してください。
今回のトポロジだと、PE2のアクセス側のインターフェイスから設定になります。
最初に説明したようにループやブラックホール化が起きてしまいます。

```java:PE1,PE2
interface GigabitEthernet1/0/1
 evpn ethernet-segment 1
```

## 4. 最後のインターフェイスを起動させる

設定が完了したら2本目のリンクを起動させて完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/93ee642d-b188-8b60-aa06-37cd656e322f.png)


## 5. 状態確認
まずはホスト同士L2通信ができているか確認します。
```java:HOST1_Multi
cisco@inserthostname-here:~$ ping 172.16.2.2
PING 172.16.2.2 (172.16.2.2) 56(84) bytes of data.
64 bytes from 172.16.2.2: icmp_seq=1 ttl=64 time=577 ms
64 bytes from 172.16.2.2: icmp_seq=2 ttl=64 time=644 ms
64 bytes from 172.16.2.2: icmp_seq=3 ttl=64 time=596 ms
64 bytes from 172.16.2.2: icmp_seq=4 ttl=64 time=557 ms
64 bytes from 172.16.2.2: icmp_seq=5 ttl=64 time=585 ms
```

こちらも現在は疎通が取れています。

続いてそれぞれのPEのEVIの状態を確認します。
ここでどちらがアクティブリンクで、どちらがバックアップのリンクかどうかを確認します。

```java:PE2
PE2_Multi#show l2vpn evpn evi detail
EVPN instance:       202 (VLAN Based)
  RD:                10.0.202.2:202 (auto)
  Import-RTs:        65001:202
  Export-RTs:        65001:202
  Per-EVI Label:     none
  State:             Established
  Replication Type:  Ingress (global)
  Encapsulation:     vxlan
  IP Local Learn:    Enabled (global)
  Adv. Def. Gateway: Enabled (global)
  Re-originate RT5:  Disabled
  Adv. Multicast:    Disabled (global)
  AR Flood Suppress: Enabled (global)
  Vlan:              202
    Protected:       False
    Ethernet-Tag:    0
    State:           Established
    Flood Suppress:  Attached
    Core If:
    Access If:
    NVE If:          nve1
    RMAC:            0000.0000.0000
    Core Vlan:       0
    L2 VNI:          20202
    L3 VNI:          0
    VTEP IP:         22.22.22.22
    Pseudoports:
      GigabitEthernet1/0/1 service instance 202 (DF state: blocked) <--バックアップリンク
        Routes: 0 MAC, 0 MAC/IP
        ESI: 0000.0000.0000.0000.0001
    Peers:
      11.11.11.11
        Routes: 1 MAC, 2 MAC/IP, 1 IMET, 0 EAD
      33.33.33.33
        Routes: 5 MAC, 5 MAC/IP, 1 IMET, 1 EAD
```

```java:PE3
PE3_Multi#show l2vpn evpn evi detail
EVPN instance:       202 (VLAN Based)
  RD:                3.3.3.3:202 (auto)
  Import-RTs:        65001:202
  Export-RTs:        65001:202
  Per-EVI Label:     none
  State:             Established
  Replication Type:  Ingress (global)
  Encapsulation:     vxlan
  IP Local Learn:    Enabled (global)
  Adv. Def. Gateway: Enabled (global)
  Re-originate RT5:  Disabled
  Adv. Multicast:    Disabled (global)
  AR Flood Suppress: Enabled (global)
  Vlan:              202
    Protected:       False
    Ethernet-Tag:    0
    State:           Established
    Flood Suppress:  Attached
    Core If:
    Access If:
    NVE If:          nve1
    RMAC:            0000.0000.0000
    Core Vlan:       0
    L2 VNI:          20202
    L3 VNI:          0
    VTEP IP:         33.33.33.33
    Pseudoports:
      GigabitEthernet1/0/1 service instance 202 (DF state: forwarding) <--アクティブリンク
        Routes: 5 MAC, 5 MAC/IP
        ESI: 0000.0000.0000.0000.0001
    Peers:
      11.11.11.11
        Routes: 1 MAC, 2 MAC/IP, 1 IMET, 0 EAD
      22.22.22.22
        Routes: 0 MAC, 0 MAC/IP, 1 IMET, 1 EAD
```
PE3でDFがforwardingになっているのでこちらがアクティブリンクとなっています。
DFとは指定フォワーダといい、自動で計算されて割り当てられます。
バックアップのインターフェイスとなった場合はblockedと記載されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/bccfca0a-17b1-cd21-8fe5-f96f37b84e37.png)

続いて障害が起きたときの動作を見てみます。
CMLの性質上、対向がdownになっても自分のインターフェイスはdownにならず、UPのままになります。そのため使用している経路が使えなくなったことに気づかず、EVIはforwardingのままになってしまいます。
今回はforwardingとなっているPE3のインターフェイスをshutdownして疎通が途切れないか確認してみます。
host1からhost2へPingをしたままインターフェイスを落とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/7768f6f5-f98a-222f-8de8-584c11d301b7.png)


```java:HOST1_Multi
cisco@inserthostname-here:~$ ping 172.16.2.2
PING 172.16.2.2 (172.16.2.2) 56(84) bytes of data.
64 bytes from 172.16.2.2: icmp_seq=1 ttl=64 time=658 ms
64 bytes from 172.16.2.2: icmp_seq=2 ttl=64 time=660 ms
64 bytes from 172.16.2.2: icmp_seq=3 ttl=64 time=676 ms
64 bytes from 172.16.2.2: icmp_seq=4 ttl=64 time=633 ms
64 bytes from 172.16.2.2: icmp_seq=5 ttl=64 time=697 ms
64 bytes from 172.16.2.2: icmp_seq=12 ttl=64 time=672 ms
64 bytes from 172.16.2.2: icmp_seq=13 ttl=64 time=730 ms
64 bytes from 172.16.2.2: icmp_seq=14 ttl=64 time=555 ms
64 bytes from 172.16.2.2: icmp_seq=15 ttl=64 time=601 ms
```

icmp_seqを見ると7秒ほど疎通が止まりましたが、自動で経路が切り替わり、疎通は通っています。
この7秒はshutdownコマンドを入れてから実際にインターフェイスがdownするまでの時間によって起きたラグの7秒になります。
ルータのCLIにdownのログが出てすぐに疎通が再開されましたので、downを検知してすぐに経路は切り替わっていました。


もう一度EVIの状態を確認してみます。
```java:PE2
PE2_Multi#show l2vpn evpn evi detail

--skip--

    Pseudoports:
      GigabitEthernet1/0/1 service instance 202 (DF state: forwarding)
        Routes: 1 MAC, 0 MAC/IP
        ESI: 0000.0000.0000.0000.0001
    Peers:
      11.11.11.11
        Routes: 1 MAC, 2 MAC/IP, 1 IMET, 0 EAD
```

```java:PE3
PE3_Multi#show l2vpn evpn evi detail

--skip--

    Pseudoports:
      none <--ESI等が見えなくなった
    Peers:
      11.11.11.11
        Routes: 1 MAC, 2 MAC/IP, 1 IMET, 0 EAD
      22.22.22.22
        Routes: 2 MAC, 1 MAC/IP, 1 IMET, 1 EAD
```

するとPE2のDFがforwardingに切り替わっていました。

では最後に切り戻しをしてみます。
shutdownしたインターフェイスをno shutdownしてUPさせます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/5fe2efa4-6347-5e39-69f5-60ec6a124b03.png)


切り戻しの時も数秒疎通が止まっていましたが、また疎通は再開されました。
こちらはコマンド投入後、インターフェイスが上がるまでのラグとDFを決めるための再計算が走ったからだと思われます。

```java:HOST1_Multi
cisco@inserthostname-here:~$ ping 172.16.2.2
PING 172.16.2.2 (172.16.2.2) 56(84) bytes of data.
64 bytes from 172.16.2.2: icmp_seq=1 ttl=64 time=951 ms
64 bytes from 172.16.2.2: icmp_seq=2 ttl=64 time=1089 ms
64 bytes from 172.16.2.2: icmp_seq=3 ttl=64 time=1078 ms
64 bytes from 172.16.2.2: icmp_seq=4 ttl=64 time=834 ms
64 bytes from 172.16.2.2: icmp_seq=5 ttl=64 time=1075 ms
64 bytes from 172.16.2.2: icmp_seq=6 ttl=64 time=1271 ms
64 bytes from 172.16.2.2: icmp_seq=11 ttl=64 time=886 ms <--5秒後再開
64 bytes from 172.16.2.2: icmp_seq=12 ttl=64 time=1453 ms
64 bytes from 172.16.2.2: icmp_seq=13 ttl=64 time=1007 ms
64 bytes from 172.16.2.2: icmp_seq=14 ttl=64 time=1123 ms
64 bytes from 172.16.2.2: icmp_seq=15 ttl=64 time=1100 ms
```

EVIの状態を見てみると、、、

```java:PE2
PE2_Multi#show l2vpn evpn evi detail

---skip---

    Pseudoports:
      GigabitEthernet1/0/1 service instance 202 (DF state: blocked)
        Routes: 0 MAC, 0 MAC/IP
        ESI: 0000.0000.0000.0000.0001
    Peers:
      11.11.11.11
        Routes: 1 MAC, 2 MAC/IP, 1 IMET, 0 EAD
      33.33.33.33
        Routes: 4 MAC, 3 MAC/IP, 1 IMET, 1 EAD
```

```java:PE3
PE3_Multi#show l2vpn evpn evi detail

---skip---

    Pseudoports:
      GigabitEthernet1/0/1 service instance 202 (DF state: forwarding)
        Routes: 3 MAC, 3 MAC/IP
        ESI: 0000.0000.0000.0000.0001
    Peers:
      11.11.11.11
        Routes: 1 MAC, 2 MAC/IP, 1 IMET, 0 EAD
      22.22.22.22
        Routes: 0 MAC, 0 MAC/IP, 1 IMET, 1 EAD
```

forwadingはPE3に戻っています。
うまいこと切り戻しもできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989076/b49e23ca-1540-721c-ebbd-74972d5c1dd0.png)


# 最後に

CMLでもEVPN-VXLANを作ることができました。
まだBETA版のCML の 9Kv ですが問題なく動いてくれてよかったです。
ただ、私の環境が少し重かったのかマルチの経路切り替えに少し時間がかかったのが残念でした、、
Cat9kをたくさん使うとなるとリソースがかなり必要なので注意してください...
いつか機材があれば実機で切り替えの部分を見てみたいです。

また入力の複製方式はVTEPの数だけBUMトラフィックを複製するのでスケールの問題が出てくることがあります。
そのためマルチキャストを使った方式だと効率よく配送できます。
今回はマルチキャストやL3VPNにまで手が伸びなかったため今後トライしてみたいと思います。



# 免責事項
本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、シスコの意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、シスコや他の関係者による推奨や表明を目的としたものではありません。各利用者は、本Webサイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本Web サイトの利用に関するあらゆる責任からシスコを免責することに同意したものとします。

# 参考
Cisco IOS XE Bengaluru 17.6.x（Catalyst 9300 スイッチ）BGP EVPN VXLAN コンフィギュレーションガイド
https://www.cisco.com/c/ja_jp/td/docs/switches/lan/catalyst9300/software/release/17-6/configuration_guide/vxlan/b_176_bgp_evpn_vxlan_9300_cg.html