Laborator 12. Protocolul BGP

Cunoștințe și abilități ce vor fi dobândite

  • Configurare eBGP.
  • Configurare iBGP.
  • Factori economici în rutarea dintre AS-uri.
  • Internet eXchange Points (IXP).

Pregătire infrastructură de laborator

  • În cadrului laboratorului se va lucra cu suita FRRouting în cadrul unei infrastructuri virtualizate folosind Docker și Open vSwitch.
  • Veți lucra în echipe de 2-3 studenți, conform indicațiilor asistentului.
  • Pentru conectarea la infrastructură se va folosi comanda de mai jos.
ssh -J your_user.here@fep.grid.pub.ro -p 2000+X root@10.9.2.74

Introducere

Internetul din ziua de azi este compus din peste 45,000 de rețele diferite numite Autonomous Systems (AS). Un AS este reprezentat de un set de rețele ce aparțin aceleiași organizații sau țări. Exemple mari de AS-uri sunt Google, Facebook, Sprint. Chiar și RoEduNet este un AS. Aici găsiți o hartă interactivă cu AS-urile prezente în momentul de față in internet, iar aici găsiți detalii despre AS2614 (AARNIEC / RoEduNet).

AS-urile pot fi împărțite în două clase mari, AS-uri de tranzit și stub. Un AS stub primește/trimite pachete în care sursa sau destinația sunt IP-uri din acest domeniu (e.g. RDS va primi/trimite pachete în care sursa sau destinația în header-ul IP este un IP pe care RDS îl deține). În schimb, un AS de tranzit este un AS care oferă servicii de rutare altor domenii. Mai exact, într-un AS de tranzit sunt pachete a căror sursă și destinație nu aparțin neapărat AS-ului. Astăzi, peste 85% dintre AS-uri sunt de tip stub. În imaginea de mai jos 22, 87264, 57 și 4561 sunt stub, iar restul sunt tranzit. Mai mult de atât, AS-urile 57 și 87264 sunt multihomed.

Internet eXchange Points (IXP)

O soluție folosită astăzi pentru a permite unui număr mare de AS-uri să se interconecteze este crearea de Internet eXchange Points (IXP). În general, un IXP reprezintă o grupare de routere, aparținând unor AS-uri diferite, colocate și interconectate într-o locație neutră, precum un datacenter. Practic, pentru fiecare AS care vrea să participe la interconectare, va exista un router în acest datacenter care e legat la AS-ul din care acesta face parte și la un switch din datacenter (vor fi în același LAN și vor putea trimite informații între ele). La acesta sunt legate și alte routere din domenii care vor să se interconecteze.

Factorul economic

În primele zile ale internetului, domenilor schimbau între ele toate rutele știute. Totuși, internetul din ziua de azi are la baza factorul economic. Între AS-uri există mai multe tipuri de relații economice:

  • customer - provider
  • shared-cost peering

În imaginea de mai sus, AS7 plătește AS4 pentru a îl folosi ca un AS de tranzit. Legăturile cu $ sunt de tip customer → provider. În schimb legăturile mov sunt de tip shared-cost peering. De exemplu, AS3 și AS4 ambele plătesc AS1 pentru a îl folosi ca AS de tranzit. Astfel, entitățile care dețin AS3 și AS4 pot alege să facă peering între ele și să plătească doar un link cu AS1.

Protocolul BGP

În ziua de astăzi este folosit un singur protocol pentru rutare între AS-uri, Border Gateway Protocol (BGP). BGP rulează peste TCP și este un protocol de tip path vector (vectorul distanțelor, similar cu RIP). Fiecare AS este reprezentat de un ID (integer) unic. În cazul anunțurilor de rute, BGP anunță un prefix, cât și drumul până la acesta. Acest drum reprezintă o listă de AS-uri. Astfel este evitată problema numărării la infinit.

În mod istoric, BGP este un protocol care se baza pe încredere. Acest lucru a făcut posibile incidente precum:

În prezent, se încearcă adoptarea RPKI pentru validarea folosind certificate a update-urilor BGP.

