以下の内容はhttps://yokohama539.hatenablog.com/entry/2025/01/27/021601より取得しました。


vJunosでIP-Closなネットワーク作ってみた。~その1~

今年の個人的な目標として、流行のデータセンターネットワーク技術を学びたいと思っています(現状、仕事ではほぼ必要としていません)
EVE-NG上でvJunos-SwitchとvJunos-Routerを使って(EVPN/VXLANによる)IP-Closなネットワークを作ってみました。

今回は設定について書いていきますので、詳しい説明は省略します。
説明が欲しい方は、IP-Closについてはココ、EVPN/VXLANについてはココココをご覧ください。

今回は初めてというものあり、spineが1台、leafが2台のシンプルな構成とします(冗長構成はおいおい検証していきたい…)

ホストの代わりでルーター(vJunos-Router)を置いています。EVE-NGでLinux置く方法がよくわからん
疎通確認であれば、ルーターでも代替になるということで…。
ゴールとしては「vRouter-1とvRouter-2間でL2VPN(同一NWとして)でつながる」ことです。
spine、leafはvJunos-Switch(Junos 23.2R1.14)、vRouterはvJunos-Router(Junos 23.2R1.15)を使用します。
せっかくなので、物理リンク間は/31なサブネットで、Underlay/Overlayネットワークともに4Byte ASを使います。

1.Underlayネットワーク設定

まず、お互いのLoopbackアドレスを広報するためのUnderlayネットワークを構築します。以下の構成で設定していきます。

//spine-1
set interfaces ge-0/0/0 unit 0 family inet address 10.1.1.0/31
set interfaces ge-0/0/1 unit 0 family inet address 10.1.1.2/31
set interfaces lo0 unit 0 family inet address 172.16.0.1/32
set routing-options router-id 172.16.0.1
set routing-options autonomous-system 4200000001
set protocols bgp group UNDERLAY type external
set protocols bgp group UNDERLAY family inet unicast
set protocols bgp group UNDERLAY export EXPORT_BGP_UNDERLAY
set protocols bgp group UNDERLAY neighbor 10.1.1.1 peer-as 4200001001
set protocols bgp group UNDERLAY neighbor 10.1.1.3 peer-as 4200001002
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 0011 from route-filter 172.16.0.0/24 prefix-length-range /32-/32
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 0011 then accept
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 9999 then reject

//leaf-1
set interfaces ge-0/0/0 unit 0 family inet address 10.1.1.1/31
set interfaces lo0 unit 0 family inet address 172.16.0.11/32
set routing-options router-id 172.16.0.11
set routing-options autonomous-system 4200001001
set protocols bgp group UNDERLAY type external
set protocols bgp group UNDERLAY family inet unicast
set protocols bgp group UNDERLAY export EXPORT_BGP_UNDERLAY
set protocols bgp group UNDERLAY neighbor 10.1.1.0 peer-as 4200000001
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 0011 from protocol direct
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 0011 from route-filter 172.16.0.11/32 exact
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 0011 then accept
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 9999 then reject

//leaf-2
set interfaces ge-0/0/0 unit 0 family inet address 10.1.1.3/31
set interfaces lo0 unit 0 family inet address 172.16.0.12/32
set routing-options router-id 172.16.0.12
set routing-options autonomous-system 4200001002
set protocols bgp group UNDERLAY type external
set protocols bgp group UNDERLAY family inet unicast
set protocols bgp group UNDERLAY export EXPORT_BGP_UNDERLAY
set protocols bgp group UNDERLAY neighbor 10.1.1.2 peer-as 4200000001
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 0011 from protocol direct
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 0011 from route-filter 172.16.0.12/32 exact
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 0011 then accept
set policy-options policy-statement EXPORT_BGP_UNDERLAY term 9999 then reject


お互いのLoopbackアドレスが学習できてるか確認します。

//spine-1
lab@spine-1# run show bgp summary

Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 1 Peers: 2 Down peers: 0
Table          Tot Paths  Act Paths Suppressed    History Damp State    Pending
inet.0
                       2          2          0          0          0          0
Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
10.1.1.1         4200001001         15         14       0       0        5:16 Establ
  inet.0: 1/1/1/0
