前々回、前回に引き続き、IP-Closなネットワークについて検証していきます。
今回はvJunos-switchにて「BGP Auto-Discovered Neighbors」機能について検証していきたいと思います。
BGP Auto-Discovered Neighborsとは、IPv6 Link-localアドレスにてNDP(Neighbor Discovery Protocol)を使用して自動にBGPネイバーを検出しPeeringする機能です。
これができると、spine~leaf間のIPアドレス設定やUnderlayのBGP設定が簡素化でき、管理が楽になります。
リンク間はIPv6ですがIPv4のLoopbackアドレスも広報できます。
もう少し細かく言うと、IPv6アドレスをネクストホップとしたIPv4のNLRIを広報することができます。これはRFC8950にて規定されています。
(昔はRFC5549にて規定されてましたが、現在は廃止されています)
なお、Juniperの公式ドキュメントは「BGP Auto-Discovered Neighbors」ですが「BGP unnumbered」と呼ばれるのが一般的なようです。
個人的には自動でBGP Peeringするので「BGP Auto-Discovered Neighbors」の文言を推したいと思います。
流れとしては前回同様、構成概要を考えて設定および、CLIとパケットキャプチャーによる確認をしていきたいと思います。
- 1. BGP Auto-Discovered Neighbors 構成
- 2. BGP Auto-Discovered Neighbors 設定
- 3. BGP Auto-Discovered Neighbors 確認
- 4. 参考資料
1. BGP Auto-Discovered Neighbors 構成
構成は前々回のspine x1、leaf x2のシンプルな構成を流用して検証します。
spine-leaf間は上述した通りIPv6 Link-localアドレスにて動的に付与されるので、IPv4アドレスは設定しません。
ASNは前々回と同じく4Byte ASで設定します。
図で示すとこんな感じです。

