BGP local-as, no-prepend, replace-as, dual-as

Egy újabb, sokaknak nehézséget okozó témát veszünk ma elő (az előző ilyen a Private VLAN volt, azt elolvashatod IDE kattintva), ez pedig nem más, mint BGP-nél a local-as, local-as no-prepend, replace–as, dual-as.

A topológia kiindulásként az alábbi lesz:

 

 

basic

 

GNS3-ban ez így néz ki:
gns3

 

Nézzük a működő alap konfigurációkat. Dinamikus IGP-t most nem használok, a szükséges subnetek elérését statikus routing segítségével oldom meg.

 

R1


!
interface Loopback0
 ip address 1.1.1.1 255.255.255.255
!
interface FastEthernet0/0
 ip address 10.0.12.1 255.255.255.0
 duplex auto
 speed auto
!
router bgp 12
 no synchronization
 bgp log-neighbor-changes
 network 1.1.1.1 mask 255.255.255.255
 neighbor 2.2.2.2 remote-as 12
 neighbor 2.2.2.2 update-source Loopback0
 no auto-summary
!
ip route 2.2.2.2 255.255.255.255 10.0.12.2

 

R2


!
interface Loopback0
 ip address 2.2.2.2 255.255.255.255
!
interface FastEthernet0/0
 ip address 10.0.12.2 255.255.255.0
 duplex auto
 speed auto
!
interface FastEthernet0/1
 ip address 10.0.23.2 255.255.255.0
 duplex auto
 speed auto
!
router bgp 12
 no synchronization
 bgp log-neighbor-changes
 network 2.2.2.2 mask 255.255.255.255
 neighbor 1.1.1.1 remote-as 12
 neighbor 1.1.1.1 update-source Loopback0
 neighbor 1.1.1.1 next-hop-self
 neighbor 3.3.3.3 remote-as 34
 neighbor 3.3.3.3 ebgp-multihop 2
 neighbor 3.3.3.3 update-source Loopback0
 no auto-summary
!
ip route 1.1.1.1 255.255.255.255 10.0.12.1
ip route 3.3.3.3 255.255.255.255 10.0.23.3

 

R3



!
interface Loopback0
 ip address 3.3.3.3 255.255.255.255
!
interface FastEthernet0/0
 ip address 10.0.34.3 255.255.255.0
 duplex auto
 speed auto
!
interface FastEthernet0/1
 ip address 10.0.23.3 255.255.255.0
 duplex auto
 speed auto
!
router bgp 34
 no synchronization
 bgp log-neighbor-changes
 network 3.3.3.3 mask 255.255.255.255
 neighbor 2.2.2.2 remote-as 12
 neighbor 2.2.2.2 ebgp-multihop 2
 neighbor 2.2.2.2 update-source Loopback0
 neighbor 4.4.4.4 remote-as 34
 neighbor 4.4.4.4 update-source Loopback0
 neighbor 4.4.4.4 next-hop-self
 no auto-summary
!
ip route 2.2.2.2 255.255.255.255 10.0.23.2
ip route 4.4.4.4 255.255.255.255 10.0.34.4
!

 

R4


!
interface Loopback0
 ip address 4.4.4.4 255.255.255.255
!
interface FastEthernet0/0
 ip address 10.0.34.4 255.255.255.0
 duplex auto
 speed auto
!
router bgp 34
 no synchronization
 bgp log-neighbor-changes
 network 4.4.4.4 mask 255.255.255.255
 neighbor 3.3.3.3 remote-as 34
 neighbor 3.3.3.3 update-source Loopback0
 no auto-summary
!
ip forward-protocol nd
ip route 3.3.3.3 255.255.255.255 10.0.34.3
!
!

 

A szükséges route-k látszanak a BGP táblában, pingelni is lehet R1-R4 Lo0 interface-k között.

 

R1#sh ip bgp
BGP table version is 6, local router ID is 1.1.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
 r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

Network Next Hop Metric LocPrf Weight Path
*> 1.1.1.1/32 0.0.0.0 0 32768 i
r>i2.2.2.2/32 2.2.2.2 0 100 0 i
*>i3.3.3.3/32 2.2.2.2 0 100 0 34 i
*>i4.4.4.4/32 2.2.2.2 0 100 0 34 i
R1#
R1#
R1#
R1#
R1#ping 4.4.4.4 so lo0

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 4.4.4.4, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 92/94/96 ms
R1#

 

1.) local-as

 

Tegyük fel, hogy AS12-nek meg kell változtatni az Autonomous System számát – legyen ez a példa kedvéért a továbbiakban 30000. Ez AS-en belül viszonylag könnyen megoldható, de mi van a külső BGP peerekkel? Tegyük fel, hogy R2 még 100 másik eBGP kapcsolatot tart fent különböző szolgáltatókkal. Egyszerre, egy időben mind a 100 routert át fogják állítani? Nem. A mi példánkban AS34-nek is át kell állítani a BGP neighbor konfigurációt R2 felé. Itt jön képbe a local-as.