10.1.1.3         4200001002          7          6       0       0        1:42 Establ
  inet.0: 1/1/1/0


lab@spine-1# run show route protocol bgp

inet.0: 7 destinations, 7 routes (7 active, 0 holddown, 0 hidden)
Limit/Threshold: 1048576/1048576 destinations
+ = Active Route, - = Last Active, * = Both

172.16.0.11/32     *[BGP/170] 00:08:35, localpref 100
                      AS path: 4200001001 I, validation-state: unverified
                    >  to 10.1.1.1 via ge-0/0/0.0
172.16.0.12/32     *[BGP/170] 00:05:02, localpref 100
                      AS path: 4200001002 I, validation-state: unverified
                    >  to 10.1.1.3 via ge-0/0/1.0

//leaf-1
lab@leaf-1# run show bgp summary

Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 1 Peers: 1 Down peers: 0
Table          Tot Paths  Act Paths Suppressed    History Damp State    Pending
inet.0
                       2          2          0          0          0          0
Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
10.1.1.0         4200000001         18         16       0       0        6:17 Establ
  inet.0: 2/2/2/0


lab@leaf-1# run show route protocol bgp

inet.0: 5 destinations, 5 routes (5 active, 0 holddown, 0 hidden)
Limit/Threshold: 1048576/1048576 destinations
+ = Active Route, - = Last Active, * = Both

172.16.0.1/32      *[BGP/170] 00:08:08, localpref 100
                      AS path: 4200000001 I, validation-state: unverified
                    >  to 10.1.1.0 via ge-0/0/0.0
172.16.0.12/32     *[BGP/170] 00:04:47, localpref 100
                      AS path: 4200000001 4200001002 I, validation-state: unverified
                    >  to 10.1.1.0 via ge-0/0/0.0

//leaf-2
lab@leaf-2# run show bgp summary

Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 1 Peers: 1 Down peers: 0
Table          Tot Paths  Act Paths Suppressed    History Damp State    Pending
inet.0
                       2          2          0          0          0          0
Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
10.1.1.2         4200000001         13         10       0       0        3:43 Establ
  inet.0: 2/2/2/0


lab@leaf-2# run show route protocol bgp

inet.0: 5 destinations, 5 routes (5 active, 0 holddown, 0 hidden)
Limit/Threshold: 1048576/1048576 destinations
+ = Active Route, - = Last Active, * = Both

172.16.0.1/32      *[BGP/170] 00:05:53, localpref 100
                      AS path: 4200000001 I, validation-state: unverified
                    >  to 10.1.1.2 via ge-0/0/0.0
172.16.0.11/32     *[BGP/170] 00:05:53, localpref 100
                      AS path: 4200000001 4200001001 I, validation-state: unverified
                    >  to 10.1.1.2 via ge-0/0/0.0

2.Overlayネットワーク設定

続いてOverlayネットワークを構築します。構成図は以下の通りです。

MP-BGPにてEVPN NLRIをやりとりできるようにします。
configのポイントしては、(eBGPにてLoopbackアドレスでPeeringするので)Multihopの設定が必要な点でしょうか。
spineについては、さらにno-nexthop-changeオプションが必要となります。
(今回、spine - leaf間でASNを分けているので、このオプションも入れないと正しくVTEPを検出できません)

//spine-1
set protocols bgp group OVERLAY type external
set protocols bgp group OVERLAY multihop no-nexthop-change
set protocols bgp group OVERLAY local-address 172.16.0.1
set protocols bgp group OVERLAY family evpn signaling
set protocols bgp group OVERLAY neighbor 172.16.0.11 peer-as 4200001001
set protocols bgp group OVERLAY neighbor 172.16.0.12 peer-as 4200001002

