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:
GNS3-ban ez így néz ki:
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:
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:
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.
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 🙂
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.
Sajnos elég piciben exportálta ki a rajzokat a Visio, ezért megosztom veletek PDF-ben az eredeti rajzokat. Letölthető INNEN.