Ezzel a megoldással az új AS számunkat “behazudhatjuk” az eBGP peernek. Ne feledjük, hogy csak egy BGP process futhat egy routeren (esetünkban AS12 – nem állíthatjuk át a “router bgp 12”-t csak úgy “router bgp 30000”-re, mert akkor totálisan elvágjuk magunkat a külvilágtól).

De a “local-as” segít: R3 felé azt fogjuk hazudni, hogy AS30000 vagyunk, de valójában még mindig AS12-ben ülünk.

A konfiguráció a következő:

 

R2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)#router bgp 12
R2(config-router)#neighbor 3.3.3.3 local-as 30000
R2(config-router)#end
R2#

 

Ahogy várható volt, szétesett a BGP:

 

R2#
*Mar 1 01:22:19.023: %BGP-5-ADJCHANGE: neighbor 3.3.3.3 Down Local AS change
*Mar 1 01:22:19.031: %SYS-5-CONFIG_I: Configured from console by console
R2#
*Mar 1 01:22:43.051: %BGP-3-NOTIFICATION: received from neighbor 3.3.3.3 2/2 (peer in wrong AS) 2 bytes 7530
R2#

 

Megkérjük hát a szolgáltatót, hogy állítson át minket AS30000-be.

 

Bónusz kérdés előtte: honnan tudja R3, hogy R2 melyik AS-ben van anélkül, hogy rákérdezne a másik oldalt üzemeltető mérnöktől?

 

Nézzük a syslogot R3-ról:

R3#
*Mar 1 01:21:02.951: %BGP-3-NOTIFICATION: sent to neighbor 2.2.2.2 2/2 (peer in wrong AS) 2 bytes 7530
R3# FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 002D 0104 7530 00B4 0202 0202 1002 0601 0400 0100 0102 0280 0002 0202 00
R3#
*Mar 1 01:21:44.251: %BGP-3-NOTIFICATION: sent to neighbor 2.2.2.2 2/2 (peer in wrong AS) 2 bytes 7530
R3# FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 002D 0104 7530 00B4 0202 0202 1002 0601 0400 0100 0102 0280 0002 0202 00
R3#
R3#

 

Ebben kódolva van a remote-as, mégpedig itt:

 

*Mar 1 01:21:44.251: %BGP-3-NOTIFICATION: sent to neighbor 2.2.2.2 2/2 (peer in wrong AS) 2 bytes 7530

 

hex 7530 = 30000 dec, ami pont R2 local-as száma 🙂

 

Egy Wireshark capture a BGP OPEN üzenetről, amelyben látjuk, hogy a mi küldött AS számunk 30000 R3 felé, annak ellenére, hogy továbbra is a “router bgp 12” konfig van érvényben R2-n:

 

bgp_local_as_30000

 

A konfiguráció változás R3-n, hogy visszajöjjön a neighborship:

 

R3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#router bgp 34
R3(config-router)#neigh 2.2.2.2 remote-as 30000
R3(config-router)#end
R3#

 

És a BGP fel is jött.

 

R2#
*Mar 1 01:36:14.435: %BGP-5-ADJCHANGE: neighbor 3.3.3.3 Up
R2#

 

R3 hogy látja most az R2 által hirdetett BGP route-kat?

 

R3#sh ip bgp | i 2.2.2.2
*> 1.1.1.1/32 2.2.2.2 0 30000 12 i
r> 2.2.2.2/32 2.2.2.2 0 0 30000 12 i
R3#

 

Vegyünk észre egy fontos dolgot: R2 két AS_PATH attribútumot tesz a hirdetett eBGP route-khoz: AS12, AS30000 (fő AS és local-as). Ez egy routing loopot megelőzendő eljárás, hiszen ha több eBGP neighbor van, akkor R2 visszahallhatná a saját route-jait más peerektől, és mivel a local-as AS30000 csak R3 felé van konfigurálva, mástól R2 elfogadná a saját maga által hirdetett route-kat. Ezt megelőzendő, R2 beleteszi az eredeti és a local-as számot is az Update üzeneteibe.

Ahogy azt sejthető, R1/R2 szintén látja a local-as-t a BGP route-knál:

 

R1#sh ip bgp | i 2.2.2.2
r>i2.2.2.2/32 2.2.2.2 0 100 0 i
*>i3.3.3.3/32 2.2.2.2 0 100 0 30000 34 i
*>i4.4.4.4/32 2.2.2.2 0 100 0 30000 34 i
R1#

 

Lerajzolva én ezt úgy szoktam ábrázolni, mintha a local-as egy külön “transit” AS lenne. Azaz így:

 

localas

 

2.) local-as no-prepend

 

Kezdjük mindjárt egy gyakori félreértéssel: a local-as no-prepend nem a küldött, hanem a fogadott route-kra vonatkozik. Azaz R3 továbbra is látja majd AS 30000-t és AS 12-t, R1 viszont nem látja AS 30000-t az R2-től érkező route-k esetében. Azaz R2 nem teszi hozzá a local-as eBGP neighbortől érkező route-khoz a saját local-as számát.