2. BGP Auto-Discovered Neighbors 設定
では設定をしていきます。
まずはspine-1から。
//spine-1 set interfaces ge-0/0/0 unit 0 family inet set interfaces ge-0/0/0 unit 0 family inet6 set interfaces ge-0/0/1 unit 0 family inet set interfaces ge-0/0/1 unit 0 family inet6 set interfaces lo0 unit 0 family inet address 172.16.0.1/32 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 set policy-options as-list LEAF members 4200001001-4200001002 set routing-options router-id 172.16.0.1 set routing-options autonomous-system 4200000001 set protocols router-advertisement interface ge-0/0/0.0 set protocols router-advertisement interface ge-0/0/1.0 set protocols bgp group UNDERLAY type external set protocols bgp group UNDERLAY family inet unicast extended-nexthop set protocols bgp group UNDERLAY family inet6 unicast set protocols bgp group UNDERLAY export EXPORT_BGP_UNDERLAY set protocols bgp group UNDERLAY dynamic-neighbor AUTO-UNDERLAY peer-auto-discovery family inet6 ipv6-nd set protocols bgp group UNDERLAY dynamic-neighbor AUTO-UNDERLAY peer-auto-discovery interface ge-0/0/0.0 set protocols bgp group UNDERLAY dynamic-neighbor AUTO-UNDERLAY peer-auto-discovery interface ge-0/0/1.0 set protocols bgp group UNDERLAY peer-as-list LEAF
ポイントしては、「set protocols bgp group UNDERLAY family inet unicast extended-nexthop」コマンドが必要なところでしょうか。
このコマンドを投入しないとIPv4 NLRIが広報できません。
また、peer-as-listでPeeringを許可するASNを定義する必要があります(peer-as-listがないとcommit時にerrorになります)
あとIPv4通信する際はインターフェイス配下にてfamily inetも有効にする必要があることも忘れがちだったり…。
続いてleafの設定です。
BGP Auto-Discovered Neighborsにて考慮すべきコマンドはspineと一緒です。
対象インターフェイスとpeer-as-listが異なるくらいですね。
//leaf-1 set interfaces ge-0/0/0 unit 0 family inet set interfaces ge-0/0/0 unit 0 family inet6 set interfaces lo0 unit 0 family inet address 172.16.0.11/32 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 set policy-options as-list SPINE members 4200000001 set routing-options router-id 172.16.0.11 set routing-options autonomous-system 4200001001 set protocols router-advertisement interface ge-0/0/0.0 set protocols bgp group UNDERLAY type external set protocols bgp group UNDERLAY family inet unicast extended-nexthop set protocols bgp group UNDERLAY family inet6 unicast set protocols bgp group UNDERLAY export EXPORT_BGP_UNDERLAY set protocols bgp group UNDERLAY dynamic-neighbor AUTO-UNDERLAY peer-auto-discovery family inet6 ipv6-nd set protocols bgp group UNDERLAY dynamic-neighbor AUTO-UNDERLAY peer-auto-discovery interface ge-0/0/0.0 set protocols bgp group UNDERLAY peer-as-list SPINE
//leaf-2 set interfaces ge-0/0/0 unit 0 family inet set interfaces ge-0/0/0 unit 0 family inet6 set interfaces lo0 unit 0 family inet address 172.16.0.12/32 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 set policy-options as-list SPINE members 4200000001 set routing-options router-id 172.16.0.12 set routing-options autonomous-system 4200001002 set protocols router-advertisement interface ge-0/0/0.0 set protocols bgp group UNDERLAY type external set protocols bgp group UNDERLAY family inet unicast extended-nexthop set protocols bgp group UNDERLAY family inet6 unicast set protocols bgp group UNDERLAY export EXPORT_BGP_UNDERLAY set protocols bgp group UNDERLAY dynamic-neighbor AUTO-UNDERLAY peer-auto-discovery family inet6 ipv6-nd set protocols bgp group UNDERLAY dynamic-neighbor AUTO-UNDERLAY peer-auto-discovery interface ge-0/0/0.0 set protocols bgp group UNDERLAY peer-as-list SPINE
設定は以上です。
3. BGP Auto-Discovered Neighbors 確認
では確認してきます。
まず、各デバイスにIPv6 Link-localアドレスが付与されているか確認します。
//spine-1
lab@spine-1# run show interfaces terse
Interface Admin Link Proto Local Remote
ge-0/0/0 up up
ge-0/0/0.0 up up inet
inet6 fe80::5201:ff:fe07:1/64
multiservice
<snip>
ge-0/0/1 up up
ge-0/0/1.0 up up inet
inet6 fe80::5201:ff:fe07:2/64
multiservice
<snip>//leaf-1
lab@leaf-1# run show interfaces terse
Interface Admin Link Proto Local Remote
ge-0/0/0 up up
ge-0/0/0.0 up up inet
inet6 fe80::5201:ff:fe08:1/64
multiservice
<snip>//leaf-2
lab@leaf-2# run show interfaces terse
Interface Admin Link Proto Local Remote
ge-0/0/0 up up
ge-0/0/0.0 up up inet
inet6 fe80::5201:ff:fe09:1/64
multiservice
<snip>各インターフェイスにIPv6 Link-localアドレスが付与されてますね。
続いてIPv6ネイバー情報を確認します。
対向デバイスのIPv6 Link-localアドレスが検出できているか確認します。
//spine-1 lab@spine-1# run show ipv6 neighbors IPv6 Address Linklayer Address State Exp Rtr Secure Interface fe80::5201:ff:fe08:1 50:01:00:08:00:01 reachable 24 yes no ge-0/0/0.0 fe80::5201:ff:fe09:1 50:01:00:09:00:01 reachable 20 yes no ge-0/0/1.0 Total entries: 2
//leaf-1 lab@leaf-1# run show ipv6 neighbors IPv6 Address Linklayer Address State Exp Rtr Secure Interface fe80::5201:ff:fe07:1 50:01:00:07:00:01 reachable 11 yes no ge-0/0/0.0
//leaf-2 lab@leaf-2# run show ipv6 neighbors IPv6 Address Linklayer Address State Exp Rtr Secure Interface fe80::5201:ff:fe07:2 50:01:00:07:00:02 reachable 22 yes no ge-0/0/0.0
ちゃんと検出できますね。
続いて、BGPのPeering状況を確認します。
//spine-1 lab@spine-1# run show bgp summary <snip> fe80::5201:ff:fe08:1%ge-0/0/0.0 4200001001 214 212 0 0 1:34:05 Establ inet.0: 1/1/1/0 inet6.0: 0/0/0/0 fe80::5201:ff:fe09:1%ge-0/0/1.0 4200001002 214 212 0 0 1:34:05 Establ inet.0: 1/1/1/0 inet6.0: 0/0/0/0
//leaf-1 lab@leaf-1# run show bgp summary <snip> fe80::5201:ff:fe07:1%ge-0/0/0.0 4200000001 215 214 0 0 1:34:53 Establ inet.0: 2/2/2/0 inet6.0: 0/0/0/0
//leaf-2 lab@leaf-2# run show bgp summary <snip> fe80::5201:ff:fe07:2%ge-0/0/0.0 4200000001 216 215 0 0 1:35:21 Establ inet.0: 2/2/2/0 inet6.0: 0/0/0/0
各ネイバーともEstablishedになってますね!
次に、各デバイスのLoopbackアドレスを学習しているか確認します。
//spine-1
lab@spine-1# run show route
inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
Limit/Threshold: 1048576/1048576 destinations
+ = Active Route, - = Last Active, * = Both
172.16.0.1/32 *[Direct/0] 01:38:27
> via lo0.0
172.16.0.11/32 *[BGP/170] 01:37:52, localpref 100
AS path: 4200001001 I, validation-state: unverified
> to fe80::5201:ff:fe08:1 via ge-0/0/0.0
172.16.0.12/32 *[BGP/170] 01:37:52, localpref 100
AS path: 4200001002 I, validation-state: unverified
> to fe80::5201:ff:fe09:1 via ge-0/0/1.0
<snip>//leaf-1
lab@leaf-1# run show route
inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
Limit/Threshold: 1048576/1048576 destinations
+ = Active Route, - = Last Active, * = Both
172.16.0.1/32 *[BGP/170] 01:38:21, localpref 100
AS path: 4200000001 I, validation-state: unverified
> to fe80::5201:ff:fe07:1 via ge-0/0/0.0
172.16.0.11/32 *[Direct/0] 01:38:58
> via lo0.0
172.16.0.12/32 *[BGP/170] 01:38:21, localpref 100
AS path: 4200000001 4200001002 I, validation-state: unverified
> to fe80::5201:ff:fe07:1 via ge-0/0/0.0
<snip>//leaf-2
lab@leaf-2# run show route
inet.0: 3 destinations, 3 routes (3 active, 0 holddown, 0 hidden)
Limit/Threshold: 1048576/1048576 destinations
+ = Active Route, - = Last Active, * = Both
172.16.0.1/32 *[BGP/170] 01:38:49, localpref 100
AS path: 4200000001 I, validation-state: unverified
> to fe80::5201:ff:fe07:2 via ge-0/0/0.0
172.16.0.11/32 *[BGP/170] 01:38:49, localpref 100
AS path: 4200000001 4200001001 I, validation-state: unverified
> to fe80::5201:ff:fe07:2 via ge-0/0/0.0
172.16.0.12/32 *[Direct/0] 01:39:26
> via lo0.0
<snip>Loopbackアドレスを学習できてますね!!
Routing Table EntryのLoopbackアドレスはIPv4ですが、ネクストホップアドレスはIPv6であることも確認できます。
最後にPingを飛ばしてみます。
//spine-1 [edit] lab@spine-1# run ping 172.16.0.11 source 172.16.0.1 rapid count 10 PING 172.16.0.11 (172.16.0.11): 56 data bytes !!!!!!!!!! --- 172.16.0.11 ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.483/0.795/1.178/0.175 ms [edit] lab@spine-1# run ping 172.16.0.12 source 172.16.0.1 rapid count 10 PING 172.16.0.12 (172.16.0.12): 56 data bytes !!!!!!!!!! --- 172.16.0.12 ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.644/0.866/1.040/0.102 ms
//leaf-1 [edit] lab@leaf-1# run ping 172.16.0.1 source 172.16.0.11 rapid count 10 PING 172.16.0.1 (172.16.0.1): 56 data bytes !!!!!!!!!! --- 172.16.0.1 ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.754/0.916/1.243/0.136 ms [edit] lab@leaf-1# run ping 172.16.0.12 source 172.16.0.11 rapid count 10 PING 172.16.0.12 (172.16.0.12): 56 data bytes !!!!!!!!!! --- 172.16.0.12 ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max/stddev = 1.224/1.575/1.852/0.199 ms
//leaf-2 [edit] lab@leaf-2# run ping 172.16.0.1 source 172.16.0.12 rapid count 10 PING 172.16.0.1 (172.16.0.1): 56 data bytes !!!!!!!!!! --- 172.16.0.1 ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.671/0.762/1.253/0.166 ms [edit] lab@leaf-2# run ping 172.16.0.11 source 172.16.0.12 rapid count 10 PING 172.16.0.11 (172.16.0.11): 56 data bytes !!!!!!!!!! --- 172.16.0.11 ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max/stddev = 1.369/1.736/2.191/0.275 ms
Pingが飛びました!!!
これで無事にBGP Auto-Discovered Neighbors機能にてUnderlayネットワークが構築できました!!
ちなみにこの後、OverlayネットワークやVXLAN設定をした後、ホスト間にて通信もできています。
EVPN NLRIのネクストホップアドレスも同様にIPv6 Link-localアドレスになります。
一例としてspine-1のshow routeを載せときます。
//spine-1
lab@spine-1# run show route
<snip>
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:12, localpref 100, from 172.16.0.11
AS path: 4200001001 I, validation-state: unverified
> to fe80::5201:ff:fe08: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:12, localpref 100, from 172.16.0.12
AS path: 4200001002 I, validation-state: unverified
> to fe80::5201:ff:fe09:1 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:12, localpref 100, from 172.16.0.11
AS path: 4200001001 I, validation-state: unverified
> to fe80::5201:ff:fe08: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:12, localpref 100, from 172.16.0.12
AS path: 4200001002 I, validation-state: unverified
> to fe80::5201:ff:fe09:1 via ge-0/0/1.0, Push 625
3:172.16.0.11:1::10012::172.16.0.11/248 IM
*[BGP/170] 01:54:40, localpref 100, from 172.16.0.11
AS path: 4200001001 I, validation-state: unverified
> to fe80::5201:ff:fe08:1 via ge-0/0/0.0
3:172.16.0.12:1::10012::172.16.0.12/248 IM
*[BGP/170] 01:54:38, localpref 100, from 172.16.0.12
AS path: 4200001002 I, validation-state: unverified
> to fe80::5201:ff:fe09:1 via ge-0/0/1.0設定を行えばIPv6 Link-localアドレスの付与~BGP Peeringまで行われることが確認できました。
では、デバイス間ではどんなやりとりを行っているのか、パケットキャプチャーをしてもう少し詳しく確認してみます。
で、実際にspine-1 ge-0/0/0~leaf-1 ge-0/0/0間のパケットキャプチャーがこちらになります。