Tipuri de mesaje
  • OPEN: mesajul de OPEN este trimis imediat ce conexiunea TCP dintre două routere este realizată. Acest mesaj inițializează sesiunea BGP și facilitează negocierea mai multor opțiuni pentru protocol.
  • NOTIFICATION: mesajul NOTIFICATION este folosit pentru a închide sesiuni BGP. În general, acest mesaj este trimis atunci când apar erori.
  • UPDATE: mesajul este folosit pentru a anunța noi rute sau modificări la rutele existente. Spre deosebire de alți algoritmi de tip vector distance, BGP trimite doar update-uri cu schimbări, nu întreaga tabelă de rutare la fiecare update.
  • KEEPALIVE: mesajul este trimis regulat și este folosit pentru a confirma că routerul peer este conectat. În cazul în care pentru o perioadă de 90 de secunde nu primim un mesaj de tip KEEPALIVE de la un peer, înseamnă că sesiunea este down și trebuie să anunțăm retragerea tuturor rutelor prin acest peer.

Găsiți un exemplu de captură de mesaje BGP în următoarea captură de pe Cloudshark.

Extensii BGP

În implementarea protocolului, pentru a fi mai ușor de configurat, avem două mari extensii:

  • External Border Gateway Protocol (eBGP) - Extensie a protocolului BGP folosit pentru comunicarea în exteriorul unui AS.
  • Interior Border Gateway Protocol (iBGP) - Extensie a protocolului BGP folosit pentru comunicarea în interiorul unui AS. Practic, rutele care sunt aflate folosind EBGP vor fi sumarizate în AS folosind iBGP.

Topologie

În topologia laboratorului curent, fiecare grupă va administra un AS cu un spațiu de adrese de forma X.0.0.0/8, unde X este numărul grupei. Acest spațiu de adrese este împărțit conform topologiei de mai jos, astfel:

  • Legătura cu IXP-ul va avea un IP din rețeaua 180.22.0.0/24, de forma 180.22.0.X, unde X este numărul grupei / AS-ului. Spre exemplu, AS 13 va avea pe interfața către IXP IP-ul 180.22.0.13. IXP-ul va avea IP-ul 180.22.0.22.
  • Subrețeaua dintre LOND și PARI va folosi spațiul X.0.1.0/24
    • X.0.1.1 pentru LOND
    • X.0.1.2 pentru PARI
  • Subrețeaua dintre LOND și BERL va folosi spațiul X.0.2.0/24
    • X.0.2.2 pentru LOND
    • X.0.2.1 pentru PARI
  • Subrețeaua dintre PARI și BUCH va folosi spațiul X.0.3.0/24
    • X.0.3.1 pentru PARI
    • X.0.3.2 pentru BUCH
  • Subrețeaua dintre BERL și BUCH va folosi spațiul X.0.4.0/24
    • X.0.4.2 pentru BERL
    • X.0.4.1 pentru BUCH
  • Subrețeaua dintre BUCH și host va folosi spațiul de adrese X.104.0.0/24

Mai mult, fiecare router va avea configurate următoarele adrese de loopback:

  • X.151.0.1 pentru LOND
  • X.152.0.1 pentru PARI
  • X.153.0.1 pentru BERL
  • X.154.0.1 pentru BUCH

Exerciții

00. Completare formular de feedback

Vă invităm să evaluați activitatea echipei de RL și să precizați punctele tari și punctele slabe și sugestiile voastre de îmbunătățire a materiei. Feedback-ul vostru este foarte important pentru noi să creștem calitatea materiei în anii următori și să îmbunătățim materiile pe care le veți face în continuare.

Găsiți formularul de feedback în partea dreaptă a paginii principale de RL de pe curs.pub.ro într-un frame numit FEEDBACK.

Vă mulțumim!

01. [10p] Conectare la infrastructură

În cadrul laboratorului veți lucra în echipe. Fiecare echipa va administra propria rețea virtuală. La începutul laboratorului veți primi un număr de grupa și parolă de ssh pentru acces la rețeaua voastră. Pool-ul de adrese asociat rețelei va fi sub formă <număr grupa>.0.0.0/8. Fiecare echipă are acces la rețea printr-un container bastion. Pentru a accesa acest container puteți folosi comanda:

ssh -J your_user.here@fep.grid.pub.ro -p 2000+<număr grupă> root@10.9.2.74

De exemplu, studentul John Smith din grupa 11 se va conecta folosind:

ssh -J john.smith@fep.grid.pub.ro -p 2011 root@10.9.2.74

O dată conectați vă veți afla pe container-ul bastion (“ssh”), de aici puteți apela scriptul ./goto.sh pentru a vă conecta la routere și host-uri. De exemplu, pentru a vă conecta la routerul BUCH veți apela:

./goto.sh BUCH router

Această comandă vă va oferi acces la terminalul router-ului, cu o interfață similară cu cea CISCO IOS.

Reminder comenzi generice

  • configure terminal - intră în modul de configurare; orice comandă dată în modul de configurare va fi aplicată asupra router-ului.
  • ping <destination> - trimite pachete de tip ICMP către <destination>.
  • traceroute <destination> - afișează calea pe care o ia un pachet pentru a ajunge la <destination>.
  • exit - iese din modul curent de configurare.

Pentru a accesa host-ul conectat la router-ul BUCH veți apela:

./goto.sh BUCH host

02. [20p] Configurare eBGP

Vom configura eBGP pe router-ul LOND. Vom exporta către IXP rețeaua noastră (X.0.0.0/8) și vom importa tot ce primim de la IXP. IXP-ul este configurat astfel încât să exporte toate rutele primite de la AS-urile vecine. Pentru conectarea la IXP vom folosi rețeaua 180.22.0.0/24.

Pentru a activa și configura procesul de BGP al router-ului vom folosi comanda de mai jos:

LOND_router# configure terminal
LOND_router(config)# router bgp <X>
LOND_router(config-router)#

unde <X> este numărul grupei/AS-ului. Observăm schimbarea prompt-ului, sugerând modul de configurare actual.

În general, avem opțiunea să configurăm un router-id. Acest lucru poate influența criteriile de alegere a rutei în BGP. Pentru moment, nu e neapărat necesar, dar îl vom seta ca fiind IP-ul către IXP. Pe interfața ixp_22 (către IXP) a router-ului LOND este deja configurată o adresă IP. Pentru a afla adresele IP de pe interfețe putem folosi comanda de mai jos:

LOND_router# show interface brief
Interface       Status  VRF             Addresses
---------       ------  ---             ---------
dns_<X>         up      default         198.0.0.<X>/24
ixp_22          up      default         180.22.0.<X>/24
lo              up      default         <X>.151.0.1/24
port_BERL       up      default         <X>.0.2.2/24
port_PARI       up      default         <X>.0.1.1/24
ssh             up      default         158.<X>.10.1/16

LOND_router#

Pentru a folosi comenzi de tipul show fără a părăsi modul de configurare actual, acestea pot fi prefixate cu do.

LOND_router(config-router)# do show interface brief
Interface       Status  VRF             Addresses
---------       ------  ---             ---------
dns_<X>         up      default         198.0.0.<X>/24
ixp_22          up      default         180.22.0.<X>/24
lo              up      default         <X>.151.0.1/24
port_BERL       up      default         <X>.0.2.2/24
port_PARI       up      default         <X>.0.1.1/24
ssh             up      default         158.<X>.10.1/16

LOND_router(config-router)#

Pentru a seta router-id-ul, vom folosi comanda bgp router-id A.B.C.D, astfel:

LOND_router(config-router)# bgp router-id 180.22.0.<X>
LOND_router(config-router)#

În continuare, va trebui să configurăm vecinul la care ne conectăm (IXP-ul). Urmăriți documentația comenzii și configurați IXP-ul ca peer.

Hint

IXP-ul este în AS-ul 22 și are adresa IP 180.22.0.22.

În final, va trebui să configurăm rețeaua pe care vrem să o exportăm. Urmăriți documentația comenzii pentru a exporta rețeaua <X>.0.0.0/8.

Putem verifica starea procesului de BGP astfel:

LOND_router(config-router)# do show bgp summary

IPv4 Unicast Summary:
BGP router identifier 180.22.0.1, local AS number 1 vrf-id 0
BGP table version 1
RIB entries 1, using 192 bytes of memory
Peers 1, using 14 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
180.22.0.22     4         22         6         5        0    0    0 00:02:51     (Policy) (Policy)

Total number of neighbors 1
LOND_router(config-router)#

Putem observa în dreptul coloanelor State/PfxRcd și PxfSnt textul (Policy). Acest lucru înseamnă că nu exportăm și nu importăm rute datorită lipsei filtrelor. Urmăriți documentația pentru a rezolva problema.

Hint

Pentru a anula efectul unei comenzi o putem prefixa cu no .

Pentru a reporni procesul de BGP putem folosi următoarea comandă:

LOND_router# clear bgp *
LOND_router#

Verificați iar starea procesului BGP.

LOND_router# show bgp summary

