Arista vEOS-labでEVPN-MPLSとEVPN-VXLANを相互接続してみた

EVPNで利用されるVXLANやMPLSを相互に接続してみたく、ネットワークシミュレータを使って動作確認したメモ
今回は、Arista の vEOS-lab を利用して確認してみました。

※自分で調べた内容をもとにまとめています。誤りが含まれている可能性がありますので、参考程度にご覧いただき、正確な情報は公式ドキュメント等をご確認ください！

# なぜEVPN-MPLSとVXLANの相互接続が必要なのか

EVPN-MPLSとVXLANの相互接続の必要性についてChatGPTさんに聞くと、**異なるネットワークドメイン（たとえば WAN と DC）を一貫して接続・統合するため**とのことで、ユースケースとしては以下があるそうです。

| ユースケース                   | 説明                                           |
| ------------------------ | -------------------------------------------- |
| DC間接続（DCI）               | 拠点ごとに VXLAN を使っていて、MPLS コア経由でつなぎたい           |
| サービスプロバイダの MPLS 網とDC の統合 | プロバイダの MPLS EVPN と、エンタープライズの VXLAN を直接つなげる   |
| クラウドとオンプレミスのハイブリッド化      | オンプレ DC は VXLAN、WAN や支社網は MPLS の構成で EVPN に統一 |

# 構成概要

今回は以下の2パターンの構成をネットワークシミュレータで確認しました

① EVPN-MPLS と EVPN-VXLAN を1台の機器で相互接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043279/07fd2be6-95dc-49a5-8026-013c15fcf24f.png)

② さらに GW となる機器を2台にして EVPN マルチホーミングで装置冗長
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043279/dae5172c-42b8-4666-8a75-7bb079fb2faa.png)

MPLS と VXLAN ともに L2VPN とし、両端の PC を同じ IP セグメントで通信できることを確認しました。

利用した Arista の vEOS のバージョンは以下の通りです

- Arista vEOS-lab version: 4.34.0F

vEOS-lab のダウンロードやネットワークシミュレータでの利用は以下が参考になりました