//leaf-1
set protocols bgp group OVERLAY type external
set protocols bgp group OVERLAY multihop
set protocols bgp group OVERLAY local-address 172.16.0.11
set protocols bgp group OVERLAY family evpn signaling
set protocols bgp group OVERLAY peer-as 4200000001
set protocols bgp group OVERLAY neighbor 172.16.0.1

//leaf-2
set protocols bgp group OVERLAY type external
set protocols bgp group OVERLAY multihop
set protocols bgp group OVERLAY local-address 172.16.0.12
set protocols bgp group OVERLAY family evpn signaling
set protocols bgp group OVERLAY peer-as 4200000001
set protocols bgp group OVERLAY neighbor 172.16.0.1


OverlayなMP-BGPでもPeeringできてるか確認します。

//spine-1
lab@spine-1# run show bgp summary group OVERLAY

Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 2 Peers: 4 Down peers: 0
Table          Tot Paths  Act Paths Suppressed    History Damp State    Pending
inet.0
                       2          2          0          0          0          0
bgp.evpn.0
                       0          0          0          0          0          0
Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
172.16.0.11      4200001001         10          8       0       0        3:16 Establ
  bgp.evpn.0: 0/0/0/0
172.16.0.12      4200001002         10          8       0       0        3:04 Establ
  bgp.evpn.0: 0/0/0/0

//leaf-1
lab@leaf-1# run show bgp summary group OVERLAY

Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 2 Peers: 2 Down peers: 0
Table          Tot Paths  Act Paths Suppressed    History Damp State    Pending
inet.0
                       2          2          0          0          0          0
bgp.evpn.0
                       0          0          0          0          0          0
Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
172.16.0.1       4200000001         11         10       0       0        3:43 Establ
  bgp.evpn.0: 0/0/0/0

//leaf-2
lab@leaf-2# run show bgp summary group OVERLAY

Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 2 Peers: 2 Down peers: 0
Table          Tot Paths  Act Paths Suppressed    History Damp State    Pending
inet.0
                       2          2          0          0          0          0
bgp.evpn.0
                       0          0          0          0          0          0
Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
172.16.0.1       4200000001         11         10       0       0        3:55 Establ
  bgp.evpn.0: 0/0/0/0

3.VXLAN設定

最後にVXLAN周りの設定を行います。構成や用いるパラメーターは以下の通りです。

VLANとVNIマッピングやVTEPで用いるインターフェイスの定義などをします。
RDやroute-target(vrf-target)なんかも設定していきます。この辺はL2VPNやL3VPNの設定と一緒ですね。
あとついでにvRouterの設定もします。

//leaf-1
set vlans VLAN0012 vlan-id 12
set vlans VLAN0012 vxlan vni 10012
set interfaces ge-0/0/6 unit 0 family ethernet-switching interface-mode trunk
set interfaces ge-0/0/6 unit 0 family ethernet-switching vlan members all
set protocols evpn encapsulation vxlan
set protocols evpn extended-vni-list all
set switch-options vtep-source-interface lo0.0
set switch-options route-distinguisher 172.16.0.11:1
set switch-options vrf-target target:539:539

//leaf-2
set vlans VLAN0012 vlan-id 12
set vlans VLAN0012 vxlan vni 10012
set interfaces ge-0/0/6 unit 0 family ethernet-switching interface-mode trunk
set interfaces ge-0/0/6 unit 0 family ethernet-switching vlan members all
set protocols evpn encapsulation vxlan
set protocols evpn extended-vni-list all
set switch-options vtep-source-interface lo0.0
set switch-options route-distinguisher 172.16.0.12:1
set switch-options vrf-target target:539:539

//vRouter-1
set interfaces ge-0/0/0 vlan-tagging
set interfaces ge-0/0/0 unit 0 vlan-id 12
set interfaces ge-0/0/0 unit 0 family inet address 12.12.12.1/24

//vRouter-2
set interfaces ge-0/0/0 vlan-tagging
set interfaces ge-0/0/0 unit 0 vlan-id 12
set interfaces ge-0/0/0 unit 0 family inet address 12.12.12.2/24

設定は以上となります。

4.動作確認

確認作業をしていきます。
この確認作業からホスト(vRouter)のMACアドレスが非常に重要になりますのでメモしておきます。

