sabato 16 aprile 2016

BGP & SDN : Prima puntata - BGP Link-State

In questo post precedente, dove ho parlato del ruolo del BGP e di MPLS nell'era SDN, ho citato, parlando del ruolo di MPLS, che per determinare in maniera ottimale i percorsi tra due qualsiasi router, è necessario avere una visione completa della topologia della rete. 

E questo è possibile solo con un piano di controllo centralizzato, perché come noto, nelle applicazioni attuali, dove il piano di controllo è distribuito sui vari nodi della rete, non si riesce ad avere da parte dei singoli nodi una visione globale della topologia della rete. Si pensi ad esempio a un dominio di routing partizionato in aree OSPF. I router interni a un'area conoscono solo la topologia della propria area e non delle altre aree.

Lasciando da parte per il momento il problema della determinazione dei percorsi ottimi, in questo post affronterò il problema di come i nodi della rete possano "comunicare" a un controller centralizzato, l'intera topologia.

Illustrerò una soluzione in via di standardizzazione in IETF, ma già implementata nei router dei principali vendor, come Cisco e Juniper. La soluzione è basata sul BGP, ed è utilizzabile solo nel caso in cui la rete sottostante utilizzi un protocollo di routing di tipo Link-State (ossia, OSPF o IS-IS). Per questo è nota come BGP Link-State (BGP-LS) (NOTA: in qualche documento meno recente potreste trovare la vecchia nomenclatura BGP-TE, ossia BGP Traffic Engineering).

ASPETTI GENERALI
Per illustrare l'idea base del BGP-LS, farò riferimento alla figura seguente, che riporta un semplice dominio di routing OSPF, partizionato in tre aree.




L'idea del BGP-LS è molto semplice. Dapprima si realizzano delle sessioni BGP con una particolare address-family definita ad-hoc (di cui illustrerò alcuni dettagli nella prossima sezione). Nel caso di un dominio partizionato in aree, come quello della figura, le sessioni non possono essere realizzate tra due nodi qualsiasi, ma tra nodi in grado di fornire tutte le informazioni topologiche necessarie. 

Ad esempio, nella figura ho scelto un nodo dal quale ho stabilito una sessione BGP-LS verso il controller. Da questo nodo poi sono state stabilite due sessioni BGP-LS, la prima con uno dei due ABR tra l'area 1 e l'area 0, la seconda con uno dei due ABR tra l'area 2 e l'area 0. Attraverso queste due sessioni, il nodo centrale viene a conoscenza della topologia delle due aree 1 e 2, e poiché il nodo che ha la sessione con il controller conosce la topologia dell'area 0, ecco che questo è in grado di comunicare al controller l'intera topologia della rete.

Nel caso invece in cui il dominio di routing non sia partizionato in aree, è sufficiente una singola sessione BGP-LS tra un qualsiasi router e il controller (in realtà, nelle applicazioni pratiche le sessioni BGP-LS sono sempre ridondate).

Le informazioni topologiche veicolate non sono solo quelle classiche di OSPF, ma anche quelle apprese attraverso l'estensione di OSPF al Traffic Engineering MPLS (es. proprietà amministrative dei link, banda disponibile, banda residua, metriche IGP e TE, ecc.). Ricordo che queste informazioni aggiuntive vengono veicolate attraverso un nuovo LSA opaco (LSA di tipo 10), che ha ambito di propagazione la singola area (NOTA: nel caso IS-IS trovate tutto nel Capitolo 11 del libro, pubblicato in questo post).

Uno potrebbe chiedersi, ma perché scomodare il BGP per veicolare verso il controller le informazioni topologiche ? Non sarebbe stato sufficiente "prolungare" il dominio di routing includendo il controller, in modo che questo potesse avere una visione globale della topologia delle singole aree ? Ad esempio, nella figura sopra sarebbe stato sufficiente creare dei Tunnel GRE tra gli ABR e il controller e quindi stabilire su questi Tunnel delle adiacenze OSPF. Molto semplice e lineare, ma ...
  • Il controller dovrebbe implementare il codice sia di OSPF che di IS-IS. Questo perché in applicazioni al routing ottimo interdominio, un dominio di routing potrebbe utilizzare OSPF e l'altro IS-IS.
  • I protocolli IGP sono un po' troppo "chiacchieroni", inviano continuamente degli Hello, eseguono il flooding di LSA/LSP, ripetono i LSA/LSP (anche se con un periodo molto lungo), sottraendo così tempo di elaborazione alla CPU).
  • Nel caso di aree che sono distribuite su zone geografiche lontane, potrebbe essere un problema dove piazzare il controller.