[https://changineer.info/network/arista\_eos/arista\_eos\_veos\_basic.html](https://changineer.info/network/arista_eos/arista_eos_veos_basic.html)
[https://www.eve-ng.net/index.php/documentation/howtos/howto-add-arista-veos/](https://www.eve-ng.net/index.php/documentation/howtos/howto-add-arista-veos/)

# ① EVPN-MPLSとEVPN-VXLANを1台の機器で相互接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043279/07fd2be6-95dc-49a5-8026-013c15fcf24f.png)

## ①-0 全コンフィグ一覧

はじめに、このあとに説明する今回行った全設定を記載します。

<details><summary>vEOS-MPLS-1 : 全設定</summary>

```cisco_ios:vEOS-MPLS-1 : 全設定
! ホストネームを設定
hostname vEOS-MPLS-1

! 初期状態で動作しているLLDPとSTPを無効化
no lldp run
spanning-tree mode none

! VLAN100を作成
vlan 100
   name USER_100

! OSPFを利用するIFにIPアドレス設定とOSPFでのコストとネットワークタイプを設定
interface Ethernet1
   description to_vEOS-GW-1
   no switchport
   ip address 10.9.1.1/31
   ip ospf cost 100
   ip ospf network point-to-point

! Ethernet8にアクセスポートとしてVLAN100を設定
interface Ethernet8
   description to_USER_VLAN_100
   switchport access vlan 100

! Loopback0 にアドレス設定
interface Loopback0
   ip address 10.0.0.11/32

! ルーティング機能を有効化
ip routing

! MPLSフォワーディング機能を有効化
mpls ip
! SRGBで利用したい16000-23999をデフォルトでstaticで利用されているため別の場所に移動する
mpls label range static 16 15984
! SRGBを16000-23999で設定
mpls label range ospf-sr 16000 8000

! BGP設定
router bgp 65000
   router-id 10.0.0.11
   neighbor MP_BGP_EVPN_MPLS peer group
   neighbor MP_BGP_EVPN_MPLS remote-as 65000
   neighbor MP_BGP_EVPN_MPLS update-source Loopback0
   neighbor MP_BGP_EVPN_MPLS send-community standard extended
   neighbor 10.0.0.1 peer group MP_BGP_EVPN_MPLS
   !
!  BGP内の設定で、MAC VRFとしてVLAN100を作成し、RDとRTを設定
   vlan 100
      rd 10.0.0.11:100
      route-target both 65000:100
!     CE側から学習しているMACアドレスをBGPで広報する
      redistribute learned
   !
!  BGPでEVPNを利用する設定
   address-family evpn
      neighbor MP_BGP_EVPN_MPLS activate
!     MPLSでカプセル化することを指定
      neighbor MP_BGP_EVPN_MPLS encapsulation mpls next-hop-self source-interface Loopback0

! OSPF設定
router ospf 1
   router-id 10.0.0.11
   passive-interface default
   no passive-interface Ethernet1
   network 0.0.0.0/0 area 0.0.0.0
   !
!  OSPFでSR-MPLSを有効にしNode-SIDを指定する
   segment-routing mpls
      no shutdown
      prefix-segment 10.0.0.11/32 index 11
```

</details>


<details><summary>vEOS-VXLAN-1 : 全設定</summary>

```cisco_ios:vEOS-VXLAN-1 : 全設定
! ホストネームを設定
hostname vEOS-VXLAN-1

! 初期状態で動作しているLLDPとSTPを無効化
no lldp run
spanning-tree mode none

! VLAN900を作成
vlan 900
   name USER_900

! OSPFを利用するIFにIPアドレス設定とOSPFでのコストとネットワークタイプを設定
interface Ethernet1
   description to_vEOS-GW-1
   no switchport
   ip address 10.9.11.1/31
   ip ospf cost 100
   ip ospf network point-to-point

! Ethernet8にアクセスポートとしてVLAN900を設定
interface Ethernet8
   description to_USER_VLAN_900
   switchport access vlan 900

! Loopback0 にアドレス設定
interface Loopback0
   ip address 10.0.0.12/32

! VXLANの設定、VLAN:900をVNI:1100にする
interface Vxlan1
   vxlan source-interface Loopback0
   vxlan vlan 900 vni 1100

! ルーティング機能を有効化
ip routing

! BGP設定
router bgp 65000
   router-id 10.0.0.12
   neighbor MP_BGP_EVPN_VXLAN peer group
   neighbor MP_BGP_EVPN_VXLAN remote-as 65000
   neighbor MP_BGP_EVPN_VXLAN update-source Loopback0
   neighbor MP_BGP_EVPN_VXLAN send-community standard extended
!  VXLANのMP-BGPのネイバーには、GW の Loopback1 のアドレスを指定する
   neighbor 10.100.0.1 peer group MP_BGP_EVPN_VXLAN
   !
!  BGP内の設定で、MAC VRFとしてVLAN900を作成し、RDとRTを設定
   vlan 900
      rd 10.0.0.12:900
      route-target both 65000:900
!     CE側から学習しているMACアドレスをBGPで広報する
      redistribute learned
   !
!  BGPでEVPNを利用する設定
   address-family evpn
      neighbor MP_BGP_EVPN_VXLAN activate
!     VXLANでカプセル化することを指定
      neighbor MP_BGP_EVPN_VXLAN encapsulation vxlan

! OSPF設定
router ospf 1
   router-id 10.0.0.12
   passive-interface default
   no passive-interface Ethernet1
   network 0.0.0.0/0 area 0.0.0.0
```

</details>

<details><summary>vEOS-GW-1 : 全設定</summary>

```cisco_ios:vEOS-GW-1 : 全設定
! ホストネームを設定
hostname vEOS-GW-1

! 初期状態で動作しているLLDPとSTPを無効化
no lldp run
spanning-tree mode none

! VLAN100を作成
vlan 100
   name USER_100

! OSPFを利用するIFにIPアドレス設定とOSPFでのコストとネットワークタイプを設定
interface Ethernet1
   description to_vEOS-MPLS-1
   no switchport
   ip address 10.9.1.0/31
   ip ospf cost 100
   ip ospf network point-to-point
!
interface Ethernet2
   description to_vEOS-VXLAN-1
   no switchport
   ip address 10.9.11.0/31
   ip ospf cost 100
   ip ospf network point-to-point

! Loopback0 にアドレス設定
interface Loopback0
   ip address 10.0.0.1/32

! Loopback1 の作成
interface Loopback1
   ip address 10.100.0.1/32

! VXLANの設定、VLAN:100をVNI:1100にする、またsource-interface Loopback1にする
interface Vxlan1
   vxlan source-interface Loopback1
   vxlan vlan 100 vni 1100

! ルーティング機能を有効化
ip routing

! MPLSフォワーディング機能を有効化
mpls ip
! SRGBで利用したい16000-23999をデフォルトでstaticで利用されているため別の場所に移動する
mpls label range static 16 15984
! SRGBを16000-23999で設定
mpls label range ospf-sr 16000 8000

! BGP設定
router bgp 65000
   router-id 10.0.0.1
   !
!  BGP EVPN-MPLS側の設定
   neighbor MP_BGP_EVPN_MPLS peer group
   neighbor MP_BGP_EVPN_MPLS remote-as 65000
!  GWは、EVPN-MPLSはupdate-source Loopback0 にする
   neighbor MP_BGP_EVPN_MPLS update-source Loopback0
   neighbor MP_BGP_EVPN_MPLS send-community standard extended
   neighbor 10.0.0.11 peer group MP_BGP_EVPN_MPLS
   !
!  BGP EVPN-VXLAN側の設定
   neighbor MP_BGP_EVPN_VXLAN peer group
   neighbor MP_BGP_EVPN_VXLAN remote-as 65000
!  GWは、EVPN-VXLANはupdate-source Loopback1 にする
   neighbor MP_BGP_EVPN_VXLAN update-source Loopback1
   neighbor MP_BGP_EVPN_VXLAN send-community standard extended
   neighbor 10.0.0.12 peer group MP_BGP_EVPN_VXLAN
   !
!  BGP内の設定で、MAC VRFとしてVLAN100を作成
   vlan 100
!     EVPN-MPLS側のRDとRTを設定
      rd 10.0.0.1:100
      route-target both 65000:100
!     同じVLAN100の中にリモートドメインとして、EVPN-VXLAN側のRDとRTを設定し、EVPN-MPLSとEVPN-VXLANを紐づける
      rd evpn domain remote 10.100.0.1:100
      route-target import export evpn domain remote 65000:900
   !
!  BGPでEVPNを利用する設定
   address-family evpn
      neighbor MP_BGP_EVPN_MPLS activate
!     MPLSでカプセル化することを指定
      neighbor MP_BGP_EVPN_MPLS encapsulation mpls next-hop-self source-interface Loopback0
      !
      neighbor MP_BGP_EVPN_VXLAN activate
!     VXLANでカプセル化することを指定
      neighbor MP_BGP_EVPN_VXLAN encapsulation vxlan
!     ドメインをRemoteに指定
      neighbor MP_BGP_EVPN_VXLAN domain remote

! OSPF設定
router ospf 1
   router-id 10.0.0.1
   passive-interface default
   no passive-interface Ethernet1
   no passive-interface Ethernet2
   network 0.0.0.0/0 area 0.0.0.0
   !
!  OSPFでSR-MPLSを有効にしNode-SIDを指定する
   segment-routing mpls
      no shutdown
      prefix-segment 10.0.0.1/32 index 1
```

</details>



## ①-1 初期設定・IP・OSPFの設定

初期設定と各 IF の IP アドレスを設定し、OSPF で経路交換を行います。

- router-id は Loopback0 のアドレスを利用
- Area はすべてバックボーンエリア (0.0.0.0)
- 装置間は point-to-point でコストは 100

3つの機器の設定は以下です。

<details><summary>vEOS-MPLS-1</summary>

```cisco_ios:vEOS-MPLS-1 : 初期設定・IP・OSPFの設定
! ホストネームを設定
hostname vEOS-MPLS-1

! 初期状態で動作しているLLDPとSTPを無効化
no lldp run
spanning-tree mode none

! ルーティング機能を有効化
ip routing

! Loopback0 にアドレス設定
interface Loopback0
   ip address 10.0.0.11/32

! OSPFを利用するIFにIPアドレス設定とOSPFでのコストとネットワークタイプを設定
interface Ethernet1
   description to_vEOS-GW-1
   no switchport
   ip address 10.9.1.1/31
   ip ospf cost 100
   ip ospf network point-to-point

! OSPF設定
router ospf 1
   router-id 10.0.0.11
   passive-interface default
   no passive-interface Ethernet1
   network 0.0.0.0/0 area 0.0.0.0
```

</details>


<details><summary>vEOS-VXLAN-1</summary>

```cisco_ios:vEOS-VXLAN-1 : 初期設定・IP・OSPFの設定
! ホストネームを設定
hostname vEOS-VXLAN-1

! 初期状態で動作しているLLDPとSTPを無効化
no lldp run
spanning-tree mode none

! ルーティング機能を有効化
ip routing

! Loopback0 にアドレス設定
interface Loopback0
   ip address 10.0.0.12/32

! OSPFを利用するIFにIPアドレス設定とOSPFでのコストとネットワークタイプを設定
interface Ethernet1
   description to_vEOS-GW-1
   no switchport
   ip address 10.9.11.1/31
   ip ospf cost 100
   ip ospf network point-to-point

! OSPF設定
router ospf 1
   router-id 10.0.0.12
   passive-interface default
   no passive-interface Ethernet1
   network 0.0.0.0/0 area 0.0.0.0
```

</details>


<details><summary>vEOS-GW-1</summary>

```cisco_ios:vEOS-GW-1 : 初期設定・IP・OSPFの設定
! ホストネームを設定
hostname vEOS-GW-1

! 初期状態で動作しているLLDPとSTPを無効化
no lldp run
spanning-tree mode none

! ルーティング機能を有効化
ip routing

! Loopback0 にアドレス設定
interface Loopback0
   ip address 10.0.0.1/32

! OSPFを利用するIFにIPアドレス設定とOSPFでのコストとネットワークタイプを設定
interface Ethernet1
   description to_vEOS-MPLS-1
   no switchport
   ip address 10.9.1.0/31
   ip ospf cost 100
   ip ospf network point-to-point
!
interface Ethernet2
   description to_vEOS-VXLAN-1
   no switchport
   ip address 10.9.11.0/31
   ip ospf cost 100
   ip ospf network point-to-point

! OSPF設定
router ospf 1
   router-id 10.0.0.1
   passive-interface default
   no passive-interface Ethernet1
   no passive-interface Ethernet2
   network 0.0.0.0/0 area 0.0.0.0
```

</details>

## ①-2 SR-MPLSの設定

vEOS-MPLS-1 と vEOS-GW-1 に MPLS とセグメントルーティングを設定します。

<details><summary>vEOS-MPLS-1</summary>

```cisco_ios:vEOS-MPLS-1 : SR-MPLSの設定
! MPLSフォワーディング機能を有効化
mpls ip
! SRGBで利用したい16000-23999をデフォルトでstaticで利用されているため別の場所に移動する
mpls label range static 16 15984
! SRGBを16000-23999で設定
mpls label range ospf-sr 16000 8000

! OSPFでSR-MPLSを有効にしNode-SIDを指定する
router ospf 1
   segment-routing mpls
      no shutdown
      prefix-segment 10.0.0.11/32 index 11
```

</details>



<details><summary>vEOS-GW-1</summary>

```cisco_ios:vEOS-GW-1 : SR-MPLSの設定
! MPLSフォワーディング機能を有効化
mpls ip
! SRGBで利用したい16000-23999をデフォルトでstaticで利用されているため別の場所に移動する
mpls label range static 16 15984
! SRGBを16000-23999で設定
mpls label range ospf-sr 16000 8000

! OSPFでSR-MPLSを有効にしNode-SIDを指定する
router ospf 1
   segment-routing mpls
      no shutdown
      prefix-segment 10.0.0.1/32 index 1
```

</details>

### 参考：`mpls label range` の設定順序
`mpls label range` の設定順序に注意が必要です。  
たとえば以下のように `show running-config` に表示されていても、

```
mpls label range ospf-sr 16000 8000
mpls label range static 16 15984
```


実際には `static` のデフォルトのラベル範囲と重複しているため、先に `static` を設定しないと、`ospf-sr` の設定が重複エラーで失敗します。

```
% Label range ospf-sr overlaps with mpls label range static
```


```:MPLSラベル範囲のデフォルト値
#show mpls label ranges
Start     End       Size      Usage
------------------------------------------------
0         15        16        reserved
16        99999     99984     static mpls　　<====== ★staticがSRで設定したい16000～を含んでいる
100000    362143    262144    free (dynamic)
362144    899999    537856    unassigned
900000    965535    65536     isis-sr
900000    965535    65536     bgp-sr
900000    965535    65536     ospf-sr
965536    1031071   65536     srlb
1031072   1032095   1024      l2evpn shared ethernet-segment
1032096   1036287   4192      unassigned
1036288   1048575   12288     l2evpn
```

そのため、次のように**設定順を入れ替える**必要があります。

```
mpls label range static 16 15984
mpls label range ospf-sr 16000 8000
```

`show running-config` の表示順がそのまま設定順とは限らないため、ラベル範囲が重複しないよう注意して設定しましょう。

## ①-3 MP-BGP：EVPNの設定

EVPNでルート交換するMP-BGPの設定を行いますが、今回は、下の絵のように中心のGWはMPLS側とVXLAN側でLoopbackアドレスを変えてBGPのピアをはります
また、EVPN-MPLS と EVPN-VXLAN のマルチドメインで、EVPN-VXLAN 側を remote として設定していきます
後のVPNの設定際に EVPN-MPLS(local) と EVPN-VXLAN(remote) を紐づける設定を行います 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043279/2c1417f0-71e5-44fd-b2dd-b19a404b5909.png)

### EVPN-MPLS側の設定
まずはEVPN-MPLS側の設定を以下の通り行います

```cisco_ios:vEOS-MPLS-1 : BGP EVPN-MPLS側の設定
! BGP設定
router bgp 65000
   router-id 10.0.0.11
   neighbor MP_BGP_EVPN_MPLS peer group
   neighbor MP_BGP_EVPN_MPLS remote-as 65000
   neighbor MP_BGP_EVPN_MPLS update-source Loopback0
   neighbor MP_BGP_EVPN_MPLS send-community standard extended
   neighbor 10.0.0.1 peer group MP_BGP_EVPN_MPLS
   !
!  BGPでEVPNを利用する設定
   address-family evpn
      neighbor MP_BGP_EVPN_MPLS activate
!     MPLSでカプセル化することを指定
      neighbor MP_BGP_EVPN_MPLS encapsulation mpls next-hop-self source-interface Loopback0
```

```cisco_ios:vEOS-GW-1 : BGP EVPN-MPLS側の設定
! BGP設定
router bgp 65000
   router-id 10.0.0.1
   neighbor MP_BGP_EVPN_MPLS peer group
   neighbor MP_BGP_EVPN_MPLS remote-as 65000
!  GWは、EVPN-MPLSはupdate-source Loopback0 にする
   neighbor MP_BGP_EVPN_MPLS update-source Loopback0
   neighbor MP_BGP_EVPN_MPLS send-community standard extended
   neighbor 10.0.0.11 peer group MP_BGP_EVPN_MPLS
   !
!  BGPでEVPNを利用する設定
   address-family evpn
      neighbor MP_BGP_EVPN_MPLS activate
!     MPLSでカプセル化することを指定
      neighbor MP_BGP_EVPN_MPLS encapsulation mpls next-hop-self source-interface Loopback0
```

### EVPN-VXLAN側の設定
次にEVPN-VXLAN側の設定を行います、GWについては、Loopback1 を利用するため、新規にLoopback1 の作成も行います。また、`neighbor MP_BGP_EVPN_VXLAN domain remote`で EVPN-VXLAN側のドメインを remote と指定します

```cisco_ios:vEOS-VXLAN-1 : BGP EVPN-VXLAN側の設定
! BGP設定
router bgp 65000
   router-id 10.0.0.12
   neighbor MP_BGP_EVPN_VXLAN peer group
   neighbor MP_BGP_EVPN_VXLAN remote-as 65000
   neighbor MP_BGP_EVPN_VXLAN update-source Loopback0
   neighbor MP_BGP_EVPN_VXLAN send-community standard extended
!  VXLANのMP-BGPのネイバーには、GW の Loopback1 のアドレスを指定する
   neighbor 10.100.0.1 peer group MP_BGP_EVPN_VXLAN
   !
!  BGPでEVPNを利用する設定
   address-family evpn
      neighbor MP_BGP_EVPN_VXLAN activate
!     VXLANでカプセル化することを指定
      neighbor MP_BGP_EVPN_VXLAN encapsulation vxlan
```

```cisco_ios:vEOS-GW-1 : BGP EVPN-VXLAN側の設定
! Loopback1 の作成
interface Loopback1
   ip address 10.100.0.1/32

! BGP EVPN-VXLAN側の設定
router bgp 65000
   neighbor MP_BGP_EVPN_VXLAN peer group
   neighbor MP_BGP_EVPN_VXLAN remote-as 65000
!  GWは、EVPN-VXLANはupdate-source Loopback1 にする
   neighbor MP_BGP_EVPN_VXLAN update-source Loopback1
   neighbor MP_BGP_EVPN_VXLAN send-community standard extended
   neighbor 10.0.0.12 peer group MP_BGP_EVPN_VXLAN
   !
   address-family evpn
      neighbor MP_BGP_EVPN_VXLAN activate
!     VXLANでカプセル化することを指定
      neighbor MP_BGP_EVPN_VXLAN encapsulation vxlan
!     ドメインをRemoteに指定
      neighbor MP_BGP_EVPN_VXLAN domain remote
```

## ①-4 VPNの設定

VPN の設定は以下のようなイメージにしています。  
EVPN-MPLS と EVPN-VXLAN のそれぞれの Route-Target を vEOS-GW の Vlan100 で紐づけて相互接続させています  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043279/2540ec63-3382-4285-8bee-2bdc5c6d4eae.png)