パっと見、TCP 3Wayハンドシェイク後にBGPでなんやかんやしてる感じですね(適当)
細かく見ていきます。
まずは最初のRouter Advertisementから。

Router Advertisementにて自身のIPv6 Link-localアドレスを広報しているようです。
それで知り得た相手のIPv6 Link-localアドレス宛にBGP(のTCP)セッションを開始してます。
その後のBGP OPENメッセージを確認します。

最後のOptional ParameterにてExtended Next Hop EncodingというCapabilityが確認できます。
このパラメーターで、IPv6なネクストホップアドレスとしたIPv4なNLRIをサポートしていることを通知します。
ちなみに、My ASが23456となってますが、これは4Byte ASを通知する際の予約されたASNとなります。
(ツリーを閉じてますが、別のOptional ParameterのSupport for 4-octect AS number Capabilityにて設定したASNを通知してます)
最後にleaf-1から送信されたBGP UPDATEメッセージを確認します。

一番下のPath Attribute情報から自身のLoopbackアドレス(172.16.0.11/32)をIPv4 NLRIとして通知しています。
そして、Next hopはIPv6 Link-localアドレスとなっており、Extended Next Hop Encodingが有効になってそうですね。
という訳で今回は以上です!!!
ここまでお読み頂きありがとうございました!!!!
4. 参考資料
書籍「Deploying Juniper Data Centers with EVPN VXLAN」
Juniper Networks Documentation - BGP User Guide - BGP Auto-Discovered Neighborswww.juniper.net