ホスト MACアドレス
vRouter-1 ge-0/0/0 50:01:00:0a:00:01
vRouter-2 ge-0/0/0 50:01:00:0b:00:01


まず論より証拠…ではないですが、vRouter間でPingを飛ばしてみます。

//vRouter-1
lab@vRouter-1# run ping 12.12.12.2
PING 12.12.12.2 (12.12.12.2): 56 data bytes
64 bytes from 12.12.12.2: icmp_seq=0 ttl=64 time=3.128 ms
64 bytes from 12.12.12.2: icmp_seq=1 ttl=64 time=3.438 ms
64 bytes from 12.12.12.2: icmp_seq=2 ttl=64 time=3.651 ms
64 bytes from 12.12.12.2: icmp_seq=3 ttl=64 time=3.874 ms
64 bytes from 12.12.12.2: icmp_seq=4 ttl=64 time=3.782 ms

//vRouter-2
lab@vRouter-2# run show arp
MAC Address       Address         Name                      Interface               Flags
50:01:00:0a:00:01 12.12.12.1      12.12.12.1                ge-0/0/0.0              none
02:00:00:00:00:10 128.0.0.16      fpc0                      em1.0                   none
Total entries: 2

Pingが飛び、vRouter-2もvRouter-1のARP解決ができてるので、EVPNが正しく動作してそうです。

もう少し詳しく見ていきます。まずleaf-1にて確認してきます。

//leaf-1
lab@leaf-1# run show ethernet-switching vxlan-tunnel-end-point remote
Logical System Name       Id  SVTEP-IP         IFL   L3-Idx    SVTEP-Mode    ELP-SVTEP-IP
<default>                 0   172.16.0.11      lo0.0    0
 RVTEP-IP         L2-RTT                   IFL-Idx   Interface    NH-Id   RVTEP-Mode  ELP-IP        Flags
 172.16.0.12      default-switch           345       vtep.32769   586     RNVE
    VNID          MC-Group-IP
    10012         0.0.0.0

lab@leaf-1# run 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,
           B - Blocked MAC)


Ethernet switching table : 2 entries, 2 learned
Routing instance : default-switch
   Vlan                MAC                 MAC       GBP    Logical                SVLBNH/      Active
   name                address             flags     tag    interface              VENH Index   source
   VLAN0012            50:01:00:0a:00:01   D                ge-0/0/6.0
   VLAN0012            50:01:00:0b:00:01   DR               vtep.32769                          172.16.0.12

「show ethernet-switching vxlan-tunnel-end-point remote」コマンドで(leaf-2の)VTEPが正しく検出できてるのが確認できますね。
また「show ethernet-switching table」コマンドでVTEP経由でvRouter-2 ge-0/0/0のMACアドレスを学習できてるのが確認できます。

さらにleaf-1のshow routeの出力を見ていきます。

//leaf-1
lab@spine-1# run show route table bgp.evpn.0 | no-more

bgp.evpn.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

2:172.16.0.11:1::10012::50:01:00:0a:00:01/304 MAC/IP
                   *[BGP/170] 00:02:10, localpref 100, from 172.16.0.11
                      AS path: 4200001001 I, validation-state: unverified
                    >  to 10.1.1.1 via ge-0/0/0.0, Push 625
2:172.16.0.12:1::10012::50:01:00:0b:00:01/304 MAC/IP
                   *[BGP/170] 00:02:13, localpref 100, from 172.16.0.12
                      AS path: 4200001002 I, validation-state: unverified
                    >  to 10.1.1.3 via ge-0/0/1.0, Push 625
2:172.16.0.11:1::10012::50:01:00:0a:00:01::12.12.12.1/304 MAC/IP
                   *[BGP/170] 00:02:10, localpref 100, from 172.16.0.11
                      AS path: 4200001001 I, validation-state: unverified
                    >  to 10.1.1.1 via ge-0/0/0.0, Push 625