vEOS-MPLS-1 の設定は以下のとおりです。  
EVPN-MPLS の VPN 用のラベルは、機器が自動で決めて BGP で対向機器へ BGP で広報するので、特に VPN に紐づくラベルの設定はありません。

```cisco_ios:vEOS-MPLS-1 : VPNの設定
! VLAN100を作成
vlan 100
   name USER_100

! Ethernet8にアクセスポートとしてVLAN100を設定
interface Ethernet8
   description to_USER_VLAN_100
   switchport access vlan 100

router bgp 65000
! BGP内の設定で、MAC VRFとしてVLAN100を作成し、RDとRTを設定
   vlan 100
      rd 10.0.0.11:100
      route-target both 65000:100
!     CE側から学習しているMACアドレスをBGPで広報する
      redistribute learned
```

vEOS-VXLAN-1 の設定は以下のとおりです。VLAN:900を作成して、VXLANの設定としてVLAN:900をVNI:1100にします。BGP内の route-target については vEOS-MPLS-1 で使用した値と別の route-target にします
```cisco_ios:vEOS-VXLAN-1 : VPNの設定
! VLAN900を作成
vlan 900
   name USER_900

! Ethernet8にアクセスポートとしてVLAN900を設定
interface Ethernet8
   description to_USER_VLAN_900
   switchport access vlan 900

! VXLANの設定、VLAN:900をVNI:1100にする
interface Vxlan1
   vxlan source-interface Loopback0
   vxlan vlan 900 vni 1100

router bgp 65000
! BGP内の設定で、MAC VRFとしてVLAN900を作成し、RDとRTを設定
   vlan 900
      rd 10.0.0.12:900
      route-target both 65000:900
!     CE側から学習しているMACアドレスをBGPで広報する
      redistribute learned
```

