vQFX10000 で VXLAN+EVPN (evpn-inter-subnet-forwarding(Symmetric) 編) (original : 2017/01/09)
この記事は某所で 2017/01/09
に書いたもののコピーです。
そのため 2017/05/13
時点ではやや古い情報も含まれています。(以下一例)
- 201705 に
GNS3 ver2.0 stable
が出た
.
最初に
先日(vQFX10000 を KVM+GNS3 で動かす)、Juniper vQFX10000(以降 vQFX) の DL 権限を個人で得て GNS3 で軽く動作確認をとり、前回(vQFX10000 で VXLAN+EVPN (L2 over L3 編))、仮想版でも L2VPN 機能が動くことを確認しました。
QFX10000系では EVPN NLRI Type5 Route (参考資料の draft 参照)で Symmetric な evpn-inter-subnet-forwarding ができるようなので、今回は vQFX でそれを試します。(あらすじが長い...)
本項でやること
- vQFX で VXLAN の Control Plane として EVPN を動かす
- EVPN NLRI Type5(EVPN Prefix Advertisement) を使って evpn-inter-subnet-forwarding (Symmetric)を動かす
- 前回の NLRI Type2+3 を使った L2 over L3 も併用できるか確認する
- 下図の赤い点線部分
- Type5 を使って VRFtoVRF しているドキュメントでは「セグメントが単一サイト(/部屋)に閉じる場合には」という文言があったりするけれど
概要構成図
前回に引き続き、下図の感じで。
余談。
本環境の GNS3 1.5.2
でパケットキャプチャするために、qemu 同士を直結せずに、間に GNS3 の Ethernet Switch を挟む構成にしてます。が、「pelican@ainoniwa.net / GNS3 2.0からはKVM間のパケットキャプチャも取れるようになるぞい」のように GNS3 2.0
(2017/01/04 時点では beta 版, 2017/05/13時点ではstable版公開済)を使えば、これが不要になります。やったぜ!
参考資料
- 前回の参考資料 全般
- EVPN 標準
- draft-ietf-bess-evpn-prefix-advertisement-03 (IP Prefix Advertisement in EVPN)
- EVPN NLRI Type5 を使って IP-VRF to IP-VRF で IP Prefix Advertise しようというお話
- draft-ietf-bess-evpn-inter-subnet-forwarding-01 (Integrated Routing and Bridging in EVPN)
- L3 全般
Asymmetric
とSymmetric
に関する話はこれを読むとわかる
- draft-ietf-bess-evpn-prefix-advertisement-03 (IP Prefix Advertisement in EVPN)
- JUNOS での VXLAN+EVPN inter-subnet-forwarding 実装・設定周り
- Juniper公式 / ip-prefix-routes コマンド at JUNOS15.1
Statement introduced in Junos OS Release 15.1x53-D60 for QFX10000 Series switches.
だそうな- んで vQFX(
15.1X53-D60.4
)でも設定可能
- 少し前の実装
- Juniper公式 / ip-prefix-support コマンド at JUNOS15.1
Statement introduced in Junos OS Release 15.1x53-D30 on QFX10002 switches.
だそうでThis statement is deprecated starting with Junos OS Release 15.1x53-D60 and has been replaced with ip-prefix-routes.
ってことらしく、バージョンをあげると自動的にip-prefix-routes
になるらしいので- vQFX(
15.1X53-D60.4
)では設定不可
- Juniper公式 / Configuring EVPN Type 5 for QFX10000 Series Switches / Configuration Example
- 上記を用いた分かりやすいサンプル
- Juniper公式 / ip-prefix-support コマンド at JUNOS15.1
- NetOne コラム / EVPN で変わる・変えられるデータセンターネットワーク1
- Juniper MX を使った L2 + L3 の具体的な例(2016/03 時点のものみたい)
- 多分これは
Asymmetric
なやつ - 日本語で嚙み砕いた説明
- Juniper公式 / ip-prefix-routes コマンド at JUNOS15.1
- その他
- Cisco 発表資料(20160120) / VXLANチュートリアル
- スライド 16-25 に
Asymmetric
とSymmetric
の噛み砕いだ日本語図解あり - この時点では「Juniper のは
Asymmetric
実装・Cisco のはSymmetric
実装」と紹介されているが - 2017/01現在は Juniper にも
Symmetric
実装があるよ、というのを本項で扱う
- スライド 16-25 に
- Cisco 発表資料(20160120) / VXLANチュートリアル
- O'Reilly Juniper QFX10000 Series
- Juniper QFX10000 の独自プロセッサ開発経緯や特徴・Architecture(HW/SW) の結構詳しい説明・MPLS/VXLAN+EVPNの設計ポイント解説などが纏まった非常に良い本
Juniper QFX10000 Series: A Comprehensive Guide to Building Next-Generation Data Centers
- 作者: Douglas Richard, Jr. Hanks
- 出版社/メーカー: O'Reilly Media
- 発売日: 2016/08/11
- メディア: ペーパーバック
- この商品を含むブログを見る
- Juniper QFX10000 の独自プロセッサ開発経緯や特徴・Architecture(HW/SW) の結構詳しい説明・MPLS/VXLAN+EVPNの設計ポイント解説などが纏まった非常に良い本
構築~動作確認
GNS3 でデプロイ
前回の環境を引き続き使います。先にあげた概要構成図の通り。
疎通確認用 node 設定
以下のような感じで
kotetsu@node11:~$ ip a show dev ens4 3: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:37:c4:e2:60:01 brd ff:ff:ff:ff:ff:ff inet 192.168.1.1/24 brd 192.168.1.255 scope global ens4 valid_lft forever preferred_lft forever inet6 fe80::237:c4ff:fee2:6001/64 scope link valid_lft forever preferred_lft forever kotetsu@node11:~$ ip route show dev ens4 192.168.0.0/16 via 192.168.1.254 192.168.1.0/24 proto kernel scope link src 192.168.1.1
kotetsu@node21:~$ ip a show dev ens4 3: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:37:c4:46:d8:01 brd ff:ff:ff:ff:ff:ff inet 192.168.1.2/24 brd 192.168.1.255 scope global ens4 valid_lft forever preferred_lft forever inet6 fe80::237:c4ff:fe46:d801/64 scope link valid_lft forever preferred_lft forever kotetsu@node21:~$ ip route show dev ens4 192.168.0.0/16 via 192.168.1.254 192.168.1.0/24 proto kernel scope link src 192.168.1.2
kotetsu@node22:~$ ip a show dev ens4 3: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:37:c4:3d:e0:01 brd ff:ff:ff:ff:ff:ff inet 192.168.2.2/24 brd 192.168.2.255 scope global ens4 valid_lft forever preferred_lft forever inet6 fe80::237:c4ff:fe3d:e001/64 scope link valid_lft forever preferred_lft forever kotetsu@node22:~$ ip route show dev ens4 192.168.0.0/16 via 192.168.2.254 192.168.2.0/24 proto kernel scope link src 192.168.2.2
kotetsu@node13:~$ ip a show dev ens4 3: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:37:c4:0d:a8:01 brd ff:ff:ff:ff:ff:ff inet 192.168.3.1/24 brd 192.168.3.255 scope global ens4 valid_lft forever preferred_lft forever inet6 fe80::237:c4ff:fe0d:a801/64 scope link valid_lft forever preferred_lft forever kotetsu@node13:~$ ip route show dev ens4 192.168.0.0/16 via 192.168.3.254 192.168.3.0/24 proto kernel scope link src 192.168.3.1
vQFX 基本設定ちょいたし
EVPN にこんな設定をして /var/log/evpn.log
で追えるようにしときました。flag all
にしたらちょっと追いきれない情報量になったので、そこはお好みで...。
set protocols evpn traceoptions file evpn.log set protocols evpn traceoptions file size 10k set protocols evpn traceoptions file files 30 set protocols evpn traceoptions flag all
vQFX Inter Subnet Forwarding 設定~確認
Inter Subnet Forwarding 設定
spine11
前回こんな感じの設定を入れてあったので
{master:0}[edit] kotetsu@spine11# show vlans | display set set vlans VLAN0100 vlan-id 100 set vlans VLAN0100 vxlan vni 10100 set vlans VLAN0100 vxlan ingress-node-replication set vlans VLAN0300 vlan-id 300 set vlans VLAN0300 vxlan vni 10300 set vlans VLAN0300 vxlan ingress-node-replication set vlans default vlan-id 1
以下で IRB 作成 ~ VRF 作成
set interfaces irb unit 100 family inet address 192.168.1.254/24 set interfaces irb unit 100 proxy-macip-advertisement set interfaces irb unit 300 family inet address 192.168.3.254/24 set interfaces irb unit 300 proxy-macip-advertisement set vlans VLAN0100 l3-interface irb.100 set vlans VLAN0300 l3-interface irb.300 set interfaces lo0 unit 1 family inet address 198.18.1.11/32 set routing-instances VRF001 instance-type vrf set routing-instances VRF001 interface irb.100 set routing-instances VRF001 interface irb.300 set routing-instances VRF001 interface lo0.1 set routing-instances VRF001 route-distinguisher 50001:11 set routing-instances VRF001 vrf-target target:64512:50001 set routing-instances VRF001 protocols evpn ip-prefix-routes advertise direct-nexthop set routing-instances VRF001 protocols evpn ip-prefix-routes encapsulation vxlan set routing-instances VRF001 protocols evpn ip-prefix-routes vni 50001
ポイントは protocols evpn ip-prefix-routes
周りの設定ですね。
これで VRF to VRF で EVPN NLRI Type5 で IP Prefix や自分の MAC アドレス(Router's MAC) を送信できるようになるはず。
Juniper公式 / ReleaseNotes Junos 15.1X53-D60 for QFX10000 Switches の 19 ページによると
Best practice for EVPN-VXLAN configuration (QFX10000 switches)—Starting with Junos OS Release 15.1X53-D60, in an EVPN-VXLAN configuration on QFX10000 switches, you no longer need to configure vxlan ingress-node-replication.
だそうな。なんでだろ。とにかく Best Practice なら従っておくのがよかろうということで。
delete vlans VLAN0100 vxlan ingress-node-replication delete vlans VLAN0300 vxlan ingress-node-replication
これを消さずにテストしていた時、なんか EVPN NLRI Type3 を送ってきていない Remote VTEP と VNI の組み合わせに対して BUM を ingress replication 転送してたんだよな...ということで消すのが正解と思います。
あと自分の環境起因かもですが、この辺の設定追加・変更して commit した時に、bb01 と spine[12]1 の間で LLDP や BGP がフラッピングし始めることがありました。ちゃんと追ってないですが、そんな時にはおとなしく request system reboot
して落ち着かせました。(雑)
spine21
spine11 とほとんど一緒です。
前回こんな感じの設定を入れてあったので
{master:0}[edit] kotetsu@spine21# show vlans | display set set vlans VLAN0100 vlan-id 100 set vlans VLAN0100 vxlan vni 10100 set vlans VLAN0100 vxlan ingress-node-replication set vlans VLAN0200 vlan-id 200 set vlans VLAN0200 vxlan vni 10200 set vlans VLAN0200 vxlan ingress-node-replication set vlans default vlan-id 1
以下で IRB 作成 ~ VRF 作成
set interfaces irb unit 100 family inet address 192.168.1.254/24 set interfaces irb unit 100 proxy-macip-advertisement set interfaces irb unit 200 family inet address 192.168.2.254/24 set interfaces irb unit 200 proxy-macip-advertisement set vlans VLAN0100 l3-interface irb.100 set vlans VLAN0200 l3-interface irb.200 set interfaces lo0 unit 1 family inet address 198.18.1.21/32 set routing-instances VRF001 instance-type vrf set routing-instances VRF001 interface irb.100 set routing-instances VRF001 interface irb.200 set routing-instances VRF001 interface lo0.1 set routing-instances VRF001 route-distinguisher 50001:21 set routing-instances VRF001 vrf-target target:64512:50001 set routing-instances VRF001 protocols evpn ip-prefix-routes advertise direct-nexthop set routing-instances VRF001 protocols evpn ip-prefix-routes encapsulation vxlan set routing-instances VRF001 protocols evpn ip-prefix-routes vni 50001
前述の通り Best Practice に従っておく。
delete vlans VLAN0100 vxlan ingress-node-replication delete vlans VLAN0200 vxlan ingress-node-replication
動作確認
IPアドレス・MACアドレス情報 整理
ちょっとノード数が増えてきたので、まとめときます。
VLAN | IPアドレス | MACアドレス | ノード | インターフェース | 備考 |
---|---|---|---|---|---|
100 | 192.168.1.1/24 |
00:37:c4:e2:60:01 |
node11 |
ens4 |
spine11 配下 |
100 | 192.168.1.2/24 |
00:37:c4:46:d8:01 |
node21 |
ens4 |
spine21 配下 |
100 | 192.168.1.254/24 |
02:05:86:71:3c:00 |
spine11 |
irb |
|
100 | 192.168.1.254/24 |
02:05:86:71:d8:00 |
spine21 |
irb |
|
200 | 192.168.2.2/24 |
00:37:c4:3d:e0:01 |
node22 |
ens4 |
spine21 配下 |
200 | 192.168.2.254/24 |
02:05:86:71:d8:00 |
spine21 |
irb |
|
300 | 192.168.3.1/24 |
00:37:c4:0d:a8:01 |
node13 |
ens4 |
spine11 配下 |
300 | 192.168.3.254/24 |
02:05:86:71:3c:00 |
spine11 |
irb |
|
- | 192.0.2.1/30 |
02:05:86:71:21:03 |
bb01 |
xe-0/0/0 |
spine21 側 |
- | 192.0.2.2/30 |
02:05:86:71:3c:03 |
spine11 |
xe-0/0/0 |
bb01 側 |
- | 192.0.2.5/30 |
02:05:86:71:21:07 |
bb01 |
xe-0/0/1 |
spine21 側 |
- | 192.0.2.6/30 |
02:05:86:71:d8:03 |
spine21 |
xe-0/0/0 |
bb01 側 |
spine11 と spine21 の IRB MAC アドレス at VLAN100 は各物理のものになっていて、共有用の仮想 MAC を設定したりはしていないです。
spine11 配下の node11 は spine11 の IRB MACアドレスをゲートウェイとして使い、spine21 配下の node21 は spine21 の IRB MACアドレスをゲートウェイとして使う...ってな動きになるのか、を見ようという主旨。
node間疎通確認~ARPテーブル確認
4 台の node 間をフルメッシュに ping 簡易疎通確認、とりあえず疎通オールおっけー。
直後 ARP テーブル確認
- node11(192.168.1.1/24)
kotetsu@node11:~$ ip n show dev ens4 192.168.1.254 lladdr 02:05:86:71:3c:00 REACHABLE ## spine11 IRB の MACaddr 192.168.1.2 lladdr 00:37:c4:46:d8:01 STALE
- node21(192.168.1.2/24)
kotetsu@node21:~$ ip n show dev ens4 192.168.1.254 lladdr 02:05:86:71:d8:00 REACHABLE ## spine21 IRB の MACaddr 192.168.1.1 lladdr 00:37:c4:e2:60:01 REACHABLE
- node13(192.168.3.1/24)
kotetsu@node13:~$ ip n show dev ens4 192.168.3.254 lladdr 02:05:86:71:3c:00 STALE ## spine11 IRB の MACaddr
- node22(192.168.2.2/24)
kotetsu@node22:~$ ip n show dev ens4 192.168.2.254 lladdr 02:05:86:71:d8:00 REACHABLE ## spine21 IRB の MACaddr
ちなみに spine11 や spine12 から ping を実行しようとしたら、自発パケットを EVPN 方面には流られないっぽいです。そりゃあそうか。
{master:0} kotetsu@spine21> ping routing-instance VRF001 192.168.1.2 PING 192.168.1.2 (192.168.1.2): 56 data bytes 64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=6.448 ms 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=5.700 ms {master:0} kotetsu@spine21> ping routing-instance VRF001 192.168.3.1 PING 192.168.3.1 (192.168.3.1): 56 data bytes ping: sendto: Operation not supported ping: sendto: Operation not supported {master:0} kotetsu@spine21> show route table VRF001.inet.0 192.168.3.0/24 VRF001.inet.0: 8 destinations, 9 routes (8 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 192.168.3.0/24 *[EVPN/170] 20:55:03 > to 192.0.2.5 via xe-0/0/0.0
パッと見は巧いこと通信できているようですが...ちょっと中身を追っていきます。
vQFXテーブル確認
EVPN
両方の spine につくっている VLAN100(VNI 10100)の MAC 情報だけが Remote から学習したものに含まれ...ってやはり Router's MAC
として 192.168.1.254
の実 MAC 2 台分を学習している。
{master:0} kotetsu@spine11> show evpn database Instance: default-switch VLAN VNI MAC address Active source Timestamp IP address 10100 00:37:c4:46:d8:01 172.16.2.1 Jan 08 21:35:56 10100 00:37:c4:e2:60:01 xe-0/0/1.0 Jan 08 01:30:42 192.168.1.1 10100 02:05:86:71:3c:00 irb.100 Jan 08 12:50:23 192.168.1.254 10100 02:05:86:71:d8:00 172.16.2.1 Jan 08 12:50:38 192.168.1.254 10300 00:37:c4:0d:a8:01 xe-0/0/1.0 Jan 08 01:30:41 192.168.3.1 10300 02:05:86:71:3c:00 irb.300 Jan 08 01:27:27 192.168.3.254
{master:0} kotetsu@spine21> show evpn database Instance: default-switch VLAN VNI MAC address Active source Timestamp IP address 10100 00:37:c4:46:d8:01 xe-0/0/1.0 Jan 08 01:30:41 192.168.1.2 10100 00:37:c4:e2:60:01 172.16.1.1 Jan 08 21:42:10 192.168.1.1 10100 02:05:86:71:3c:00 172.16.1.1 Jan 08 12:53:48 192.168.1.254 10100 02:05:86:71:d8:00 irb.100 Jan 08 12:54:02 192.168.1.254 10200 00:37:c4:3d:e0:01 xe-0/0/1.0 Jan 08 01:30:41 192.168.2.2 10200 02:05:86:71:d8:00 irb.200 Jan 08 01:16:21 192.168.2.254
自分が吐いている Type5 情報サマリ
{master:0} kotetsu@spine11> show evpn l3-context L3 context Type Adv Encap VNI/Label Router MAC/GW intf VRF001 Cfg Direct VXLAN 50001 02:05:86:71:3c:00
{master:0} kotetsu@spine21> show evpn l3-context L3 context Type Adv Encap VNI/Label Router MAC/GW intf VRF001 Cfg Direct VXLAN 50001 02:05:86:71:d8:00
Remote から Type 5 で学習した Router's MAC を確認して
{master:0} kotetsu@spine11> show evpn ip-prefix-database L3 context: VRF001 IPv4->EVPN Exported Prefixes Prefix EVPN route status 192.168.1.0/24 Created 192.168.3.0/24 Created EVPN->IPv4 Imported Prefixes Prefix Etag IP route status 192.168.1.0/24 0 Created Route distinguisher St VNI/Label Router MAC Nexthop/Overlay GW/ESI 50001:21 A 50001 02:05:86:71:d8:00 172.16.2.1 192.168.2.0/24 0 Created Route distinguisher St VNI/Label Router MAC Nexthop/Overlay GW/ESI 50001:21 A 50001 02:05:86:71:d8:00 172.16.2.1
{master:0} kotetsu@spine21> show evpn ip-prefix-database L3 context: VRF001 IPv4->EVPN Exported Prefixes Prefix EVPN route status 192.168.1.0/24 Created 192.168.2.0/24 Created EVPN->IPv4 Imported Prefixes Prefix Etag IP route status 192.168.1.0/24 0 Created Route distinguisher St VNI/Label Router MAC Nexthop/Overlay GW/ESI 50001:11 A 50001 02:05:86:71:3c:00 172.16.1.1 192.168.3.0/24 0 Created Route distinguisher St VNI/Label Router MAC Nexthop/Overlay GW/ESI 50001:11 A 50001 02:05:86:71:3c:00 172.16.1.1
Routing Table
当該 VRF の Routing Table サマリーを見て
{master:0} kotetsu@spine11> show route instance VRF001 extensive VRF001: Router ID: 198.18.1.11 Type: vrf State: Active Interfaces: irb.100 irb.300 lo0.1 Route-distinguisher: 50001:11 Vrf-import: [ __vrf-import-VRF001-internal__ ] Vrf-export: [ __vrf-export-VRF001-internal__ ] Vrf-import-target: [ target:64512:50001 ] Vrf-export-target: [ target:64512:50001 ] Fast-reroute-priority: low Tables: VRF001.inet.0 : 9 routes (8 active, 0 holddown, 0 hidden) VRF001.inet.3 : 0 routes (0 active, 0 holddown, 0 hidden) VRF001.iso.0 : 0 routes (0 active, 0 holddown, 0 hidden) VRF001.inet6.0 : 0 routes (0 active, 0 holddown, 0 hidden) VRF001.inet6.3 : 0 routes (0 active, 0 holddown, 0 hidden) VRF001.mdt.0 : 0 routes (0 active, 0 holddown, 0 hidden) VRF001.evpn.0 : 4 routes (4 active, 0 holddown, 0 hidden)
{master:0} kotetsu@spine21> show route instance VRF001 extensive VRF001: Router ID: 198.18.1.21 Type: vrf State: Active Interfaces: irb.100 irb.200 lo0.1 Route-distinguisher: 50001:21 Vrf-import: [ __vrf-import-VRF001-internal__ ] Vrf-export: [ __vrf-export-VRF001-internal__ ] Vrf-import-target: [ target:64512:50001 ] Vrf-export-target: [ target:64512:50001 ] Fast-reroute-priority: low Tables: VRF001.inet.0 : 9 routes (8 active, 0 holddown, 0 hidden) VRF001.inet.3 : 0 routes (0 active, 0 holddown, 0 hidden) VRF001.iso.0 : 0 routes (0 active, 0 holddown, 0 hidden) VRF001.inet6.0 : 0 routes (0 active, 0 holddown, 0 hidden) VRF001.inet6.3 : 0 routes (0 active, 0 holddown, 0 hidden) VRF001.mdt.0 : 0 routes (0 active, 0 holddown, 0 hidden) VRF001.evpn.0 : 4 routes (4 active, 0 holddown, 0 hidden)
中身のサマリをみる。まずは「bgp.evpn.0 = Junos OS ルーティング プロトコル プロセス(RPD)内のグローバル EVPN ルーティング テーブル」を
{master:0} kotetsu@spine11> show route table bgp.evpn.0 bgp.evpn.0: 9 destinations, 9 routes (9 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 1:172.16.2.1:0::050000fdea0000277400::FFFF:FFFF/304 *[BGP/170] 21:18:16, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 1:172.16.2.1:0::050000fdea000027d800::FFFF:FFFF/304 *[BGP/170] 21:18:16, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 2:64512:21::10100::00:37:c4:46:d8:01/304 *[BGP/170] 19:24:02, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 2:64512:21::10100::02:05:86:71:d8:00/304 *[BGP/170] 09:57:37, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 2:64512:21::10100::00:37:c4:46:d8:01::192.168.1.2/304 *[BGP/170] 09:36:35, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 2:64512:21::10100::00:37:c4:46:d8:01::192.168.1.2/304 *[BGP/170] 09:36:35, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 2:64512:21::10100::02:05:86:71:d8:00::192.168.1.254/304 *[BGP/170] 09:57:37, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 3:64512:21::10100::172.16.2.1/304 *[BGP/170] 19:24:02, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 5:50001:21::0::192.168.1.0::24/304 *[BGP/170] 21:18:16, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 5:50001:21::0::192.168.2.0::24/304 *[BGP/170] 21:18:16, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0
{master:0} kotetsu@spine21> show route table bgp.evpn.0 bgp.evpn.0: 9 destinations, 9 routes (9 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 1:172.16.1.1:0::050000fde90000277400::FFFF:FFFF/304 *[BGP/170] 10:02:28, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0 1:172.16.1.1:0::050000fde90000283c00::FFFF:FFFF/304 *[BGP/170] 21:26:18, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0 2:64512:11::10100::00:37:c4:e2:60:01/304 *[BGP/170] 19:32:22, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0 2:64512:11::10100::02:05:86:71:3c:00/304 *[BGP/170] 10:02:28, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0 2:64512:11::10100::00:37:c4:e2:60:01::192.168.1.1/304 *[BGP/170] 10:01:04, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0 2:64512:11::10100::02:05:86:71:3c:00::192.168.1.254/304 *[BGP/170] 10:02:28, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0 3:64512:11::10100::172.16.1.1/304 *[BGP/170] 19:32:21, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0 5:50001:11::0::192.168.1.0::24/304 *[BGP/170] 10:02:29, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0 5:50001:11::0::192.168.3.0::24/304 *[BGP/170] 21:26:18, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0
次に当該 VRF のさまりー
{master:0} kotetsu@spine11> show route table VRF001.evpn.0 VRF001.evpn.0: 4 destinations, 4 routes (4 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 5:50001:11::0::192.168.1.0::24/304 *[EVPN/170] 10:15:34 Indirect 5:50001:11::0::192.168.3.0::24/304 *[EVPN/170] 21:36:19 Indirect 5:50001:21::0::192.168.1.0::24/304 *[BGP/170] 21:35:58, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 5:50001:21::0::192.168.2.0::24/304 *[BGP/170] 21:35:58, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.1 via xe-0/0/0.0 {master:0} kotetsu@spine11> show route table VRF001.inet.0 VRF001.inet.0: 8 destinations, 9 routes (8 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 192.168.1.0/24 *[Direct/0] 10:11:26 > via irb.100 [EVPN/170] 21:31:50 > to 192.0.2.1 via xe-0/0/0.0 192.168.1.1/32 *[EVPN/7] 10:10:01 > via irb.100 192.168.1.254/32 *[Local/0] 10:11:27 Local via irb.100 192.168.2.0/24 *[EVPN/170] 21:31:50 > to 192.0.2.1 via xe-0/0/0.0 192.168.3.0/24 *[Direct/0] 21:32:11 > via irb.300 192.168.3.1/32 *[EVPN/7] 21:31:06 > via irb.300 192.168.3.254/32 *[Local/0] 21:34:23 Local via irb.300 198.18.1.11/32 *[Direct/0] 21:34:23 > via lo0.1
{master:0} kotetsu@spine21> show route table VRF001.evpn.0 VRF001.evpn.0: 4 destinations, 4 routes (4 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 5:50001:11::0::192.168.1.0::24/304 *[BGP/170] 10:19:12, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0 5:50001:11::0::192.168.3.0::24/304 *[BGP/170] 21:43:01, localpref 100, from 172.31.0.1 AS path: I, validation-state: unverified > to 192.0.2.5 via xe-0/0/0.0 5:50001:21::0::192.168.1.0::24/304 *[EVPN/170] 10:18:58 Indirect 5:50001:21::0::192.168.2.0::24/304 *[EVPN/170] 21:54:15 Indirect {master:0} kotetsu@spine21> show route table VRF001.inet.0 VRF001.inet.0: 8 destinations, 9 routes (8 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 192.168.1.0/24 *[Direct/0] 10:16:27 > via irb.100 [EVPN/170] 10:16:41 > to 192.0.2.5 via xe-0/0/0.0 192.168.1.2/32 *[EVPN/7] 10:16:10 > via irb.100 192.168.1.254/32 *[Local/0] 10:16:27 Local via irb.100 192.168.2.0/24 *[Direct/0] 21:51:44 > via irb.200 192.168.2.2/32 *[EVPN/7] 21:39:37 > via irb.200 192.168.2.254/32 *[Local/0] 21:54:08 Local via irb.200 192.168.3.0/24 *[EVPN/170] 21:40:30 > to 192.0.2.5 via xe-0/0/0.0 198.18.1.21/32 *[Direct/0] 21:54:08 > via lo0.1
最後に Type 5 route の詳細を見ておく。こいつらは VRF001.evpn.0
にもロードされている。
{master:0} kotetsu@spine11> show route table bgp.evpn.0 extensive ... 5:50001:21::0::192.168.1.0::24/304 (1 entry, 0 announced) *BGP Preference: 170/-101 Route Distinguisher: 50001:21 Next hop type: Indirect, Next hop index: 0 Address: 0xaa605f0 Next-hop reference count: 18 Source: 172.31.0.1 Protocol next hop: 172.16.2.1 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 State: <Active Int Ext> Local AS: 65001 Peer AS: 64512 Age: 21:25:33 Metric2: 0 Validation State: unverified Task: BGP_64512_64512.172.31.0.1 AS path: I (Originator) Cluster list: 172.31.0.1 Originator ID: 172.16.2.1 Communities: target:64512:50001 encapsulation0:0:0:0:vxlan router-mac:02:05:86:71:d8:00 Import Accepted Route Label: 50001 Overlay gateway address: 0.0.0.0 ESI 00:00:00:00:00:00:00:00:00:00 Localpref: 100 Router ID: 172.31.0.1 Secondary Tables: VRF001.evpn.0 Indirect next hops: 1 Protocol next hop: 172.16.2.1 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 Indirect path forwarding next hops: 1 Next hop type: Router Next hop: 192.0.2.1 via xe-0/0/0.0 Session Id: 0x0 172.16.2.1/32 Originating RIB: inet.0 Node path count: 1 Forwarding nexthops: 1 Nexthop: 192.0.2.1 via xe-0/0/0.0 5:50001:21::0::192.168.2.0::24/304 (1 entry, 0 announced) *BGP Preference: 170/-101 Route Distinguisher: 50001:21 Next hop type: Indirect, Next hop index: 0 Address: 0xaa605f0 Next-hop reference count: 18 Source: 172.31.0.1 Protocol next hop: 172.16.2.1 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 State: <Active Int Ext> Local AS: 65001 Peer AS: 64512 Age: 21:25:33 Metric2: 0 Validation State: unverified Task: BGP_64512_64512.172.31.0.1 AS path: I (Originator) Cluster list: 172.31.0.1 Originator ID: 172.16.2.1 Communities: target:64512:50001 encapsulation0:0:0:0:vxlan router-mac:02:05:86:71:d8:00 Import Accepted Route Label: 50001 Overlay gateway address: 0.0.0.0 ESI 00:00:00:00:00:00:00:00:00:00 Localpref: 100 Router ID: 172.31.0.1 Secondary Tables: VRF001.evpn.0 Indirect next hops: 1 Protocol next hop: 172.16.2.1 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 Indirect path forwarding next hops: 1 Next hop type: Router Next hop: 192.0.2.1 via xe-0/0/0.0 Session Id: 0x0 172.16.2.1/32 Originating RIB: inet.0 Node path count: 1 Forwarding nexthops: 1 Nexthop: 192.0.2.1 via xe-0/0/0.0
{master:0} kotetsu@spine21> show route table bgp.evpn.0 extensive ... 5:50001:11::0::192.168.1.0::24/304 (1 entry, 0 announced) *BGP Preference: 170/-101 Route Distinguisher: 50001:11 Next hop type: Indirect, Next hop index: 0 Address: 0xaa60170 Next-hop reference count: 18 Source: 172.31.0.1 Protocol next hop: 172.16.1.1 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 State: <Active Int Ext> Local AS: 65002 Peer AS: 64512 Age: 10:04:02 Metric2: 0 Validation State: unverified Task: BGP_64512_64512.172.31.0.1 AS path: I (Originator) Cluster list: 172.31.0.1 Originator ID: 172.16.1.1 Communities: target:64512:50001 encapsulation0:0:0:0:vxlan router-mac:02:05:86:71:3c:00 Import Accepted Route Label: 50001 Overlay gateway address: 0.0.0.0 ESI 00:00:00:00:00:00:00:00:00:00 Localpref: 100 Router ID: 172.31.0.1 Secondary Tables: VRF001.evpn.0 Indirect next hops: 1 Protocol next hop: 172.16.1.1 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 Indirect path forwarding next hops: 1 Next hop type: Router Next hop: 192.0.2.5 via xe-0/0/0.0 Session Id: 0x0 172.16.1.1/32 Originating RIB: inet.0 Node path count: 1 Forwarding nexthops: 1 Nexthop: 192.0.2.5 via xe-0/0/0.0 5:50001:11::0::192.168.3.0::24/304 (1 entry, 0 announced) *BGP Preference: 170/-101 Route Distinguisher: 50001:11 Next hop type: Indirect, Next hop index: 0 Address: 0xaa60170 Next-hop reference count: 18 Source: 172.31.0.1 Protocol next hop: 172.16.1.1 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 State: <Active Int Ext> Local AS: 65002 Peer AS: 64512 Age: 21:27:51 Metric2: 0 Validation State: unverified Task: BGP_64512_64512.172.31.0.1 AS path: I (Originator) Cluster list: 172.31.0.1 Originator ID: 172.16.1.1 Communities: target:64512:50001 encapsulation0:0:0:0:vxlan router-mac:02:05:86:71:3c:00 Import Accepted Route Label: 50001 Overlay gateway address: 0.0.0.0 ESI 00:00:00:00:00:00:00:00:00:00 Localpref: 100 Router ID: 172.31.0.1 Secondary Tables: VRF001.evpn.0 Indirect next hops: 1 Protocol next hop: 172.16.1.1 Indirect next hop: 0x2 no-forward INH Session ID: 0x0 Indirect path forwarding next hops: 1 Next hop type: Router Next hop: 192.0.2.5 via xe-0/0/0.0 Session Id: 0x0 172.16.1.1/32 Originating RIB: inet.0 Node path count: 1 Forwarding nexthops: 1 Nexthop: 192.0.2.5 via xe-0/0/0.0
MAC アドレステーブル
Type 2 から学習しているのは、両方の VTEP にくっつけている VLAN 100 = VNI 10100 のみ
{master:0} kotetsu@spine11> show ethernet-switching table MAC flags (S - static MAC, D - dynamic MAC, L - locally learned, P - Persistent static SE - statistics enabled, NM - non configured MAC, R - remote PE MAC, O - ovsdb MAC) Ethernet switching table : 4 entries, 4 learned Routing instance : default-switch Vlan MAC MAC Logical Active name address flags interface source VLAN0100 00:37:c4:46:d8:01 D vtep.32769 172.16.2.1 VLAN0100 00:37:c4:e2:60:01 D xe-0/0/1.0 VLAN0100 02:05:86:71:d8:00 D vtep.32769 172.16.2.1 VLAN0300 00:37:c4:0d:a8:01 D xe-0/0/1.0
{master:0} kotetsu@spine21> show ethernet-switching table MAC flags (S - static MAC, D - dynamic MAC, L - locally learned, P - Persistent static SE - statistics enabled, NM - non configured MAC, R - remote PE MAC, O - ovsdb MAC) Ethernet switching table : 4 entries, 4 learned Routing instance : default-switch Vlan MAC MAC Logical Active name address flags interface source VLAN0100 00:37:c4:46:d8:01 D xe-0/0/1.0 VLAN0100 00:37:c4:e2:60:01 D vtep.32769 172.16.1.1 VLAN0100 02:05:86:71:3c:00 D vtep.32769 172.16.1.1 VLAN0200 00:37:c4:3d:e0:01 D xe-0/0/1.0
通信確認詳細(DataPlane)
各通信の様子を見ていきます。それぞれ、実行前に sudo ip n flush dev ens4
とかしてます。
L3 Symmetric
node22(192.168.2.2/24) から node13(192.168.3.1/24) へ ping
以下、ICMP Echo request を spine21 と bb01 間で拾ったもの。
VXLANカプセル内の Eth ヘッダを見ると、Type5で学習した spine11 の irb MAC アドレスを Dst に指定されています。
なお、ICMP Echo Reply も同じ感じです。
L2 over L3
node21(192.168.1.2/24) から node11(192.168.1.1/24) へ ping
これは前回と同様に、単純に VNI 10100 でカプセル化されて通信しているだけ。
L3 往路 Symmetric 復路 Asymmetric
node11(192.168.1.1/24) から node22(192.168.2.2/24) へ ping
このケースが、どう動くのかイマイチ予測できなかったところです。
- 往路 node11 がゲートウェイIPアドレス(192.168.1.254) ARP 解決を試みる
- 往路 spine11 が node11 に 自身の irb MAC アドレスを答える (この時「自分が応答したので ARP request を VNI 10100 方面には転送しない」という動作になってくれるのか否かが予想できなかった & 確認したかった)
- 往路 spine11 は node11 からの Dst IP(192.168.2.2/24) な ICMP Echo request パケットを受信し、Type5 で得た情報に従い VNI 50001 でカプセル化して spine21 に投げる (Symmetric)
- 往路 spine21 は自分の irb direct 配下にいる node22 にフォワードするだけ
- 復路 node22 はゲートウェイIPアドレス(192.168.2.254)の ARP 解決をして、spine21 の irb MAC に ICMP Echo Reply 投げる
- 復路 spine21 は node22 からの Dst IP(192.168.1.1/24) な ICMP Echo Reply パケットを受信し、Type2 で得た情報に従い VNI 10100 でカプセル化して spine11 に投げる (Asymmetric)
- 復路 spine11 は自分の irb direct 配下にいる node11 にフォワードするだけ
という感じに予測して、行きと戻りの VNI が異なる論理的に非対称な通信でちゃんと成り立っているのか、っていうのと太字箇所を見ていきます。いやまあ疎通は確認済なんですが。
まず node11 で拾ったパケットを見ると...はい、上記の太字箇所は期待した動作になっていないですね。
spine11 と spine21 双方の irb から ARP Reply が来ていて(パケットNo.2と4)、たまたま node の仕様的に先に返ってきた spine11 側の MAC アドレスを使っていたに過ぎないようです。
上記の動作を、今度は spine11 と bb01 間で拾ったパケットで追ってみます。
このパケットNo.16 が「自分が node11 に ARP Reply した直後、ARP Request を VNI 10100 で spine21 方面に Ingress Replication している」やつです。
当然、spine21 側は通常通り ARP Reply を返してくれるし、それは先ほど node11 側で見た通り node11 にも伝搬されます。
ということで、ARP Request に対する Reply の動作確認は、自分が期待していたのと違う動きのようです。
構成や設定でどうにか巧いことならないか...ってところは深追いしていません。
(試しに spine[12]1 双方で set interfaces irb unit 100 mac 00:00:5e:00:53:99
とか virtual-gateway-address
とか設定して同じ MAC アドレスを持たせてみたりはしましたが...それでも通信は可能だけれど、特に代表動作とかをしないIP/MAC重複状態なので、健全な状態とは言えないかと。)
あ、往路 VNI 50001, 復路 VNI 10100 に関しては、想定通りの動きでした。
パケットキャプチャ(ControlPlane)
EVPN NLRI Type5 の UPDATE と WithDrawn を軽く見ておきます。
まずは WithDrawn を spine21 から吐かせた時(雑に deactivate routing-instance VRF001
とかで)
UPDATE を spine21 から吐かせた時(雑に rollback 1
とかで)
おしまい
- Juniper vQFX10000 でも EVPN NLRI Type5 が動くことを確認できました
- VRF to VRF 動作と L2VPN を併用する場合、何らかの工夫が必要そうだということは分かりました
- 「L3 往路 Symmetric 復路 Asymmetric」の項でウダウダ書いた通り
- そもそも MX を使って MAC VRF 使う、のが常道なのかもしれませんが