L'utilizzo del BGP ha invece dei vantaggi, tra cui:
  • Il controller deve solo implementare il BGP.
  • Il BGP è tendenzialmente meno "chiacchierone" dei protocolli IGP.
  • Nel caso di routing interdominio, il BGP è il protocollo utilizzato per lo scambio delle informazioni di routing.
Questo è il BGP-LS, niente di speciale, ma solo una delle ormai innumerevoli applicazioni del BGP, che si riconferma anche in questo caso, come un protocollo "tuttofare". E ora vediamo alcuni dettagli.

BGP-LS: DETTAGLI DI FUNZIONAMENTO
Poiché l'obiettivo di BGP-LS è quello di ricostruire la topologia di un dominio di routing Link-State, deve avere un qualche modo per rappresentarla, per poi veicolare la topologia al controller, il quale non ha implementato alcun protocollo Link-State.

Le specifiche del protocollo sono definite nel draft IETF draft-ietf-idr-ls-distribution "North-Bound Distribution of Link-State and TE Information using BGP".

Le specifiche sono divise in due parti:
  • Definizione di un nuovo NLRI, che consiste di vari moduli di tipo TLV (Type-Length-Value), e che contiene informazioni su tre tipi di oggetti: nodi, link e prefissi IP (v4/v6). Con la combinazione di nodi e link viene comunicata la topologia, con i prefissi IP le informazioni di raggiungibilità.
  • Definizione di nuovi attributi BGP (solo per i cultori del BGP, di tipo optional non-transitive), attraverso i quali sono codificate informazioni associate agli oggetti di cui al punto precedente (nodi, link, prefissi IP). Ad esempio, informazioni tipo il nome dei nodi, le metriche IGP e TE, la banda residua, proprietà amministrative, ecc. . Anche i nuovi attributi BGP sono codificati utilizzando una moduli di tipo TLV.
Il BGP-LS utilizza l'estensione Multi-Protocollo del BGP (MP-BGP). Il supporto dell'address family BGP-LS viene negoziato attraverso le classiche BGP capabilities, nel messaggio BGP Open. Il codice AFI/SAFI che identifica l'address family BGP-LS è 16388/71.

Il formato generico del NLRI è riportato nella figura seguente (tratta dal draft IETF citato sopra), che contiene anche la codifica dei vari tipi di NLRI.












Il tipo 1 (Node NLRI) è sufficientemente auto-esplicativo. Come informazione contiene un identificativo del nodo (tipicamente il BGP Router-ID).

Il tipo 2 (Link NLRI) serve a definire un link della rete, dove ciascun link è identificato dai due nodi estremi. Un link è in realtà la composizione di due "mezzi-link" unidirezionali, e quindi per descrivere completamente un link sono necessari due messaggi BGP UPDATE con NLRI di tipo 2, ciascuno generato da uno dei due nodi agli estremi.

I tipi 3 e 4 (IPv4/IPv6 Topology Prefix NLRI) servono ad annunciare i prefissi direttamente connessi ai nodi.

Non riporto qui il formato dei vari tipi di NLRI, perché di scarso interesse pratico. I più curiosi possono consultare il draft, dove tutto è descritto con dovizia di particolari. 

Oltre ai nuovi NLRI, il draft introduce nuovi attributi BGP da associare ai vari BGP-LS NLRI. Questi attributi aggiuntivi sono necessari per trasportare informazioni aggiuntive relative ai nodi, link e prefissi IP. Tutti gli attributi sono codificati nel formato TLV.

  • Attributi associati ai nodi: contengono informazioni su l'identificativo multi-topology (NOTA: se non siete familiari con la funzionalità multi-topology, trovate tutto nel Capitolo 11 del libro su IS-IS, pubblicato in questo post), varie flag presenti nei LSA/LSP (es. per IS-IS: bit Overload, bit Attached; per OSPFv2: bit External, bit ABR; per OSPFv3: bit Router, bit V6), nome del nodo (es. hostname), Area IS-IS di appartenenza, Router-ID IPv4/IPv6, ecc..
  • Attributi associati ai linkcontengono informazioni classiche come i Router-ID dei nodi locale e remoto, e varie informazioni di interesse del Traffic Engineering MPLS (es. appartenenza a un gruppo amministrativo, banda totale disponibile, banda residua, metriche TE, appartenenza a un gruppo SRLG, ecc.).
  • Attributi associati ai prefissi IPcontengono informazioni su vari tipi di flag (es. bit up/down IS-IS, bit P OSPF, ecc.), tag IS-IS normali ed estese (vedi RFC 5130), metrica associata al prefisso, OSPF Forwarding Address, ecc. .