最後に vEOS-GW-1 の設定になります。最後の2行の `domain remote` を含んだEVPN-VXLAN用のRDとRoute-Targetのコンフィグ部分があることで、vEOS-GW-1 の VLAN100 についてはEVPN-MPLSとEVPN-VXLANが相互接続することになります。

```cisco_ios:vEOS-GW-1 : VPNの設定
! VLAN100を作成
vlan 100
   name USER_100

! VXLANの設定、VLAN:100をVNI:1100にする、またsource-interface Loopback1にする
interface Vxlan1
   vxlan source-interface Loopback1
   vxlan vlan 100 vni 1100

router bgp 65000
! BGP内の設定で、MAC VRFとしてVLAN100を作成
   vlan 100
!     EVPN-MPLS側のRDとRTを設定
      rd 10.0.0.1:100
      route-target both 65000:100
!     同じVLAN100の中にリモートドメインとして、EVPN-VXLAN側のRDとRTを設定し、EVPN-MPLSとEVPN-VXLANを紐づける
      rd evpn domain remote 10.100.0.1:100
      route-target import export evpn domain remote 65000:900
```

## ①-5 動作確認
上記設定で正常に動作するか動作確認します

### 疎通確認

PC 間で PING を打って疎通することを確認します。  
参考に vEOS-GW-1 の MPLS 側と VXLAN 側の IF を同時にパケットキャプチャした結果の画像を貼り付けます  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043279/1161b656-3c01-4bff-bc29-b2e5657fef18.png)

ICMP の request に対して reply が返ってきていることと、それぞれ MPLS と VXLAN でカプセル化されていることがわかります。  

### MACアドレス学習状態確認

`show mac address-table`で確認すると、MPLS 側は `Mt1`、VXLAN 側は `Vx1` になることがわかります
```:vEOS-MPLS-1
vEOS-MPLS-1#show mac address-table
          Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports      Moves   Last Move
----    -----------       ----        -----      -----   ---------
 100    0050.7966.6853    DYNAMIC     Et8        1       0:25:27 ago
 100    0050.7966.6854    DYNAMIC     Mt1        1       0:24:53 ago
Total Mac Addresses for this criterion: 2

          Multicast Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       ----        -----
Total Mac Addresses for this criterion: 0
```

```:vEOS-VXLAN-1
vEOS-VXLAN-1#show mac address-table
          Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports      Moves   Last Move
----    -----------       ----        -----      -----   ---------
 900    0050.7966.6853    DYNAMIC     Vx1        1       0:19:41 ago
 900    0050.7966.6854    DYNAMIC     Et8        1       0:19:07 ago
Total Mac Addresses for this criterion: 2

          Multicast Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       ----        -----
Total Mac Addresses for this criterion: 0
```

```:vEOS-GW-1
vEOS-GW-1#show mac address-table
          Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports      Moves   Last Move
----    -----------       ----        -----      -----   ---------
 100    0050.7966.6853    DYNAMIC     Mt1        1       0:25:48 ago
 100    0050.7966.6854    DYNAMIC     Vx1        1       0:25:14 ago
Total Mac Addresses for this criterion: 2

          Multicast Mac Address Table
------------------------------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       ----        -----
Total Mac Addresses for this criterion: 0
```

### EVPNのルート広報

`show bgp evpn` で EVPN で広報しているルート一覧を確認できます。  
`mac-ip` と記載されたものが、Route-Type: 2 として MAC アドレスのルートになります。  
GW のルートを確認すると、VXLAN 側は **remote** として表示されます。  
例えば、MPLS 側から学習した `0050.7966.6853` の MAC アドレスのルートは、VXLAN 側に自身から **remote** として広報していることがわかります。  

```:vEOS-GW-1
vEOS-GW-1#show bgp evpn
BGP routing table information for VRF default
Router identifier 10.0.0.1, local AS number 65000
Route status codes: * - valid, > - active, S - Stale, E - ECMP head, e - ECMP
                    c - Contributing to ECMP, % - Pending best path selection
Origin codes: i - IGP, e - EGP, ? - incomplete
AS Path Attributes: Or-ID - Originator ID, C-LST - Cluster List, LL Nexthop - Link Local Nexthop

          Network                Next Hop              Metric  LocPref Weight  Path
 * >      RD: 10.0.0.11:100 mac-ip 0050.7966.6853
                                 10.0.0.11             -       100     0       i
 * >      RD: 10.0.0.1:100 mac-ip 0050.7966.6854
                                 -                     -       100     0       i
 * >      RD: 10.100.0.1:100 mac-ip 0050.7966.6853 remote
                                 -                     -       100     0       i
 * >      RD: 10.0.0.12:900 mac-ip 0050.7966.6854 remote
                                 10.0.0.12             -       100     0       i
 * >      RD: 10.0.0.1:100 imet 10.0.0.1
                                 -                     -       -       0       i
 * >      RD: 10.0.0.11:100 imet 10.0.0.11
                                 10.0.0.11             -       100     0       i
 * >      RD: 10.0.0.12:900 imet 10.0.0.12 remote
                                 10.0.0.12             -       100     0       i
 * >      RD: 10.100.0.1:100 imet 10.100.0.1 remote
                                 -                     -       -       0       i
```

VPN単位でルートを見たい場合は、Route-Targetを指定した `show bgp evpn extcommunity rt 65000:100` や `show bgp evpn extcommunity rt 65000:900` で絞って確認できました。VPNの数が多い場合などはこちらで絞ってみた方が切り分けしやすいと思います。


# ② GWを２台にしてEVPN マルチホーミングで装置冗長  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043279/dae5172c-42b8-4666-8a75-7bb079fb2faa.png)

次に、GW を２台構成し、EVPN マルチホーミング で装置冗長をさせます。  

## ②-0 全コンフィグ一覧  

こちらもこのあと追加の設定の説明をしますが、最初に最終的な全設定のコンフィグを記載しておきます。  

<details><summary>vEOS-MPLS-1 : 全設定</summary>

