kakkotetsu

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 しているドキュメントでは「セグメントが単一サイト(/部屋)に閉じる場合には」という文言があったりするけれど

f:id:kakkotetsu:20170513134936p:plain

概要構成図

前回に引き続き、下図の感じで。

f:id:kakkotetsu:20170513135024p:plain

余談。
本環境の 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版公開済)を使えば、これが不要になります。やったぜ!

参考資料

構築~動作確認

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 に指定されています。

f:id:kakkotetsu:20170513135437p:plain

なお、ICMP Echo Reply も同じ感じです。

L2 over L3

node21(192.168.1.2/24) から node11(192.168.1.1/24) へ ping

これは前回と同様に、単純に VNI 10100 でカプセル化されて通信しているだけ。

f:id:kakkotetsu:20170513135451p:plain

L3 往路 Symmetric 復路 Asymmetric

node11(192.168.1.1/24) から node22(192.168.2.2/24) へ ping

このケースが、どう動くのかイマイチ予測できなかったところです。

  1. 往路 node11 がゲートウェイIPアドレス(192.168.1.254) ARP 解決を試みる
  2. 往路 spine11 が node11 に 自身の irb MAC アドレスを答える (この時「自分が応答したので ARP request を VNI 10100 方面には転送しない」という動作になってくれるのか否かが予想できなかった & 確認したかった)
  3. 往路 spine11 は node11 からの Dst IP(192.168.2.2/24) な ICMP Echo request パケットを受信し、Type5 で得た情報に従い VNI 50001 でカプセル化して spine21 に投げる (Symmetric)
  4. 往路 spine21 は自分の irb direct 配下にいる node22 にフォワードするだけ
  5. 復路 node22 はゲートウェイIPアドレス(192.168.2.254)の ARP 解決をして、spine21 の irb MAC に ICMP Echo Reply 投げる
  6. 復路 spine21 は node22 からの Dst IP(192.168.1.1/24) な ICMP Echo Reply パケットを受信し、Type2 で得た情報に従い VNI 10100 でカプセル化して spine11 に投げる (Asymmetric)
  7. 復路 spine11 は自分の irb direct 配下にいる node11 にフォワードするだけ

という感じに予測して、行きと戻りの VNI が異なる論理的に非対称な通信でちゃんと成り立っているのか、っていうのと太字箇所を見ていきます。いやまあ疎通は確認済なんですが。

まず node11 で拾ったパケットを見ると…はい、上記の太字箇所は期待した動作になっていないですね。
spine11 と spine21 双方の irb から ARP Reply が来ていて(パケットNo.2と4)、たまたま node の仕様的に先に返ってきた spine11 側の MAC アドレスを使っていたに過ぎないようです。

f:id:kakkotetsu:20170513135515p:plain

上記の動作を、今度は spine11 と bb01 間で拾ったパケットで追ってみます。
このパケットNo.16 が「自分が node11 に ARP Reply した直後、ARP Request を VNI 10100 で spine21 方面に Ingress Replication している」やつです。

f:id:kakkotetsu:20170513135531p:plain

当然、spine21 側は通常通り ARP Reply を返してくれるし、それは先ほど node11 側で見た通り node11 にも伝搬されます。

f:id:kakkotetsu:20170513135549p:plain

ということで、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 に関しては、想定通りの動きでした。

f:id:kakkotetsu:20170513135633p:plain f:id:kakkotetsu:20170513135642p:plain

パケットキャプチャ(ControlPlane)

EVPN NLRI Type5 の UPDATE と WithDrawn を軽く見ておきます。

まずは WithDrawn を spine21 から吐かせた時(雑に deactivate routing-instance VRF001 とかで)

f:id:kakkotetsu:20170513135705p:plain f:id:kakkotetsu:20170513135712p:plain

UPDATE を spine21 から吐かせた時(雑に rollback 1 とかで)

f:id:kakkotetsu:20170513135726p:plain

おしまい

  • Juniper vQFX10000 でも EVPN NLRI Type5 が動くことを確認できました
  • VRF to VRF 動作と L2VPN を併用する場合、何らかの工夫が必要そうだということは分かりました
    • 「L3 往路 Symmetric 復路 Asymmetric」の項でウダウダ書いた通り
    • そもそも MX を使って MAC VRF 使う、のが常道なのかもしれませんが