Anche qui, non riporto il formato dei vari attributi, perché di scarso interesse pratico. I più curiosi possono consultare il draft, dove tutto è descritto con dovizia di particolari. 

Ora, dopo tutta questa poesia, è ora di passare a un po' di prosa. Sia Juniper, a partire dalla versione 14.2 del JUNOS,  che Cisco, a partire dalla versione 5.1.1 dell'IOS-XR,  implementano BGP-LS.

Ho fatto una prova di laboratorio con la topologia della figura seguente. In realtà al momento ho sostituito il controller con un router, ma per il futuro stiamo lavorando per sostituire il router con un controller OpenDaylight o ONOS, entrambi supportano BGP-LS.




Secondo quanto descritto nelle sezioni precedenti, i BGP-LS NLRI sono in totale 4 (= n.ro dei nodi) + 10 (= 2*5 link) + 14 (= numero di prefissi). I 14 prefissi derivano dai /24 dei link punto-punto, più una interfaccia di loopback per ciascun nodo. Per arrivare a 14 si noti che R1 e R4 annunciano 3 prefissi, mentre R2 e R3 annunciano 4 prefissi ciascuno. 

BGP-LS NELL'IOS-XR
L'IOS-XR Cisco installa le informazioni sulla topologia della rete e le informazioni aggiuntive del Traffic Engineering MPLS nel Traffic Engineering Database (TED), presente in ciascun nodo. Le informazioni contenute nel TED vengono quindi importate nel BGP-LS, e da qui esportate (via BGP-LS NLRI) verso il controller. Le informazioni sui nodi e sui link presenti nel TED, sono convertite in BGP-LS NLRI, che vengono annunciati al controller.

La prova è stata effettuata utilizzando il VIRL. Riporto di seguito solo le parti rilevanti della configurazione del router R4, in particolare le configurazioni di IS-IS e BGP-LS. I comandi perninenti a BGP-LS sono sottolineati. Le configurazioni negli altri router sono solo semplici configurazioni di IS-IS, senza alcun comando relativo all'implementazione di BGP-LS.

Configurazione IS-IS


RP/0/0/CPU0:R4#sh run router isis
Wed Apr  6 08:57:57.182 UTC
router isis REISS
  is-type level-2-only
  net 49.0001.0000.0000.0004.00
  distribute bgp-ls level 2
  address-family ipv4 unicast
    metric-style wide
    mpls traffic-eng level-2-only
    mpls traffic-eng router-id Loopback0
 !
 interface Loopback0
   address-family ipv4 unicast
   !
 !
 interface GigabitEthernet0/0/0/1
   point-to-point
   address-family ipv4 unicast
   !
 !
 interface GigabitEthernet0/0/0/2
   point-to-point
   address-family ipv4 unicast
   !
 !
 interface GigabitEthernet0/0/0/3
   point-to-point
   address-family ipv4 unicast
   !
 !

!

Configurazione BGP-LS


RP/0/0/CPU0:R4#sh run router bgp
Wed Apr  6 09:10:36.880 UTC
router bgp 1
  bgp router-id 4.4.4.4
  address-family ipv4 unicast
  !
  address-family link-state link-state
  !
  neighbor 172.16.1.5
    remote-as 1
    address-family ipv4 unicast
    !
    address-family link-state link-state
    !
  !
!

Per verificare che il controller abbia ricevuto i BGP-LS NLRI è sufficiente verificare la loro presenza nella tabella BGP relativa all'address-family BGP-LS.


RP/0/0/CPU0:CTRL# show bgp link-state link-state
Wed Apr  6 09:16:44.074 UTC
BGP router identifier 5.5.5.5, local AS number 1
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0x0   RD version: 51
BGP main routing table version 51
BGP NSR Initial initsync version 1 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

Status codes: s suppressed, d damped, h history, * valid, > best
              i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
Prefix codes: E link, V node, T IP reacheable route, u/U unknown
              I Identifier, N local node, R remote node, L link, P prefix
              L1/L2 ISIS level-1/level-2, O OSPF, D direct, S static
              a area-ID, l link-ID, t topology-ID, s ISO-ID,
              c confed-ID/ASN, b bgp-identifier, r router-ID,
              i if-address, n nbr-address, o OSPF Route-type, p IP-prefix
              d designated router address
   Network            Next Hop            Metric LocPrf Weight Path
*>i[V][L2][I0x0][N[c1][b4.4.4.4][s0000.0000.0001.00]]/328
                      172.16.1.4                    100      0 i
*>i[V][L2][I0x0][N[c1][b4.4.4.4][s0000.0000.0002.00]]/328
                      172.16.1.4                    100      0 i