```cisco_ios:vEOS-MPLS-1 : 全設定
! ホストネームを設定
hostname vEOS-MPLS-1

! 初期状態で動作しているLLDPとSTPを無効化
no lldp run
spanning-tree mode none

! VLAN100を作成
vlan 100
   name USER_100

! OSPFを利用するIFにIPアドレス設定とOSPFでのコストとネットワークタイプを設定
interface Ethernet1
   description to_vEOS-GW-1
   no switchport
   ip address 10.9.1.1/31
   ip ospf cost 100
   ip ospf network point-to-point
!
interface Ethernet2
   description to_vEOS-GW-2
   no switchport
   ip address 10.9.2.1/31
   ip ospf cost 100
   ip ospf network point-to-point

! Ethernet8にアクセスポートとしてVLAN100を設定
interface Ethernet8
   description to_USER_VLAN_100
   switchport access vlan 100

! Loopback0 にアドレス設定
interface Loopback0
   ip address 10.0.0.11/32

! ルーティング機能を有効化
ip routing

! MPLSフォワーディング機能を有効化
mpls ip
! SRGBで利用したい16000-23999をデフォルトでstaticで利用されているため別の場所に移動する
mpls label range static 16 15984
! SRGBを16000-23999で設定
mpls label range ospf-sr 16000 8000

! BGP設定
router bgp 65000
   router-id 10.0.0.11
   neighbor MP_BGP_EVPN_MPLS peer group
   neighbor MP_BGP_EVPN_MPLS remote-as 65000
   neighbor MP_BGP_EVPN_MPLS update-source Loopback0
   neighbor MP_BGP_EVPN_MPLS send-community standard extended
   neighbor 10.0.0.1 peer group MP_BGP_EVPN_MPLS
   neighbor 10.0.0.2 peer group MP_BGP_EVPN_MPLS
   !
!  BGP内の設定で、MAC VRFとしてVLAN100を作成し、RDとRTを設定
   vlan 100
      rd 10.0.0.11:100
      route-target both 65000:100
!     CE側から学習しているMACアドレスをBGPで広報する
      redistribute learned
   !
!  BGPでEVPNを利用する設定
   address-family evpn
      neighbor MP_BGP_EVPN_MPLS activate
!     MPLSでカプセル化することを指定
      neighbor MP_BGP_EVPN_MPLS encapsulation mpls next-hop-self source-interface Loopback0

! OSPF設定
router ospf 1
   router-id 10.0.0.11
   passive-interface default
   no passive-interface Ethernet1
   no passive-interface Ethernet2
   network 0.0.0.0/0 area 0.0.0.0
   !
!  OSPFでSR-MPLSを有効にしNode-SIDを指定する
   segment-routing mpls
      no shutdown
      prefix-segment 10.0.0.11/32 index 11
```

</details>


<details><summary>vEOS-VXLAN-1 : 全設定</summary>

```cisco_ios:vEOS-VXLAN-1 : 全設定
! ホストネームを設定
hostname vEOS-VXLAN-1

! 初期状態で動作しているLLDPとSTPを無効化
no lldp run
spanning-tree mode none

! VLAN900を作成
vlan 900
   name USER_900

! OSPFを利用するIFにIPアドレス設定とOSPFでのコストとネットワークタイプを設定
interface Ethernet1
   description to_vEOS-GW-1
   no switchport
   ip address 10.9.11.1/31
   ip ospf cost 100
   ip ospf network point-to-point
!
interface Ethernet2
   description to_vEOS-GW-2
   no switchport
   ip address 10.9.12.1/31
   ip ospf cost 100
   ip ospf network point-to-point

! Ethernet8にアクセスポートとしてVLAN900を設定
interface Ethernet8
   description to_USER_VLAN_900
   switchport access vlan 900

! Loopback0 にアドレス設定
interface Loopback0
   ip address 10.0.0.12/32

! VXLANの設定、VLAN:900をVNI:1100にする
interface Vxlan1
   vxlan source-interface Loopback0
   vxlan vlan 900 vni 1100

! ルーティング機能を有効化
ip routing

! BGP設定
router bgp 65000
   router-id 10.0.0.12
   neighbor MP_BGP_EVPN_VXLAN peer group
   neighbor MP_BGP_EVPN_VXLAN remote-as 65000
   neighbor MP_BGP_EVPN_VXLAN update-source Loopback0
   neighbor MP_BGP_EVPN_VXLAN send-community standard extended
!  VXLANのMP-BGPのネイバーには、GW の Loopback1 のアドレスを指定する
   neighbor 10.100.0.1 peer group MP_BGP_EVPN_VXLAN
   neighbor 10.100.0.2 peer group MP_BGP_EVPN_VXLAN
   !
!  BGP内の設定で、MAC VRFとしてVLAN900を作成し、RDとRTを設定
   vlan 900
      rd 10.0.0.12:900
      route-target both 65000:900
!     CE側から学習しているMACアドレスをBGPで広報する
      redistribute learned
   !
!  BGPでEVPNを利用する設定
   address-family evpn
      neighbor MP_BGP_EVPN_VXLAN activate
!     VXLANでカプセル化することを指定
      neighbor MP_BGP_EVPN_VXLAN encapsulation vxlan

! OSPF設定
router ospf 1
   router-id 10.0.0.12
   passive-interface default
   no passive-interface Ethernet1
   no passive-interface Ethernet2
   network 0.0.0.0/0 area 0.0.0.0
```

</details>

<details><summary>vEOS-GW-1 : 全設定</summary>

```cisco_ios:vEOS-GW-1 : 全設定
! ホストネームを設定
hostname vEOS-GW-1

! 初期状態で動作しているLLDPとSTPを無効化
no lldp run
spanning-tree mode none

! VLAN100を作成
vlan 100
   name USER_100

! OSPFを利用するIFにIPアドレス設定とOSPFでのコストとネットワークタイプを設定
interface Ethernet1
   description to_vEOS-MPLS-1
   no switchport
   ip address 10.9.1.0/31
   ip ospf cost 100
   ip ospf network point-to-point
!
interface Ethernet2
   description to_vEOS-VXLAN-1
   no switchport
   ip address 10.9.11.0/31
   ip ospf cost 100
   ip ospf network point-to-point
!
interface Ethernet8
   description to_vEOS-GW-2
   no switchport
   ip address 10.9.99.0/31
   ip ospf cost 100
   ip ospf network point-to-point

! Loopback0 にアドレス設定
interface Loopback0
   ip address 10.0.0.1/32

! Loopback1 の作成
interface Loopback1
   ip address 10.100.0.1/32

! VXLANの設定、VLAN:100をVNI:1100にする、またsource-interface Loopback1にする
interface Vxlan1
   vxlan source-interface Loopback1
   vxlan vlan 100 vni 1100

! ルーティング機能を有効化
ip routing

! MPLSフォワーディング機能を有効化
mpls ip
! SRGBで利用したい16000-23999をデフォルトでstaticで利用されているため別の場所に移動する
mpls label range static 16 15984
! SRGBを16000-23999で設定
mpls label range ospf-sr 16000 8000

! BGP設定
router bgp 65000
   router-id 10.0.0.1
!  D-PATH（Domain Path）属性 がいちばん短い経路を優先させる
   bgp bestpath d-path
   !
!  BGP EVPN-MPLS側の設定
   neighbor MP_BGP_EVPN_MPLS peer group
   neighbor MP_BGP_EVPN_MPLS remote-as 65000
!  GWは、EVPN-MPLSはupdate-source Loopback0 にする
   neighbor MP_BGP_EVPN_MPLS update-source Loopback0
   neighbor MP_BGP_EVPN_MPLS send-community standard extended
   neighbor 10.0.0.11 peer group MP_BGP_EVPN_MPLS
   neighbor 10.0.0.2 peer group MP_BGP_EVPN_MPLS
   !
!  BGP EVPN-VXLAN側の設定
   neighbor MP_BGP_EVPN_VXLAN peer group
   neighbor MP_BGP_EVPN_VXLAN remote-as 65000
!  GWは、EVPN-VXLANはupdate-source Loopback1 にする
   neighbor MP_BGP_EVPN_VXLAN update-source Loopback1
   neighbor MP_BGP_EVPN_VXLAN send-community standard extended
   neighbor 10.0.0.12 peer group MP_BGP_EVPN_VXLAN
   neighbor 10.100.0.2 peer group MP_BGP_EVPN_VXLAN
   !
!  BGP内の設定で、MAC VRFとしてVLAN100を作成
   vlan 100
!     EVPN-MPLS側のRDとRTを設定
      rd 10.0.0.1:100
      route-target both 65000:100
!     同じVLAN100の中にリモートドメインとして、EVPN-VXLAN側のRDとRTを設定し、EVPN-MPLSとEVPN-VXLANを紐づける
      rd evpn domain remote 10.100.0.1:100
      route-target import export evpn domain remote 65000:900
   !
!  BGPでEVPNを利用する設定
   address-family evpn
      neighbor MP_BGP_EVPN_MPLS activate
!     MPLSでカプセル化することを指定
      neighbor MP_BGP_EVPN_MPLS encapsulation mpls next-hop-self source-interface Loopback0
      !
      neighbor MP_BGP_EVPN_VXLAN activate
!     VXLANでカプセル化することを指定
      neighbor MP_BGP_EVPN_VXLAN encapsulation vxlan
!     ドメインをRemoteに指定
      neighbor MP_BGP_EVPN_VXLAN domain remote
      !
!     ドメインidentifierを分ける
      domain identifier 1:1
      domain identifier 2:2 remote
      !
!     EVPNマルチホーミングのためのドメインlocal側のESI設定(実際はremote側のPEで見えるESI)
      evpn ethernet-segment domain local
         identifier 0011:1111:1111:1111:1111
         route-target import 11:11:11:11:11:99
      !
!     EVPNマルチホーミングのためのドメインremote側のESI設定(実際はlocal側のPEで見えるESI)
      evpn ethernet-segment domain remote
         identifier 0022:2222:2222:2222:2222
         route-target import 22:22:22:22:22:99

! OSPF設定
router ospf 1
   router-id 10.0.0.1
   passive-interface default
   no passive-interface Ethernet1
   no passive-interface Ethernet2
   no passive-interface Ethernet8
   network 0.0.0.0/0 area 0.0.0.0
   !
!  OSPFでSR-MPLSを有効にしNode-SIDを指定する
   segment-routing mpls
      no shutdown
      prefix-segment 10.0.0.1/32 index 1
```