2:172.16.0.12:1::10012::50:01:00:0b:00:01::12.12.12.2/304 MAC/IP
                   *[BGP/170] 00:02:13, localpref 100, from 172.16.0.12
                      AS path: 4200001002 I, validation-state: unverified
                    >  to 10.1.1.3 via ge-0/0/1.0, Push 625
3:172.16.0.11:1::10012::172.16.0.11/248 IM
                   *[BGP/170] 00:12:29, localpref 100, from 172.16.0.11
                      AS path: 4200001001 I, validation-state: unverified
                    >  to 10.1.1.1 via ge-0/0/0.0
3:172.16.0.12:1::10012::172.16.0.12/248 IM
                   *[BGP/170] 00:12:12, localpref 100, from 172.16.0.12
                      AS path: 4200001002 I, validation-state: unverified
                    >  to 10.1.1.3 via ge-0/0/1.0

Routing Table entryに「2:172.16.0.12:1::10012::50:01:00:0b:00:01::12.12.12.2/304」があるので、vRouter-2のMACアドレス情報が広報されているのが確認できます。
ちなみにJunosのRouting Table entryの出力フォーマットは以下となっています。

[Route-Type]:[RD]::[ESI]:[VNI]::[MAC address info]::[optional-IP info]/xxx
//今回、ESIは設定してない(All Zero)なので上記のshow route結果では省略されている。


leaf-2側でもshow routeの出力確認します。

lab@leaf-2# run show route table bgp.evpn.0 | no-more

bgp.evpn.0: 6 destinations, 6 routes (6 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

2:172.16.0.11:1::10012::50:01:00:0a:00:01/304 MAC/IP
                   *[BGP/170] 00:03:09, localpref 100, from 172.16.0.1
                      AS path: 4200000001 4200001001 I, validation-state: unverified
                    >  to 10.1.1.2 via ge-0/0/0.0, Push 625
2:172.16.0.12:1::10012::50:01:00:0b:00:01/304 MAC/IP
                   *[EVPN/170] 00:03:10
                       Indirect
2:172.16.0.11:1::10012::50:01:00:0a:00:01::12.12.12.1/304 MAC/IP
                   *[BGP/170] 00:03:09, localpref 100, from 172.16.0.1
                      AS path: 4200000001 4200001001 I, validation-state: unverified
                    >  to 10.1.1.2 via ge-0/0/0.0, Push 625
2:172.16.0.12:1::10012::50:01:00:0b:00:01::12.12.12.2/304 MAC/IP
                   *[EVPN/170] 00:03:10
                       Indirect
3:172.16.0.11:1::10012::172.16.0.11/248 IM
                   *[BGP/170] 02:05:19, localpref 100, from 172.16.0.1
                      AS path: 4200000001 4200001001 I, validation-state: unverified
                    >  to 10.1.1.2 via ge-0/0/0.0
3:172.16.0.12:1::10012::172.16.0.12/248 IM
                   *[EVPN/170] 02:05:26
                       Indirect

vRouter-1のMAC/IP情報の「2:172.16.0.11:1::10012::50:01:00:0a:00:01::12.12.12.1/304」があるので、ちゃんと学習できてることが確認できます。

routeの詳細情報やspine-1でも確認したいところですが、尺の都合で省略します。
まあleaf間で各ホストのMACアドレスが学習できてるなら大丈夫でしょう…。

おまけでspine-leaf間のパケットキャプチャーを見てみます。
まずPing飛ばした際のARPパケットから。

ARP ReqがVTEP(172.16.0.12)宛のUnicastで飛んでますね。

続いてICMPパケットをみます。

こちらも同様にVTEP宛のUnicastでカプセル化されてます。

非常に長くなりましたが、シンプルな構成でホスト間の疎通ができました!!
今後はシリーズ化して冗長構成やService Interfacesを検証したいと思います!!!

5.参考資料

書籍「Deploying Juniper Data Centers with EVPN VXLAN」
EVPN-Presentation.pptxwww.slideshare.net




以上の内容はhttps://yokohama539.hatenablog.com/entry/2025/01/27/021601より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14