IPv4 Unicast Summary:
BGP router identifier 180.22.0.1, local AS number 1 vrf-id 0
BGP table version 2
RIB entries 3, using 576 bytes of memory
Peers 1, using 14 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
180.22.0.22     4         22        20        23        0    0    0 00:01:58            1        2

Total number of neighbors 1
LOND_router#

Verificați conectivitatea de pe router-ul LOND către un IP din AS 21 (este preconfigurat), sau către unul din IP-urile de pe router-ul LOND din AS-urile colegilor.

LOND_router# ping 21.0.2.2
PING 21.0.2.2 (21.0.2.2) 56(84) bytes of data.
64 bytes from 21.0.2.2: icmp_seq=1 ttl=64 time=10.3 ms
64 bytes from 21.0.2.2: icmp_seq=2 ttl=64 time=4.14 ms
64 bytes from 21.0.2.2: icmp_seq=3 ttl=64 time=4.13 ms
^C
--- 21.0.2.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 4.132/6.202/10.332/2.920 ms
LOND_router#

Afișați tabela de rutare și observați noua intrare obținută prin BGP.

LOND_router# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup

<...>
B>* 21.0.0.0/8 [20/0] via 180.22.0.21, ixp_22, weight 1, 00:05:57
<...>
LOND_router#

03. [20p] Configurare iBGP

În cadrul acestui exercițiu vom configura iBGP pe router-ele LOND și PARI.

Comenzile sunt similare, însă, de această dată, nu e nevoie să configurăm un router-id. De asemenea, vom folosi adresele interfețelor de loopback (lo) pentru a face peering cu router-ele din același AS.

Dacă vă întrebați cum putem avea conectivitate folosind adresele de loopback, acest lucru este posibil datorită faptului că pe routere rulează și protocolul OSPF, care este configurat să propage rute către aceste adrese de loopback.

PARI_router# show ip ospf route
============ OSPF network routing table ============
<...>
N    21.151.0.1/32         [1] area: 0.0.0.0
                           via 21.0.1.1, port_LOND
N    21.152.0.1/32         [0] area: 0.0.0.0
                           directly attached to lo
N    21.153.0.1/32         [2] area: 0.0.0.0
                           via 21.0.1.1, port_LOND
                           via 21.0.3.2, port_BUCH
N    21.154.0.1/32         [1] area: 0.0.0.0
                           via 21.0.3.2, port_BUCH
<...>

În general, o sesiune de BGP e stabilită pe interfața cea mai apropiată de vecin. Pentru ca rutele să fie acceptate, va trebui să schimbăm interfața sursă către cea de loopback.

Spre exemplu pentru a face peering între router-ele LOND și PARI vom da următoarele comenzi:

LOND_router# configure terminal
LOND_router(config)# router bgp <X>
LOND_router(config-router)# neighbor <X>.152.0.1 remote-as <X>
LOND_router(config-router)# neighbor <X>.152.0.1 update-source lo
LOND_router(config-router)#
PARI_router# configure terminal
PARI_router(config)# router bgp <X>
PARI_router(config-router)# neighbor <X>.151.0.1 remote-as <X>
PARI_router(config-router)# neighbor <X>.151.0.1 update-source lo
PARI_router(config-router)#

Mai multe informații despre acest mod de configurare găsiți aici.

Verificați dacă s-a realizat conexiunea BGP, folosind comanda show bgp summary.

04. [10p] Propagare corectă next-hop

În teorie, în urma comenzilor de le exercițiul anterior ar trebui să avem conectivitate de pe router-ul PARI către alte AS-uri. Realitatea este alta…

PARI_router# ping 21.0.2.2
ping: connect: Network unreachable
PARI_router#

Dacă ne uităm la output-ul comenzii show bgp summary putem observa că am primit totuși de la router-ul LOND rute (coloana State/PfxRcd).

PARI_router# show bgp sum

IPv4 Unicast Summary:
BGP router identifier <X>.152.0.1, local AS number <X> vrf-id 0
BGP table version 0
RIB entries 3, using 576 bytes of memory
Peers 1, using 14 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
<X>.151.0.1     4          2         5         6        0    0    0 00:00:54            2        0

Total number of neighbors 1
PARI_router#

Însă, dacă verificăm tabela de rutare, nu vom regăsi nicio rută către rețele din afara AS-ului nostru (spre exemplu, nu regăsim nicio rută către 21.0.0.0/8, spațiul de adrese al AS-ului preconfigurat).