</details>



<details><summary>vEOS-GW-2 : 全設定</summary>

```cisco_ios:vEOS-GW-2 : 全設定
! ホストネームを設定
hostname vEOS-GW-2

! 初期状態で動作しているLLDPとSTPを無効化
no lldp run
spanning-tree mode none

! VLAN100を作成
vlan 100
   name USER_100

! OSPFを利用するIFにIPアドレス設定とOSPFでのコストとネットワークタイプを設定
interface Ethernet1
   description to_vEOS-MPLS-1
   no switchport
   ip address 10.9.2.0/31
   ip ospf cost 100
   ip ospf network point-to-point
!
interface Ethernet2
   description to_vEOS-VXLAN-1
   no switchport
   ip address 10.9.12.0/31
   ip ospf cost 100
   ip ospf network point-to-point
!
interface Ethernet8
   description to_GW-1
   no switchport
   ip address 10.9.99.1/31
   ip ospf cost 100
   ip ospf network point-to-point

! Loopback0 にアドレス設定
interface Loopback0
   ip address 10.0.0.2/32

! Loopback1 の作成
interface Loopback1
   ip address 10.100.0.2/32

! VXLANの設定、VLAN:100をVNI:1100にする、またsource-interface Loopback1にする
interface Vxlan1
   vxlan source-interface Loopback1
   vxlan vlan 100 vni 1100

! ルーティング機能を有効化
ip routing

! MPLSフォワーディング機能を有効化
mpls ip
! SRGBで利用したい16000-23999をデフォルトでstaticで利用されているため別の場所に移動する
mpls label range static 16 15984
! SRGBを16000-23999で設定
mpls label range ospf-sr 16000 8000

! BGP設定
router bgp 65000
   router-id 10.0.0.2
!  D-PATH（Domain Path）属性 がいちばん短い経路”を優先させる
   bgp bestpath d-path
   !
!  BGP EVPN-MPLS側の設定
   neighbor MP_BGP_EVPN_MPLS peer group
   neighbor MP_BGP_EVPN_MPLS remote-as 65000
!  GWは、EVPN-MPLSはupdate-source Loopback0 にする
   neighbor MP_BGP_EVPN_MPLS update-source Loopback0
   neighbor MP_BGP_EVPN_MPLS send-community standard extended
   neighbor 10.0.0.11 peer group MP_BGP_EVPN_MPLS
   neighbor 10.0.0.1 peer group MP_BGP_EVPN_MPLS
   !
!  BGP EVPN-VXLAN側の設定
   neighbor MP_BGP_EVPN_VXLAN peer group
   neighbor MP_BGP_EVPN_VXLAN remote-as 65000
!  GWは、EVPN-VXLANはupdate-source Loopback1 にする
   neighbor MP_BGP_EVPN_VXLAN update-source Loopback1
   neighbor MP_BGP_EVPN_VXLAN send-community standard extended
   neighbor 10.0.0.12 peer group MP_BGP_EVPN_VXLAN
   neighbor 10.100.0.1 peer group MP_BGP_EVPN_VXLAN
   !
!  BGP内の設定で、MAC VRFとしてVLAN100を作成
   vlan 100
!     EVPN-MPLS側のRDとRTを設定
      rd 10.0.0.2:100
      route-target both 65000:100
!     同じVLAN100の中にリモートドメインとして、EVPN-VXLAN側のRDとRTを設定し、EVPN-MPLSとEVPN-VXLANを紐づける
      rd evpn domain remote 10.100.0.2:100
      route-target import export evpn domain remote 65000:900
   !
!  BGPでEVPNを利用する設定
   address-family evpn
      neighbor MP_BGP_EVPN_MPLS activate
!     MPLSでカプセル化することを指定
      neighbor MP_BGP_EVPN_MPLS encapsulation mpls next-hop-self source-interface Loopback0
      !
      neighbor MP_BGP_EVPN_VXLAN activate
!     VXLANでカプセル化することを指定
      neighbor MP_BGP_EVPN_VXLAN encapsulation vxlan
!     ドメインをRemoteに指定
      neighbor MP_BGP_EVPN_VXLAN domain remote
      !
!     ドメインidentifierを分ける
      domain identifier 1:1
      domain identifier 2:2 remote
      !
!     EVPNマルチホーミングのためのドメインlocal側のESI設定(実際はremote側のPEで見えるESI)
      evpn ethernet-segment domain local
         identifier 0011:1111:1111:1111:1111
         route-target import 11:11:11:11:11:99
      !
!     EVPNマルチホーミングのためのドメインremote側のESI設定(実際はlocal側のPEで見えるESI)
      evpn ethernet-segment domain remote
         identifier 0022:2222:2222:2222:2222
         route-target import 22:22:22:22:22:99
      !
! OSPF設定
router ospf 1
   router-id 10.0.0.2
   passive-interface default
   no passive-interface Ethernet1
   no passive-interface Ethernet2
   no passive-interface Ethernet8
   network 0.0.0.0/0 area 0.0.0.0
   !
!  OSPFでSR-MPLSを有効にしNode-SIDを指定する
   segment-routing mpls
      no shutdown
      prefix-segment 10.0.0.2/32 index 2
```

</details>

## ②-1 2台目のGWコンフィグとその他機器の設定追加

以下の内容で設定をします。

- vEOS-GW-2 は、先ほど vEOS-GW-1 をベースにコンフィグ作成
- 他の機器は vEOS-GW-2 と OSPF・BGP が接続できるようにインターフェースや OSPF・BGP の設定追加を行います

<details><summary>vEOS-GW-2 : 初期設定</summary>