*>i[V][L2][I0x0][N[c1][b4.4.4.4][s0000.0000.0003.00]]/328
                      172.16.1.4                    100      0 i
*>i[V][L2][I0x0][N[c1][b4.4.4.4][s0000.0000.0004.00]]/328
                      172.16.1.4                    100      0 i
*>i[E][L2][I0x0][N[c1][b4.4.4.4][s0000.0000.0001.00]][R[c1][b4.4.4.4][s0000.0000.0002.00]]/568
                      172.16.1.4                    100      0 i
*>i[E][L2][I0x0][N[c1][b4.4.4.4][s0000.0000.0002.00]][R[c1][b4.4.4.4][s0000.0000.0001.00]]/568

                      172.16.1.4                    100      0 i

. . .  /* altri 8 (semi-)link omessi */ . . . 

*>i[T][L2][I0x0][N[c1][b4.4.4.4][s0000.0000.0001.00]][P[p10.1.12.0/24]]/392
                      172.16.1.4                    100      0 i
*>i[T][L2][I0x0][N[c1][b4.4.4.4][s0000.0000.0001.00]][P[p10.1.14.0/24]]/392
                      172.16.1.4                    100      0 i

. . .  /* altri 12 prefissi omessi */ . . .

Senza entrare nei dettagli, per i quali vi rimando alla documentazione Cisco, notate che i nodi sono indicati con [V], i link con [E] e i prefissi con [T]. I primi 4 entry rappresentano i 4 nodi della rete (R1, ... , R4). In questi entry[L2] indica che il nodo è IS-IS di tipo L2, [b4.4.4.4è il BGP router-ID del nodo che annuncia i BGP-LS NLRI [s0000.0000.000x.00] il SyS-ID IS-IS del nodo x. Il resto è ordinaria amministrazione. I due entry successivi rappresentano il link tra R1 e R2. Sono due entry perché ciascuno rappresenta un link unidirezionale, il primo il (semi-)link R1-->R2 e il secondo il (semi-)link R2-->R1. Essendo i link della rete in totale 5, vi sono altri 8 entry che descrivono altrettanti (semi-)link, che per brevità sono stati omessi. Infine, gli ultimi due entry indicano i prefissi e il nodo al quale sono direttamente connessi. Anche qui, per brevità ho omesso ulteriori 12 entry (ricordo che in totale i prefissi annunciati sono 14).

Ulteriori informazioni possono essere viste andando a vedere i dettagli dei singoli entry. Solo per fare un esempio, il dettaglio del Nodo R1 può essere visualizzato come segue:

RP/0/0/CPU0:CTRL# show bgp link-state link-state [V][L2][I0x0][N[c1][b2.2.2.2]$
Wed Apr  6 09:47:07.539 UTC
BGP routing table entry for [V][L2][I0x0][N[c1][b2.2.2.2][s0000.0000.0001.00]]/328
Versions:
  Process           bRIB/RIB  SendTblVer
  Speaker                 25          25
Last Modified: Apr  6 08:44:13.385 for 01:02:54
Paths: (1 available, best #1)
  Not advertised to any peer
  Path #1: Received by speaker 0
  Not advertised to any peer
  Local
    172.16.1.4 from 172.16.1.4 (4.4.4.4)
      Origin IGP, localpref 100, valid, internal, best, group-best
      Received Path ID 0, Local Path ID 1, version 25
      Link-state: Node-name: R1, ISIS area: 49.00.01, Local TE Router-ID: 192.168.1.1

Le informazioni rilevanti sono quelle che compaiono sottolineate nell'ultima riga.

Lo stesso comando applicato a un semi-link, riporta anche le informazioni sul Traffic Engineering MPLS. Ad esempio, per il semi-link R1-->R2, si ottiene (notate che ho omesso le parti non rilevanti):

RP/0/0/CPU0:CTRL#show bgp link-state link-state [E][L2][I0x0][N[c1][b2.2.2.2][$
Wed Apr  6 09:53:04.305 UTC

BGP routing table entry for [E][L2][I0x0][N[c1][b4.4.4.4][s0000.0000.0001.00]][R[c1][b4.4.4.4][s0000.0000.0002.00]]/568

. . . < output omesso > . . .


Link-state: Local TE Router-ID: 192.168.1.1, Remote TE Router-ID: 192.168.1.2 admin-group 0x00000000, max-link-bw (kbit/sec): 1000000, max-reserv-link-bw (kbit/sec): 1000000, max-unreserv-link-bw (kbit/sec): 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000, TE-default-metric: 10, metric: 10 

Infine, lo stesso comando applicato a un prefisso, riporta come informazione aggiuntiva la sola metrica IGP associata al prefisso, e per questo non vale la pena mostrarlo.

BGP-LS nel JUNOS
Il JUNOS installa le informazioni sulla topologia della rete e le informazioni aggiuntive del Traffic Engineering MPLS nel Traffic Engineering Database (TED), presente in ciascun nodo. Le informazioni contenute nel TED vengono quindi importate nel BGP-LS, e da qui esportate (via BGP-LS NLRI) verso il controller. Le informazioni sui nodi e sui link presenti nel TED sono convertite in BGP-LS NLRI, che vengono installate nella tabella di routing "lsdist.0", sulla base di condizioni specificate attraverso una routing policy. Questa procedura che consente di convertire le informazioni del TED in entries della tabella di routing "lsdist.0", viene chiamata "TED import". Si noti che di default nessuna informazione viene importata nella tabella "lsdist.0" dal TEDIl BGP può essere configurato, tramite una opportuna routing policy, a esportare route dalla tabella "lsdist.0". Anche qui, di default nessuna informazione viene esportata dalla tabella "lsdist.0" verso i BGP peer.

Vi riporto di seguito la configurazione da eseguire sul router R4. Non ho avuto modo di provarla poiché al momento non ho a disposizione apparati Juniper che supportano il BGP-LS. La La configurazione e il relativo comando "show ..." sono adattati alla rete utilizzata nell'esempio con l'IOS-XR, da un esempio tratto dalla documentazione ufficiale del JUNOS.

[edit protocols]
tt@R4# show
bgp {
  group CONTROLLER {
    type internal;
    local-address 172.16.1.4;
    neighbor 172.16.1.5;
    export TED-OUT;
    family traffic-engineering {
      unicast;
    }
  }
}
mpls {
  traffic-engineering {
    database {
      import {
         policy TED-IN;
      }
    }
  }
  interface all;
  interface fxp0.0 {
    disable;
  }
}

[edit policy-options]
tt@R4# show
policy-statement TED-OUT {
    from {
      protocol isis;
      family traffic-engineering;
    }
    then accept;

policy-statement TED-IN {
  term 1 {
    from protocol isis;
    then accept;
  }
  term 2 {
    then reject;
  }
}

tt@R4> show route advertising-protocol bgp 172.16.1.5
lsdist.0: 14 destinations, 14 routes (14 active, ...)

NODE { AS:1 ISO:0000.0000.0001.00 ISIS-L2:0 }/1152
NODE { AS:1 ISO:0000.0000.0002.00 ISIS-L2:0 }/1152
NODE { AS:1 ISO:0000.0000.0003.00 ISIS-L2:0 }/1152
NODE { AS:1 ISO:0000.0000.0004.00 ISIS-L2:0 }/1152
LINK { Local { AS:1 ISO:0000.0000.0002.00 }.{ IPv4:10.1.12.2 }
Remote { AS:1 ISO:0000.0000.0001.00 }.{ IPv4:10.1.12.1 } ISIS-L2:0 }/1152
LINK { Local { AS:1 ISO:0000.0000.0001.00 }.{ IPv4:10.1.12.1 }
Remote { AS:1 ISO:0000.0000.0002.00 }.{ IPv4:10.1.12.2 } ISIS-L2:0 }/1152


. . .  /* altri 8 (semi-)link omessi */ . . . 

Una cosa che ho notato e sulla quale debbo indagare, è l'assenza dal comando "show route advertising-protocol bgp ..." degli annunci dei prefissi.

CONCLUSIONI
Il BGP non finisce mai di stupire. Viene ormai utilizzato nei contesti più svariati e naturalmente non poteva non ritagliarsi un suo ruolo anche nel nuovo mondo del SDN. Questa è solo la prima puntata, le prossime due saranno su tecniche "centralizzate" per mitigare gli effetti di attacchi DDOS (Distributed Denial Of Service), la prima "classica" (BGP RTBH), la seconda più evoluta (BGP FlowSpec). Entrambe note da tempo, da prima dell'introduzione del concetto di SDN.

Se volete saperne di più sul BGP, da zero all'infinito, oppure avete bisogno di ulteriori approfondimenti, potete acquistare il mio libro "BGP: dalla Teoria alla Pratica", Ed. Reiss Romoli, 2011 (al prezzo speciale di 30 Euro per i lettori del blog, spese di spedizione gratuite). Potete scaricare l'indice qui

E se volete saperne ancora di più, seguite i nostro corsi IPN246 e IPN247.









Nessun commento:

Posta un commento