A szükséges konfiguráció módosítás:

 

R2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)#router bgp 12
R2(config-router)#neighbor 3.3.3.3 local-as 30000 no-prepend
R2(config-router)#end
R2#
*Mar 1 01:48:36.087: %BGP-5-ADJCHANGE: neighbor 3.3.3.3 Down Local AS change
*Mar 1 01:48:36.403: %SYS-5-CONFIG_I: Configured from console by console
R2#
*Mar 1 01:48:44.051: %BGP-5-ADJCHANGE: neighbor 3.3.3.3 Up
R2#

 

R3-n semmi nem változik:

 

R3#sh ip bgp | i 2.2.2.2
*> 1.1.1.1/32 2.2.2.2 0 30000 12 i
r> 2.2.2.2/32 2.2.2.2 0 0 30000 12 i
R3#

 

Azonban R2/R1 routereken már nincs ott az AS 30000.

 

R2#sh ip bgp | i 3.3.3.3
r> 3.3.3.3/32 3.3.3.3 0 0 34 i
*> 4.4.4.4/32 3.3.3.3 0 34 i
R2#
R1#sh ip bgp | i 2.2.2.2
r>i2.2.2.2/32 2.2.2.2 0 100 0 i
*>i3.3.3.3/32 2.2.2.2 0 100 0 34 i
*>i4.4.4.4/32 2.2.2.2 0 100 0 34 i
R1#

 

Lerajzolva én ilyenkor a local-as-t áthelyezem a “másik oldalra”, azaz AS 34-be ez esetben.

 

localasnoprep

 

3.) local-as replace-as

 

Lehetőségünk van arra, hogy R2 ne hirdesse R3 felé mindkét AS-t, hanem csak a local-as-t. Erre való a “replace-as” parancs. Ez esetben felülírjuk AS12-t AS30000-rel, azaz elrejtjük az eredeti AS-t.

Nézzük a gyakorlatban.

 

R2(config-router)#neighbor 3.3.3.3 local-as 30000 no-prepend replace-as
R2(config-router)#
*Mar 1 01:55:22.035: %BGP-5-ADJCHANGE: neighbor 3.3.3.3 Down Local AS change
R2(config-router)#
*Mar 1 01:55:49.043: %BGP-5-ADJCHANGE: neighbor 3.3.3.3 Up
R2(config-router)#

 

Fontos, hogy a “replace-as” csak a “local-as no-prepend” parancs után adható ki. Azaz R1 továbbra is ugyanazt az AS_PATH listát látja, mint előbb, R3 viszont már csak AS30000-t.

 

R1#sh ip bgp | i 2.2.2.2
r>i2.2.2.2/32 2.2.2.2 0 100 0 i
*>i3.3.3.3/32 2.2.2.2 0 100 0 34 i
*>i4.4.4.4/32 2.2.2.2 0 100 0 34 i
R1#
R3#sh ip bgp | i 2.2.2.2
*> 1.1.1.1/32 2.2.2.2 0 30000 i
r> 2.2.2.2/32 2.2.2.2 0 0 30000 i
R3#

 

Ezt úgy érdemes lerajzolni, hogy a local-as “megeszi” a fő AS-t 🙂

 

replaceas

4.) dual-as

 

Ez az utolsó opció. Lehetőségünk van arra, hogy mindkét AS-t elküldjük 1-1 BGP külön OPEN üzenetben, és a másik oldaltól függ, hogy melyikkel épül fel a BGP neighborship.

Ahogy a “replace-as” esetében is, itt is csak a teljes parancs működik, nincs olyan pl. hogy local-as replace-as.

Nézzük a konfigot és a packet capture-t.

 

R2(config-router)#neighbor 3.3.3.3 local-as 30000 no-prepend replace-as dual-as

 

Mivel R3 AS30000-t vár, ezzel a küldött AS-sel épül fel a neighborship.

 

R3#
*Mar 1 02:00:01.951: %BGP-3-NOTIFICATION: sent to neighbor 2.2.2.2 2/2 (peer in wrong AS) 2 bytes 000C
R3# FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 002D 0104 000C 00B4 0202 0202 1002 0601 0400 0100 0102 0280 0002 0202 00
R3#
*Mar 1 02:00:44.203: %BGP-5-ADJCHANGE: neighbor 2.2.2.2 Up

 

Ez esetben az R1-en és R3-n látott AS_PATH list nem változik a replace-as-hez képest.

 

 

dualas

 

 

bgp_dual_as_open

 

bgp_dual_as_open_as12

 

bgp_dual_as_open_as30000

 

 

Sajnos elég piciben exportálta ki a rajzokat a Visio, ezért megosztom veletek PDF-ben az eredeti rajzokat. Letölthető INNEN.