```cisco_ios:vEOS-GW-2 : 初期設定
hostname vEOS-GW-2

no lldp run
spanning-tree mode none
!
vlan 100
   name USER_100
!
interface Ethernet1
   description to_vEOS-MPLS-1
   no switchport
   ip address 10.9.2.0/31
   ip ospf cost 100
   ip ospf network point-to-point
!
interface Ethernet2
   description to_vEOS-VXLAN-1
   no switchport
   ip address 10.9.12.0/31
   ip ospf cost 100
   ip ospf network point-to-point
!
! GW間の接続用インターフェース
interface Ethernet8
   description to_GW-1
   no switchport
   ip address 10.9.99.1/31
   ip ospf cost 100
   ip ospf network point-to-point
!
interface Loopback0
   ip address 10.0.0.2/32
!
interface Loopback1
   ip address 10.100.0.2/32
!
interface Vxlan1
   vxlan source-interface Loopback1
   vxlan vlan 100 vni 1100
!
ip routing
!
mpls ip
!
mpls label range static 16 15984
mpls label range ospf-sr 16000 8000
!
router ospf 1
   router-id 10.0.0.2
   passive-interface default
   no passive-interface Ethernet1
   no passive-interface Ethernet2
!  GW-1ともOSPFネイバー接続
   no passive-interface Ethernet8
   network 0.0.0.0/0 area 0.0.0.0
   !
   segment-routing mpls
      no shutdown
      prefix-segment 10.0.0.2/32 index 2
!
router bgp 65000
   router-id 10.0.0.2
   neighbor MP_BGP_EVPN_MPLS peer group
   neighbor MP_BGP_EVPN_MPLS remote-as 65000
   neighbor MP_BGP_EVPN_MPLS update-source Loopback0
   neighbor MP_BGP_EVPN_MPLS send-community standard extended
   neighbor MP_BGP_EVPN_VXLAN peer group
   neighbor MP_BGP_EVPN_VXLAN remote-as 65000
   neighbor MP_BGP_EVPN_VXLAN update-source Loopback1
   neighbor MP_BGP_EVPN_VXLAN send-community standard extended
   neighbor 10.0.0.11 peer group MP_BGP_EVPN_MPLS
   neighbor 10.0.0.12 peer group MP_BGP_EVPN_VXLAN
!  GW-1ともBGPピアをはる、MPLS側とVXLAN側で別アドレスで設定
   neighbor 10.0.0.1 peer group MP_BGP_EVPN_MPLS
   neighbor 10.100.0.1 peer group MP_BGP_EVPN_VXLAN
   
   vlan 100
      rd 10.0.0.2:100
      rd evpn domain remote 10.100.0.2:100
      route-target both 65000:100
      route-target import export evpn domain remote 65000:900
   !
   address-family evpn
      neighbor MP_BGP_EVPN_MPLS activate
      neighbor MP_BGP_EVPN_MPLS encapsulation mpls next-hop-self source-interface Loopback0
      neighbor MP_BGP_EVPN_VXLAN activate
      neighbor MP_BGP_EVPN_VXLAN encapsulation vxlan
      neighbor MP_BGP_EVPN_VXLAN domain remote
```

</details>


<details><summary>vEOS-GW-1 : 追加設定</summary>

```cisco_ios:vEOS-GW-1 : 追加設定
! GW間の接続用インターフェース
interface Ethernet8
   description to_vEOS-GW-2
   no switchport
   ip address 10.9.99.0/31
   ip ospf cost 100
   ip ospf network point-to-point

router ospf 1
!  GW-2とOSPFネイバー接続するための設定
   no passive-interface Ethernet8

router bgp 65000
!  GW-2とBGPピアをはる、MPLS側とVXLAN側で別アドレスで設定
   neighbor 10.0.0.2 peer group MP_BGP_EVPN_MPLS
   neighbor 10.100.0.2 peer group MP_BGP_EVPN_VXLAN
```

</details>


<details><summary>vEOS-MPLS-1 : 追加設定</summary>

```cisco_ios:vEOS-MPLS-1 : 追加設定
! GW-2接続用インターフェース
interface Ethernet2
   description to_vEOS-GW-2
   no switchport
   ip address 10.9.2.1/31
   ip ospf cost 100
   ip ospf network point-to-point

router ospf 1
!  GW-2とOSPFネイバー接続するための設定
   no passive-interface Ethernet2

router bgp 65000
!  GW-2とBGPピアをはるための設定
   neighbor 10.0.0.2 peer group MP_BGP_EVPN_MPLS
```

</details>


<details><summary>vEOS-VXLAN-1 : 追加設定</summary>

```cisco_ios:vEOS-VXLAN-1 : 追加設定
! GW-2接続用インターフェース
interface Ethernet2
   description to_vEOS-GW-2
   no switchport
   ip address 10.9.12.1/31
   ip ospf cost 100
   ip ospf network point-to-point

router ospf 1
!  GW-2とOSPFネイバー接続するための設定
   no passive-interface Ethernet2

router bgp 65000
!  GW-2とBGPピアをはるための設定
   neighbor 10.100.0.2 peer group MP_BGP_EVPN_VXLAN
```

</details>



## ②-2 EVPNマルチホーミングのための設定

以下の絵のとおり、MPLS側と VXLAN 側でそれぞれ EVPN マルチホーミングを設定するために、ESI を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043279/a1a5bed8-1584-49cd-b710-7f281bfc8e68.png)

設定は以下のとおりです。vEOS-GW-1 と vEOS-GW-2 に追加してください。

```cisco_ios:GWへの追加設定
router bgp 65000
!  D-PATH（Domain Path）属性 がいちばん短い経路を優先させる
   bgp bestpath d-path
   !
   address-family evpn
!     ドメインidentifierを分ける
      domain identifier 1:1
      domain identifier 2:2 remote
      !
!     EVPNマルチホーミングのためのドメインlocal側のESI設定(実際はremote側のPEで見えるESI)
      evpn ethernet-segment domain local
         identifier 0011:1111:1111:1111:1111
         route-target import 11:11:11:11:11:99
      !
!     EVPNマルチホーミングのためのドメインremote側のESI設定(実際はlocal側のPEで見えるESI)
      evpn ethernet-segment domain remote
         identifier 0022:2222:2222:2222:2222
         route-target import 22:22:22:22:22:99
```


## ②-3 動作確認

### EVPNのルート状態の確認

以下のとおり、vEOS-MPLS-1 から見て `ESI 0022:2222:2222:2222:2222` で 2 台の GW から受け取っていることと、さらに対向の MAC アドレスを指定すると 2 台の GW 向けに経路がある状態（＝2 台で冗長している）ことが確認できました。