PARI_router# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup

S>* 2.0.0.0/8 [1/0] unreachable (blackhole), weight 1, 02:06:23
O   2.0.1.0/24 [110/1] is directly connected, port_LOND, weight 1, 02:06:23
C>* 2.0.1.0/24 is directly connected, port_LOND, 02:06:23
O>* 2.0.2.0/24 [110/2] via 2.0.1.1, port_LOND, weight 1, 02:05:33
O   2.0.3.0/24 [110/1] is directly connected, port_BUCH, weight 1, 02:06:22
C>* 2.0.3.0/24 is directly connected, port_BUCH, 02:06:23
O>* 2.0.4.0/24 [110/2] via 2.0.3.2, port_BUCH, weight 1, 02:05:31
O   2.0.198.0/24 [110/10] is directly connected, matrix_2, weight 1, 02:06:25
C>* 2.0.198.0/24 is directly connected, matrix_2, 02:07:47
O>* 2.0.199.0/24 [110/11] via 2.0.3.2, port_BUCH, weight 1, 02:05:31
O>* 2.104.0.0/24 [110/11] via 2.0.3.2, port_BUCH, weight 1, 02:05:31
O>* 2.151.0.1/32 [110/1] via 2.0.1.1, port_LOND, weight 1, 02:05:33
C>* 2.152.0.0/24 is directly connected, lo, 02:06:24
O>* 2.152.0.1/32 [110/0] is directly connected, lo, weight 1, 02:06:23
O>* 2.153.0.1/32 [110/2] via 2.0.1.1, port_LOND, weight 1, 02:05:23
  *                      via 2.0.3.2, port_BUCH, weight 1, 02:05:23
O>* 2.154.0.1/32 [110/1] via 2.0.3.2, port_BUCH, weight 1, 02:05:31
C>* 158.2.0.0/16 is directly connected, ssh, 02:07:58
O>* 198.0.0.0/24 [110/11] via 2.0.1.1, port_LOND, weight 1, 02:05:33
PARI_router#

Acest lucru este cauzat de faptul că ruta învățată de router-ul LOND are ca next-hop adresa IP a IXP-ului (180.22.0.22), însă router-ele interne nu au o rută către această rețea. Rutele primite de la LOND sunt “undeva în memoria router-ului”, însă până când nu va avea o rută către next-hop ele nu vor fi în tabela de rutare.

Pe router-ul LOND putem folosi următoarea comandă pentru a propaga rutele, în iBGP, către router-ul PARI, cu adresa IP a interfeței de loopback ca next-hop.

LOND_router# configure terminal
LOND_router(config)# router bgp <X>
LOND_router(config-router)# address-family ipv4 unicast
LOND_router(config-router-af)# neighbor <X>.152.0.1 next-hop-self
LOND_router(config-router-af)#

Verificați iar tabela de rutare de pe router-ul PARI și incercați să dați ping în router-ul LOND din AS 21 (ping 21.0.2.2).

05. [30p] Configurare iBGP (cont.)

Repetați pașii de la exercițiul 03 pentru a configura iBGP astfel încât să existe relații de peering între toate router-ele. Pentru asta, va trebui să realizați configurații similare cu cele de la exercițiul 03 (configurat peer, activat peer, updatare IP sursă, propagare corectă next-hop acolo unde e cazul) pentru fiecare pereche de 2 routere din topologia AS-ului:

  • LOND - PARI (realizat la exercițiul 03)
  • LOND - BERL
  • LOND - BUCH
  • PARI - BUCH
  • PARI - BERL
  • BERL - BUCH

Recomandăm să vă împărțiți munca, fie per legătură (fiecare configurează câte 2-3 legături), fie per capete de legătură (pentru legătura LOND - BERL, unul din voi va configura router-ul LOND, iar celălalt router-ul BERL).

Testați conectivitatea către fiecare subrețea din AS 21 (21.0.1.0/8, 21.0.2.0/8, 21.0.3.0/8, 21.0.4.0/8) de pe aceste routere.

06. [10p] Conectivitate end-to-end

Faceți configurările necesare pe stația atașată la router-ul BUCH pentru a avea conectivitate la stațiile din celelalte AS-uri. Verificați conectivitatea (ping) cu stația din AS 21 (21.104.0.1) sau stațiile din AS-urile colegilor.

rl/labs/12.txt · Last modified: 2024/01/15 07:11 by vlad_iulius.nastase
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0