```:vEOS-MPLS-1でのルート確認
vEOS-MPLS-1# show bgp evpn extcommunity rt 65000:100
BGP routing table information for VRF default
Router identifier 10.0.0.11, local AS number 65000
Route status codes: * - valid, > - active, S - Stale, E - ECMP head, e - ECMP
                    c - Contributing to ECMP, % - Pending best path selection
Origin codes: i - IGP, e - EGP, ? - incomplete
AS Path Attributes: Or-ID - Originator ID, C-LST - Cluster List, LL Nexthop - Link Local Nexthop

          Network                Next Hop              Metric  LocPref Weight  Path
 * >      RD: 10.0.0.1:100 auto-discovery 0 0022:2222:2222:2222:2222
                                 10.0.0.1              -       100     0       i
 * >      RD: 10.0.0.2:100 auto-discovery 0 0022:2222:2222:2222:2222
                                 10.0.0.2              -       100     0       i
 * >      RD: 10.0.0.1:1 auto-discovery 0022:2222:2222:2222:2222
                                 10.0.0.1              -       100     0       i
 * >      RD: 10.0.0.2:1 auto-discovery 0022:2222:2222:2222:2222
                                 10.0.0.2              -       100     0       i
 * >      RD: 10.0.0.11:100 mac-ip 0050.7966.6853
                                 -                     -       -       0       i
 * >      RD: 10.0.0.1:100 mac-ip 0050.7966.6854
                                 10.0.0.1              -       100     0       i
 * >      RD: 10.0.0.2:100 mac-ip 0050.7966.6854
                                 10.0.0.2              -       100     0       i
 * >      RD: 10.0.0.1:100 imet 10.0.0.1
                                 10.0.0.1              -       100     0       i
 * >      RD: 10.0.0.2:100 imet 10.0.0.2
                                 10.0.0.2              -       100     0       i
 * >      RD: 10.0.0.11:100 imet 10.0.0.11
                                 -                     -       -       0       i
vEOS-MPLS-1#

!------------------------------
! MACアドレスを指定して経路確認
!------------------------------
vEOS-MPLS-1# show bgp evpn extcommunity rt 65000:100 route-type mac-ip 0050.7966.6854 detail 
BGP routing table information for VRF default
Router identifier 10.0.0.11, local AS number 65000
BGP routing table entry for mac-ip 0050.7966.6854, Route Distinguisher: 10.0.0.1:100
 Paths: 1 available
  Local
    10.0.0.1 from 10.0.0.1 (10.0.0.1)
      Origin IGP, metric -, localpref 100, weight 0, tag 0, valid, internal, best
      Extended Community: Route-Target-AS:65000:100 TunnelEncap:tunnelTypeMpls
      MPLS label: 1047390 ESI: 0022:2222:2222:2222:2222
      D-PATH: 2:2:EVPN
BGP routing table entry for mac-ip 0050.7966.6854, Route Distinguisher: 10.0.0.2:100
 Paths: 1 available
  Local
    10.0.0.2 from 10.0.0.2 (10.0.0.2)
      Origin IGP, metric -, localpref 100, weight 0, tag 0, valid, internal, best
      Extended Community: Route-Target-AS:65000:100 TunnelEncap:tunnelTypeMpls
      MPLS label: 1047390 ESI: 0022:2222:2222:2222:2222
      D-PATH: 2:2:EVPN
vEOS-MPLS-1#
```

vEOS-VXLAN-1 側も同じように確認ができます

```:vEOS-VXLAN-1でのルート確認
vEOS-VXLAN-1# show bgp evpn extcommunity rt 65000:900
BGP routing table information for VRF default
Router identifier 10.0.0.12, local AS number 65000
Route status codes: * - valid, > - active, S - Stale, E - ECMP head, e - ECMP
                    c - Contributing to ECMP, % - Pending best path selection
Origin codes: i - IGP, e - EGP, ? - incomplete
AS Path Attributes: Or-ID - Originator ID, C-LST - Cluster List, LL Nexthop - Link Local Nexthop

          Network                Next Hop              Metric  LocPref Weight  Path
 * >      RD: 10.100.0.1:100 auto-discovery 0 0011:1111:1111:1111:1111
                                 10.100.0.1            -       100     0       i
 * >      RD: 10.100.0.2:100 auto-discovery 0 0011:1111:1111:1111:1111
                                 10.100.0.2            -       100     0       i
 * >      RD: 10.100.0.1:1 auto-discovery 0011:1111:1111:1111:1111
                                 10.100.0.1            -       100     0       i
 * >      RD: 10.100.0.2:1 auto-discovery 0011:1111:1111:1111:1111
                                 10.100.0.2            -       100     0       i
 * >      RD: 10.100.0.1:100 mac-ip 0050.7966.6853
                                 10.100.0.1            -       100     0       i
 * >      RD: 10.100.0.2:100 mac-ip 0050.7966.6853
                                 10.100.0.2            -       100     0       i
 * >      RD: 10.0.0.12:900 mac-ip 0050.7966.6854
                                 -                     -       -       0       i
 * >      RD: 10.0.0.12:900 imet 10.0.0.12
                                 -                     -       -       0       i
 * >      RD: 10.100.0.1:100 imet 10.100.0.1
                                 10.100.0.1            -       100     0       i
 * >      RD: 10.100.0.2:100 imet 10.100.0.2
                                 10.100.0.2            -       100     0       i
vEOS-VXLAN-1#

!------------------------------
! MACアドレスを指定して経路確認
!------------------------------
vEOS-VXLAN-1# show bgp evpn extcommunity rt 65000:900 route-type mac-ip 0050.7966.6853 detail
BGP routing table information for VRF default
Router identifier 10.0.0.12, local AS number 65000
BGP routing table entry for mac-ip 0050.7966.6853, Route Distinguisher: 10.100.0.1:100
 Paths: 1 available
  Local
    10.100.0.1 from 10.100.0.1 (10.0.0.1)
      Origin IGP, metric -, localpref 100, weight 0, tag 0, valid, internal, best
      Extended Community: Route-Target-AS:65000:900 TunnelEncap:tunnelTypeVxlan
      VNI: 1100 ESI: 0011:1111:1111:1111:1111
      D-PATH: 1:1:EVPN
BGP routing table entry for mac-ip 0050.7966.6853, Route Distinguisher: 10.100.0.2:100
 Paths: 1 available
  Local
    10.100.0.2 from 10.100.0.2 (10.0.0.2)
      Origin IGP, metric -, localpref 100, weight 0, tag 0, valid, internal, best
      Extended Community: Route-Target-AS:65000:900 TunnelEncap:tunnelTypeVxlan
      VNI: 1100 ESI: 0011:1111:1111:1111:1111
      D-PATH: 1:1:EVPN
vEOS-VXLAN-1#
```
### 疎通確認

以下の4パターンで機器間のリンクダウンを起こして PC 間の PING 疎通を確認しましたが、すべてのパターンで PING が一時的に停止し、しばらくすると復旧することが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043279/f0c27fc6-cd1c-4ffa-81e7-1a2d59c0bfcc.png)

各機器の Loopback アドレスをベースに MP-BGP を利用しているため、OSPF で Loopback アドレスのルートが見えていれば 2 台の EVPN マルチホーミング構成が継続利用可能な状態となります。そのため、

- ③ の GW 間が停止しても 2 台の EVPN マルチホーミング構成のまま  
- ④ のように 2 台目の全 OSPF ネイバーがダウンすると 2 台から 1 台の状態になる  

という動作になります。

# 最後に

EVPN-MPLS と VXLAN の相互接続や冗長化構成を vEOS-lab で検証しました。柔軟な接続が可能であることを確認できました。

- 参考にしたリンク
  - セグメントルーティング設定参考
    - [https://karneliuk.com/2018/12/sp-part-2-evpn-l2-multipoint-over-segment-routing-with-arista-cisco-nokia/](https://karneliuk.com/2018/12/sp-part-2-evpn-l2-multipoint-over-segment-routing-with-arista-cisco-nokia/)
  - マルチドメイン設定参考
    - [https://arista.my.site.com/AristaCommunity/s/article/Troubleshooting-Multi-Domain-EVPN-and-DCI#Comm_Kna_ka0Uw00000080MDIAY_17](https://arista.my.site.com/AristaCommunity/s/article/Troubleshooting-Multi-Domain-EVPN-and-DCI#Comm_Kna_ka0Uw00000080MDIAY_17)
  - EVPN 間接続参考
    - [https://medium.com/@adamkirchberger/evpn-distributed-control-plane-using-arista-veos-44a4d211a881](https://medium.com/@adamkirchberger/evpn-distributed-control-plane-using-arista-veos-44a4d211a881)

【2025/06/14 追記】
Juniper の vJunos-Router でも同じようなことをやってみました

https://qiita.com/k-maki/items/94014d5134eca1878f79