---------------------[ previous ]---[ index ]---[ next ]----------------------

==============================================================================
------------[ BFi numero 7, anno 2 - 25/12/1999 - file 10 di 22 ]-------------
==============================================================================


-[ HACKiNG ]------------------------------------------------------------------
---[ PR0GETT0 GiRiNGiR0 PARTE I - FuSyS 


	        ---[ P r o g e t t o  G i R i N G i R O ]---
			        P a r t e  I
	 -----[ T C P / I P  R o u t i n g  P r o t o c o l s ]-----

			      t r a t t o  d a 
	    ----[ T C P / I P  T o o l s  U n l i m i t e d ]----

	      NO(C)1999 FuSyS <fusys@s0ftpj.org> - [S0ftPj|BFi]

#############################################################################
Prima di tutto un po' di scuse. Il progetto GiRiNGiRO avrebbe dovuto essere
completato in un solo articolo. Ahime', purtroppo ho perso un po' di tempo.
Non a livello assoluto, ma disperdendomi dietro un mucchio di attivita' piu'
o meno collaterali. Oltretutto l'implementazione delle idee che avevo in
mente si e' rivelata meno immediata di quanto pensassi, considerato anche lo
scarso tempo a mia disposizione. Quindi il progetto risulta diviso in due
articoli separati. In questo valutero' i concetti teorici di base e cerchero'
di approfondire la conoscenza di alcuni tra i meno considerati protocolli
della 'nostra' benemerita suite. Nel prossimo vedremo di ottenere qualcosa di
pratico da questo excursus.
#############################################################################

-[ P R E R E Q U I S I T I ]-

Do per scontato che il lettore conosca le basi di TCP/IP, del suo funzionamento
e delle sue caratteristiche. In questa prima parte non sono molto necessarie
conoscenze specifiche di programmazione o dello stack di rete degli OS,
sebbene possano essere utili per valutare le possibili implicazioni pratiche.
Alcuni campi sono riportati in inglese. Non e' perche' io non abbia voglia di
tradurveli, ma solo perche' e' piu' comodo confrontare poi RFC ed altri 
documenti pescati in rete piuttosto che scervellarsi anche sul confronto 
tra diverse traduzioni.

-[ F I N A L I T A' ]-

Introdurre il lettore ai protocolli piu' utilizzati nel campo del routing, dal
solito punto di vista interno, e proprio dei pacchetti.

Stimolare anche la voglia di prendere in mano gli RFC di questi protocolli, che
costituiscono la base del funzionamento della rete in cui oggi sguazziamo.

Permettere agli amministratori con un po' di tempo in piu' di non dover per
forza telefonare alla Cisco, alla Ascend o al proprio ISP per diagnosticare
'qualcosa di strano sulla rete'.

Ovviamente questo e' un testo introduttivo su di un argomento che definire
complesso e' un eufemismo.

-[ P e r c h e' ... !? ]-

Quello del routing e' un concetto che non sfugge all'attenzione di nessuno che
lavori nel campo dell' internetworking. E' un concetto essenziale e decisivo.
Purtroppo ho notato come invece sia del tutto sconosciuto dalla maggior parte
dei frequentatori dei canali dell'underground italiano. Questo e' assurdo
considerato l'interesse che invece trasmettono i protocolli di rete e trasporto
della suite TCP/IP. Infatti i protocolli di instradamento forniscono non pochi
punti deboli agli attaccanti e non pochi grattacapi ai responsabili della
sicurezza di innumerevoli sistemi.

Il concetto di instradamento non e' pertinente alla sola InterNet, ma questo e'
quello che abbiamo oggi e quindi mi riferiro' soltanto ai protocolli piu'
comuni e/o importanti utilizzati in questo ambiente eterogeneo.

Se nessuno dei frequentatori di #hack.it si stupisce del fatto che i dati siano
trasmessi da e per macchine con IP differenti, o se nessuno in #hackernow viene
colpito dal fatto che singoli pacchetti IP possano raggiungere l'indirizzo di
destinazione indipendentemente l'uno dall'altro, mi lascia invece perplesso che
nessuno [o pochissimi ?!] di quelli che passano la propria vita a chiudere i
canali suddetti e settarli +i, sappia invece come questo sia possibile e come
vengano gestiti i canali di informazione tra chi si briga di operare i miracoli
della rete.

(...)

-[ R o u t i n g ... ?! ]-

Sostanzialmente possiamo semplificare il discorso, considerando InterNet come
un interessante e gerarchizzato ammasso di reti locali, collegate tra di loro
mediante router. In quest'ottica al ribasso possiamo associare al router il
ruolo di semplice trasmettitore di pacchetti da una LAN all'altra. Ogni router
deve poter sapere dove inviare i pacchetti in arrivo e perche'. Per far questo
utilizza una tabella di routing.

In questa tabella vengono inserite liste di altri router cui passare i nostri
pacchetti a seconda della destinazione richiesta. Se ogni router dovesse
inserire tutti gli altri router, possiamo immaginare come questa lista potrebbe
crescere a dismisura ad ogni nuovo router collegato alla rete.

Ecco perche' le tabelle di instradamento devono essere gestite in maniera
differente. Se infatti un ISP vendesse 32 indirizzi IP ad un cliente, questi
dovrebbe inserire nei sui router solo le informazioni strettamente necessarie
a raggiungere ognuno dei suoi indirizzi, laddove ogni richiesta al di fuori di
questi potrebbe essere indirizzata all'ISP senza porsi il problema della
effettiva destinazione. Questo e' quello che succede ogni volta che siamo
connessi in InterNet da casa nostra, o comunque mediante un collegamento in
dial-up.

Ad esempio:

FuZZy:~ # route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
ge2ie02u.iunet. *               255.255.255.255 UH    0      0        0 ppp0
loopback        *               255.0.0.0       U     0      0        0 lo
192.168.1.0	*		255.255.255.0   U     0      0        0 eth0
default         ge2ie02u.iunet. 0.0.0.0         UG    0      0        0 ppp0
FuZZy:~ #

Questo e' la mia tabella di instradamento quando sono collegato ad InterNet.
Come possiamo vedere posso raggiungere la mia rete locale direttamente mediante
eth0, la mia interfaccia ethernet. Ma esiste una route speciale, definita di
default, che permette a pacchetti indirizzati a sistemi non connessi alla mia
macchina direttamente, di essere instradati attraverso il router del mio ISP,
raggiungibile invece attraverso ppp0:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
ge2ie02u.iunet. *               255.255.255.255 UH    0      0        0 ppp0
default         ge2ie02u.iunet. 0.0.0.0         UG    0      0        0 ppp0

In questo modo posso raggiungere tutti i sistemi connessi alla rete senza dover
mantenere una enorme tabella di instradamento.

-[ I n s t r a d a m e n t i  I n t e r n i  e  t r a  D o m i n i ]-

In realta' InterNet e' un insieme di sistemi cosiddetti autonomi che
definiscono e gestiscono l'autorita' amministrativa ed i criteri di diverse
aziende in merito all'instradamento. [B.Halabi]

I router sono invece strumenti che regolano il traffico tra i vari host,
costruendo tabelle di instradamento che contengono le informazioni sulle
route migliori da seguire verso tutte le destinazioni conosciute. Inoltre
inviano e ricevono informazioni sulle route possibili, che vengono utilizzate
per la costruzione delle tabelle.

I router sviluppano un meccanismo 'ad hop', secondo il quale e' possibile
passare da un punto all'altro della rete attraverso salti successivi di router
in router e, quindi, di tabella in tabella. Il classico esempio e':

fusys@FuZZy:~ > traceroute www.linux.com -i ppp0
traceroute to linux.com (216.200.201.193), 30 hops max, 40 byte packets
 1  ge2ie02u.iunet.it (151.5.152.62)  115 ms  110 ms  100 ms
 2  151.5.152.17 (151.5.152.17)  130 ms  100 ms  110 ms
 3  151.5.207.241 (151.5.207.241)  110 ms  110 ms  120 ms
 4  gw1.iunet.it (192.106.1.130)  110 ms  110 ms  120 ms
 5  192.106.7.165 (192.106.7.165)  110 ms  110 ms  120 ms
 6  195.219.98.1 (195.219.98.1)  160 ms  170 ms  150 ms
 7  if-3-0-0.bb2.London.Teleglobe.net (195.219.0.193)  150 ms  160 ms  150 ms
 8  195.66.225.76 (195.66.225.76)  230 ms  230 ms  220 ms
 9  core1-linx-oc3-1.lhr.above.net (216.200.254.81)  220 ms  230 ms  230 ms
10  iad-lhr-stm-4.iad.above.net (216.200.254.77)  230 ms  250 ms  350 ms
11  sjc-iad-oc12-2.sjc.above.net (216.200.0.22)  490 ms  380 ms  350 ms
12  core1-core5-oc48.sjc2.above.net (216.200.0.178)  340 ms  330 ms  350 ms
13  main2-core1-oc3.sjc2.above.net (216.200.0.250)  340 ms  340 ms  350 ms
14  linux.com (216.200.201.193)  340 ms  360 ms  330 ms
fusys@FuZZy:~ >

In questo sistema ogni router che riceva un pacchetto verifica la possibilita'
che l'IP di destinazione sia fisicamente collegato al segmento di rete servito,
dopodiche' lo invia all'hop successivo piu' vicino, secondo la sua tabella,
alla destinazione. Nel caso della mia macchina, il concetto di 'piu' vicino'
non ha senso in quanto dispongo di una singola regola di default. Ma nel caso
di questi sistemi, la scelta per l'hop successivo e' stata determinata dalle
tabelle di routing dei singoli sistemi e dalle informazioni che ogni router
inter-dominio scambia con i domini vicini. Ah ... ovviamente man traceroute
per favore.

Anche all'interno di un singolo dominio o ISP ci possono essere differenti
segmenti di rete collegati da diversi router: non e' infatti pensabile che
societa' od organizzazioni che hanno a disposizione centinaia o migliaia di
sistemi possano collegarli sullo stesso segmento fisico. In questi casi si
utilizzano dei protocolli ad 'uso interno' per far colloquiare i router interni
ed i computer collegati alla rete da essi servita.

I piu' famosi in assoluto sono sicuramente RIPv2 ed OSPF. Il primo fa parte
dei protocolli basati sui vettori di distanza, mentre il secondo di quelli
basati sullo stato della connessione. 

a) vettori di distanza
Questo tipo di protocolli si basa sulla valutazione dei punti di routing in
termini semplici di hop. In pratica definiscono una serie di coppie composte
da indirizzii di rete e hop necessari per raggiungerli. Questo purtroppo non
permette di valutare ne' lo stato della connessione, ne' tantomeno il costo di
gestione o la velocita' intrinseca del collegamento, equiparando quindi link
a bassa ed alta velocita' qualora richiedano lo stesso numero di hop per il
raggiungimento della connessione. Altra limitazione di questi protocolli e'
il numero massimo di hop gestibili (normalmente 15) dopo i quali la route
viene considerata irraggiungibile. Gli aggiornamenti hanno luogo mediante un
invio senza controllo di stato di TUTTA la tabella di instradamento verso
tutti i router vicini, cio' risultando in un elevato consumo di banda per
tabelle di una certa dimensione.

b) stato della connessione
Questi protocolli invece non basano il loro funzionamento sullo scambio delle
intere tabelle di instradamento. Invece, scambiano tra loro dati necessari ad
una corretta compilazione della tabella locale. Non utilizzano il sistema degli
hop, quindi non sono limitati dal loro numero massimo. Possono considerare la
larghezza di banda di un collegamento e gerarchizzare la rete per gestire
aggregati di routing. Non sono comunque in grado di gestire le complesse
variazioni di instradamento interdominio, oggetto di diverse amministrazioni e
gestioni tecniche.

Per quanto riguarda invece il routing interdominio il protocollo cardine
e' sicuramente BGP4, responsabile delle propagazioni tra diversi sistemi
delle route interne ed esterne, mediante il quale e' possibile gestire al
meglio le richieste dell'internetworking, quali simmetria, bilanciamento e
ridondanza, che vedremo dopo.

Passiamo ora ad analizzare RIPv2 e BGP4 piu' nel dettaglio. Il primo perche'
comunque ancora il piu' usato in moltissime reti miste a prevalenza di UNIX e
supportato da moltissimi router e gateway. Il secondo perche' e' il de facto
standard dell' internet routing. Vedremo anche le basi teoriche riguardanti
OSPFv2 che sta ormai prendendo piede come IGP.

-[R o u t i n g  I n f o r m a t i o n  P r o t o c o l  (R I P)  v 2]-

La nuova versione di RIP aggiunge, senza variare il funzionamento base del 
protocollo, nuovi meccanismi per gestire piu' efficientemente l'instradamento
e la sicurezza degli aggiornamenti di routing.

Questo protocollo deriva dalle versioni Berkeley di UNIX, in particolare dal
programma routed ed e' stato lo standard de facto di instradamento tra host e
gateway per lungo tempo.

RIP e' utile come IGP, o Interior Gateway Protocol, ovvero come protocollo di
instradamento ad uso interno. Ha svariati problemi:

- il limite massimo di 15 hop
- il conteggio ad infinito, nel caso di caduta di collegamenti di rete, che
  puo' portare a cicli di routing, che richiedono banda o tempo, in LAN ad
  alta concentrazione di host, per risolversi
- la metrica fissa basata su hop e non su parametri di funzionalita' e costo

RIP non si cura della differenza esistente tra segmenti di rete e macchine
singole. Associa semplicemente una metrica di hop ad un indirizzo. Nella sua
tabella sono presenti numeri IP, gateway necessari a raggiungere gli IP,
l'interfaccia fisica, la metrica ed il tempo di sopravvivenza della regola di
instradamento.

Il problema maggiore di questo protocollo e dei suoi simili e' essenzialmente
il cosiddetto 'conteggio all'infinito'. Immaginiamo che ci siano quattro
sistemi, A, B, C e Z. A e B sono connessi tra di loro con una metrica di 1,
cosi' come B e C, connesso a sua volta con metrica uguale a Z:

			A ------\
			|	C-------Z
			B-------/

		A -> B e B -> A = 1 hop
		A -> Z via C = 2 hop, via B = 3 hop
		B -> Z via C = 2 hop, via A = 3 hop

Secondo A e B, l'instradamento verso Z ha una metrica di 2 hop attraverso C. 
E di 3 attraverso l'un l'altro. Mentre secondo C la metrica e' di 1. Tutti i 
sistemi aggiornano le loro tabelle mediante invio di pacchetti di aggiornamento
RIP.

Se il collegamento tra C e Z venisse interrotto, C verrebbe subito a saperlo,
modificando la sua tabella. Se pero' il suo aggiornamento raggiungesse A e B
DOPO che questi hanno inviato il loro periodico aggiornamento con metrica 2
verso Z, allora C potrebbe pensare di poter raggiungere Z attraverso A o B.
Cosa in realta' impossibile fisicamente, ma possibile secondo RIP. E se un
aggiornamento RIP di C colpisse A, prima che A possa aggiornare B, questo
potrebbe pensare di poter raggiungere Z attraverso A con metrica uguale a 3.
In una rete con svariati sistemi e gateway, questo rincorrersi di aggiornamenti
porterebbe o ad una saturazione della banda nel caso di update frequenti oppure
ad un lento ristabilirsi della corretta tabella.[da qui 'conteggo ad infinito']

RIP e' basato su UDP. Ogni host che riceva aggiornamenti o messaggi di questo 
tipo, possiede un processo che riceve ed invia datagrammi dalla porta 520/udp.
Tutte le comunicazioni dirette al processo di routing sono dirette alla porta
520 e tutti i messaggi di aggiornamento sono inviati dalla porta 520. Se gli
aggiornamenti non sono stati richiesti allora sia la porta di destinazione che
quella di sorgente devono essere settate a 520. Quelli invece in risposta ad
una richiesta specifica vengono indirizzati alla porta di origine della query.
I messaggi di query e debug possono essere inviati da una porta che non sia la
520, ma devono raggiungerla sull'host remoto.

Il protocollo prevede due modalita' di funzionamento. Una silente, passiva, ed
una normale o attiva. 

La silente permette la ricezione delle tabella da parte degli altri sistemi, 
ma non l'invio di conferme, aggiornamenti o messaggi di debug. Questo permette
di poter mantenere aggiornata la tabella della macchina, senza per questo
partecipare alla sua compilazione dinamica. Questo pero' non dovrebbe essere
permesso nel caso di macchine che possano risolvere un conteggio ad infinito
nel caso di interruzione di linea tra due o piu' punti della rete.

Vediamo ora l'header del pacchetto.
Ogni dato viene scritto in Network Byte Order (BIG Endian).

    0                   1                   2                   3 3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | Command (1)   | Version (1)   |           unused              |
   +---------------+---------------+-------------------------------+
   | Address Family Identifier (2) |        Route Tag (2)          |
   +-------------------------------+-------------------------------+
   |                         IP Address (4)                        |
   +---------------------------------------------------------------+
   |                         Subnet Mask (4)                       |
   +---------------------------------------------------------------+
   |                         Next Hop (4)                          |
   +---------------------------------------------------------------+
   |                         Metric (4)                            |
   +---------------------------------------------------------------+

Il comando puo' avere valore 1, il che presuppone una richiesta, o 2, uguale
ad una risposta con invio di parte o tutta la propria tabella.

La versione e' uguale a 2 per RIPv2 ed ovviamente a 1 per RIP.

L'identificativo della famiglia di indirizzi e' uguale a 2 nel caso di IP.

Route Tag viene utilizzato per gestire o identificare percorsi di routing
inseriti mediante EGP, o Exterior Gateway Protocol, da router esterni alla
rete interna gestita da RIP. Puo' contenere il numero di sistema autonomo da
cui la route e' stata ricevuta, o magari contere valori arbitrari necessari
per distinguerla dalle route interne.

Next Hop identifica il gateway attraverso cui indirizzare il pacchetto. Questo
indirizzo deve essere logicamente raggiungibile.

RIPv2, a differenza della prima versione, dispone anche di un meccanismo di
autenticazione, basato su un valore particolare dell'identificativo della
famiglia:

    0                   1                   2                   3 3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | Command (1)   | Version (1)   |            unused             |
   +---------------+---------------+-------------------------------+
   |             0xFFFF            |    Authentication Type (2)    |
   +-------------------------------+-------------------------------+
   ~                       Authentication (16)                     ~
   +---------------------------------------------------------------+

In questo caso, se l'AFI e' uguale a 0xFFFF, con il tipo di autenticazione
uguale a 2, allora avremo a disposizione 16 ottetti per una password in
chiaro. Nel caso sia minore di 16 ottetti dovremo preoccuparci di paddarla
a destra mediante dei null (0x00).

Questo richiede l'invio di almeno due pacchetti RIP. Il primo necessario alla
autenticazione del peer, il secondo per il vero e proprio invio di messaggi 
RIP.

Un accenno va fatto riguardo alla metrica: i valori accettabili sono compresi
nel range 1-15, mentre 16 equivale ad 'infinito' ed avvia il processo di
cancellazione della route.

RIP e RIPv2 utilizzano entrambi UDP. Questo vuol dire che NON ci sono stati di
connessione. I pacchetti di aggiornamento e risposta circolano liberamente, 
anche NON richiesti. Questo permette non pochi atti maligni contro singoli
sistemi o intere LAN interne, sia in termini di DoS che di sovversione delle
route con possibilita' di hijack e man-in-the-middle.

Ad esempio risulta facile immaginare di poter aggiungere nuove route ad una
macchina semplicemente inviando messaggi di update spoofati con l'indirizzo di
uno dei gateway che il bersaglio usa. O magari bloccare definitivamente una
macchina propagando una serie di metriche uguali a 16, che ricordo equivalere
ad una specie di unreach, per tutte le sue regole di instradamento.

O magari convincere una macchina di una sottorete a NON passare solo per il
gateway predefinito per raggiungere un host remoto con una serie di
aggiornamenti mirati a cancellare la prima route ed ad aggiungerne un'altra
diretta verso una seconda sottorete. In questo modo potremmo sniffare senza
problemi il traffico di macchine situate in un ambiente switchato. 

Che cosa succederebbe se inviassimo ai ragazzini che usano linux da poco, e
spesso e volentieri si ritrovano con routed tranquillamente attivo sulla porta
520, messagi di update da parte del gateway predefinito dell'ISP che spostano
il routing attraverso un'altra macchina della sottorete del provider, cosi'
facendo bloccandone totalmente il traffico, se questo host fosse down ?

RIP e' un protocollo semplice e dai sistemi di autenticazione inesistenti o
facilmente forzabili da remoto, completamente nulli in locale in una LAN, dal
momento che le informazioni sono passate in chiaro. Eppure e' molto utilizzato
proprio per la sua semplicita' e facilita' di setup. Conoscerlo non aumenta
solo la capacita' di rispondere ai trivia, quanto la possibilita' di riuscire
a compromettere una rete, o di gestirla al meglio con un occhio alla sicurezza.

A questo punto dovrebbe risultare comprensibile agli amministratori che ancora
non lo facessero come il filtering della porta 520/udp non sia solo 'carino'
quanto indispensabile. Necessario, IMHO, un ACL o Access Control List su questa
porta, valutando l'arrivo di indirizzi interni da interfacce collegate alla
rete esterna. Utile non solo per operazioni diagnostiche dei router, ma anche
per capire qualcosa che un semplice logger IP non sia in grado di indicarci.

Nella seconda parte del progetto controlleremo l'implementazione di routed
sotto linux e cercheremo il modo di poter leggere, gestire e modificare le
tabelle remote di instradamento.

-[O p e n  S h o r t e s t  P a t h  F i r s t  (O S P F)  v 2]-

OSPF e' un IGP e quindi necessario per lo smistamento e l'aggiornamento delle
route interne ad un sistema autonomo [AS, lo vedremo meglio parlando di BGP].
Disponde di un meccanismo di autenticazione e sfrutta il multicast per le
operazioni di ricezione ed invio degli update.

OSPF instrada i pacchetti basandosi solo sull'IP di destinazione. Consente la
variazione dinamica delle tabelle mediante un sistema di convergenza rapido
ed efficiente. Ogni router deve mantenere in questo caso un database che possa
contenere le informazioni topografiche del sistema autonomo, ovvero i router
presenti, le interfacce fisiche ad essi associate ed i vicini raggiungibili.
Questo database viene poi propagato all'interno del sistema.

Ogni router che utilizzi OSPF, disponendo del database, e' in grado di creare
una mappa di route 'geografiche' che abbiano se' stesso come centro, in questo
modo scegliendo i percorsi piu' corti per ogni destinazione possibile all'
interno del sistema autonomo.

Questo sistema autonomo, cardine di OSPF e BGP, altro non e' che l'insieme di
router interni ad una societa' od organizzazione, che gestisca le route interne
che non devono essere necessariamente propagate all'esterno del sistema, verso
l'ISP o InterNet in toto.

Non voglio entrare nel merito della costituzione e gestione del database del
sistema autonomo. Per approfondire questa conoscenza e' possibile rifarsi al
draft di OSPFv2 [consultare i link in fondo].

Ritengo invece doveroso fornire, al solito, una conoscenza del protocollo dal
punto di vista del pacchetto IP, in modo da poter aiutare a costruire i propri
tool di debug, o a leggere il sorgente di quelli esistenti.

Ecco l'header del pacchetto:

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |   Version #   |     Type      |         Packet length         |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                          Router ID                            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                           Area ID                             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |           Checksum            |             AuType            |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                       Authentication                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                       Authentication                          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Questo header e' comune a tutti i tipi (5) di messaggi OSPFv2. Il numero di
versione sara' ovviamente 2, mentre il tipo dipende dal messaggio OSPF. I 5
tipi sono:

                    Tipo   Descrizione
                   ________________________________
                    1      Hello
                    2      Database Description
                    3      Link State Request
                    4      Link State Update
                    5      Link State Acknowledgment

La lunghezza in byte dell'intero messaggio OSPF completa i primi 32bit.

RouterID e AreaID sono due long associati ai router del sistema autonomo e
dell'area di rete. In pratica, nella maggior parte dei casi, solo il primo
e' davvero variabile, in quanto l'AreaID e' spesso uno solo.

Il checksum e' il solito sum di IP calcolato su tutto il pacchetto OSPF,
escludend i campi di autenticazione.

AuType gestisce la modalita' di autenticazione. I tipi possibili sono:

	          AuType       Descrizione
                 ___________________________________________
                  0            Null
                  1            Password in chiaro
                  2            Autenticazione crittografica
                  Tutti gli    Riservato per future assegnazioni da
                  altri        IANA (iana@ISI.EDU)

Interessante notare come i 64bit a disposizione dell'autenticazione siano usati
con AuType uguale a 2:

        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |              0                |    Key ID     | Auth Data Len |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                 Cryptographic sequence number                 |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

In questo caso abbiamo infatti un identificativo della chiave segreta criptata 
e del digest utilizzato, a esempio MD5, seguito dalla lunghezza del messaggio 
stesso, ad esempio 16 per MD5, che deve essere postposto all'header OSPF. Poi 
un numero di sequenza per evitare gli attacchi di replay, comuni in reti locali
dove lo sniffing e' una realta' e non un problema teorico.

Dopo i campi di autenticazione vengono incollati i dati necessari ai messaggi
OSPF. Per il pachetto di tipo Hello:

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                        Network Mask                           |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |         HelloInterval         |    Options    |    Rtr Pri    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                     RouterDeadInterval                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                      Designated Router                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                   Backup Designated Router                    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                          Neighbor                             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                              ...                              |

Avremo la netmask associata all'interfaccia del router. Poi avremo l'intevallo
in secondi prima di questo messaggio, le opzioni disponibili al router in
questione, e la priorita' del router, Rtr Pri che determina la possibilita'
che il router possa diventare Designated Router nell'algoritmo OSPF.

Il router designato ed il suo backup, in termini di indirizzo IP, o nel caso
non ve ne siano, 0.0.0.0.

Il vicino, in termini di RouterID, che abbia inviato nell'ultimo intervallo,
messaggi di tipo Hello validi in broadcast o multicast.

Gli altri tipi di messaggio rivestono importanza relativa al database di stato
del sistema autonomo. Per quelli, quindi, vi rimando all'RFC apposito.

-[ B o r d e r  G a t e w a y  P r o t o c o l  (B G P)  v 4 ]-

BGP4 e' un importante protocollo. Si puo' dire senza paura di essere smentiti
che se da un giorno all'altro nessun router comprendesse piu' BGP, allora forse
non avremmo piu' InterNet come la conosciamo oggi.

BGP e' un EGP, o Exterior Gateway Protocol, e deriva dai lavori svolti sulla
NFSNet proprio con il primitivo EGP. E' stato introdotto, una versione dopo
l'altra, dalla IETF, Internet Engineering Task Force.

Serve in sostanza al controllo, alla propagazione ed all'aggiornamento dinamico
delle tabelle di instradamento tra differenti sistemi autonomi (autonomous
system o AS, d'ora in poi).

La definizione classica di un sistema autonomo e' quella di un insieme di
router sotto una singola organizzazione ed amministrazione tecnica, utilizzante
un IGP e metriche ad hop per gestire l'instradamento interno all'AS stesso, ed
un EGP per gestire il routing verso altri AS.

BGP necessita di un sistema di trasporto efficiente e robusto, necessario per
le sue operazioni di update, che possa controllare da solo la frammentazione,
il timeout e la ritrasmissione dei dati. E' stato scelto TCP per il suo
funzionamento interno ed il sistema di sequenzialita' dei dati trasmessi, e
per la sua possibilita' di effettuare delle chiusure indolori con un efficace
flush degli ultimi dati trasmessi. La porta utilizzata e' la 179/tcp.

-[ B G P 4 : F u n z i o n a m e n t o  d i  b a s e ]-

Due sistemi danno luogo ad una connessione TCP tra di loro, dopodiche' si
scambiano messaggi per aprire e confermare le modalita' di connessione.
All'inizio inviano entrambi nel flusso dei dati la loro intera tabella di
instradamento. Man mano che si presentino variazioni dinamiche della tabella,
inviano aggiornamenti al peer. BGP non richiede periodici invii dell'intera
tabella, quindi e' necessario che ogni dispositivo che comunichi mediante BGP
gestisca e mantenga in memoria tutta la tabella di ognuno dei suoi peer.
Vengono comunque impiegati dei sistemi di timeout propri di BGP con dei
messaggi di tipo KeepAlive per assicurare il mantenimento della connessione.
Inoltre vi sono degli altri tipi di notifica nel caso ci fossero condizioni di
errore od altri eventi particolari.

E' importante sottolineare che secondo l'RFC del protocollo, non e' detto che
entrambi i capi della connessione debbano per forza essere router. E' difatti
possibile che uno dei due sia un host che voglia solo controllare o gestire la
propria tabella in maniera dinamica. O magari che faccia da punto di unione
tra un segmento di rete di un AS ed il router perimetrale di un altro AS, senza
per questo fungere da gateway del suo sistema autonomo.

a) le route
Una route viene definita come una coppia che abbini ad una destinazione gli
attributi del percorso per quell'indirizzo.

Queste vengono emanate come messaggi BGP di tipo UPDATE: la destinazione e'
quel o quei sistemi i cui indirizzi IP sono riportati nell'NLRI o Network
Layer Reachability Information [che vedremo piu' avanti in dettaglio], ed il
percorso e' l'informazione riportata nei campi di attributi della route che
vengono riportati all'interno dello stesso UPDATE.

Le route vengono inserite e mantenute all'interno del RIB o Routing Information
Bases [vedi b)].

BGP permette anche di poter cancellare una route precedentemente immessa in un
RIB remoto mediante 3 modi differenti:

- Inserendo il prefisso IP della destinazione nel campo WITHDRAWN ROUTES di un
  messaggio UPDATE

- emanando una route alternativa che contenga lo stesso campo NLRI

- terminando la connessione TCP, fatto che comporta la rimozione di tutte le
  route che i due peer avevano emanato l'un l'altro.

b) Routing Information Bases (RIB)
Questo consta di tre parti:

- Adj-RIBs-In: contiene le route ricevute mediante messaggi remoti di UPDATE.
  Queste verranno prese in considerazione dal processo decisionale di BGP.

- Loc-RIB: contiene le route presenti localmente che il processo decisionale
  BGP ha scelto tra quelle contenute in Adj-RIBs-In

- Adj-RIBs-Out: contiene le route che il processo ha selezionato per essere
  emanate ai propri peer.

In pratica, Adj-RIBs-In contiene informazioni ricevute mediante UPDATE e non
ancora processate, Loc-RIB quelle scelte come facenti parte della tabella di
routing, mentre Adj-RIBs-Out quelle da inviare mediante propri messaggi di
UPDATE.

-[ B G P 4 : F o r m a t o  d e i  M e s s a g g i ]-

Vediamo ora gli header BGP ed i tipi di messaggio che i router scambiano
tra di loro per iniziare una connessione BGP e mantere il loro RIB.

I messaggi possono essere lunghi fino ad un massimo di 4096 ottetti e non
piu' corti di un header BGP, o 19 ottetti.

Ecco l'header BGP:

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                                                               +
      |                                                               |
      +                                                               +
      |                           Marker                              |
      +                                                               +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |          Length               |      Type     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Il marker contiene un valore di 128 bit che puo' essere predetto dal peer.
Infatti nel caso di un messaggio di tipo OPEN, o se un messaggio OPEN non 
contiene alcuna informazione relativa ai meccanismi di autenticazione, allora
sara' composto da soli 1. Altrimenti deve contenere un valore computabile
secondo gli algoritmi di autenticazione usati. Questo viene usato non solo
per autenticare i messaggi in arrivo, ma anche per stabilire stati di mancata
sincronizzazione tra i peer BGP.

La lunghezza indica mediante un unsigned int la lunghezza totale del messaggio
in byte, incluso l'header. Minimo 19, massimo 4096, non deve contenere padding.

Il tipo di messaggio puo' essere uguale a:

			1 - OPEN
                        2 - UPDATE
                        3 - NOTIFICATION
                        4 - KEEPALIVE

Vediamoli ora in dettaglio.

[1] Messagio di tipo OPEN

Dopo una connessione TCP, il primo messaggio inviato da entrambi i peer e' un
OPEN. Nel caso sia accettabile, viene inviato un KEEPALIVE di conferma. Dopo
che la sequenza OPEN sia stata portata a termine, sara' possibile utilizzare
i messaggi di tipo UPDATE, NOTIFICATION e KEEPALIVE.

Oltre all'header BGP, sono presenti anche i seguenti dati:

        0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+
       |    Version    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     My Autonomous System      |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |           Hold Time           |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         BGP Identifier                        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       | Opt Parm Len  |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                                                               |
       |                       Optional Parameters                     |
       |                                                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

La versione e' un unsigned int che identifica la versione del protocollo. Ora
e' uguale a 4.

Dopo, un unsigned int di 16 bit contiene il valore dell' AS.

Hold Time contiene il valore in secondi entro cui bisogna inviare un messaggio
UPDATE o KEEPALIVE, pena la caduta della connessione BGP. Impostando 0, non
ci saranno timeout. L'RFC specifica un valore di almeno 3 secondi come base
del valore al di fuori di 0.

L'identificativo BGP e' in pratica un indirizzo IP associato ad una interfaccia
utilizzata per l'invio dei messaggi. Ad esempio Cisco calcola questo valore
usando il numero IP maggiore associato al router.

Opt Parm Len indica la lunghezza in byte degli eventuali Parametri Opzionali.

I Parametri Opzionali vengono rappresentati da una tripletta che contiene:

          0                   1
          0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
         |  Parm. Type   | Parm. Length  |  Parameter Value (variable)
         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...

il tipo di parametro, la sua lunghezza ed il suo valore.

L'RFC di BGP4 specifica un solo parametro opzionale:

a) Authentication Information (Parameter Type 1)
Il campo value del parametro opzionale in questo caso contiene un codice di
autenticazione seguito da un campo variabile contenente i dati necessari alla
autenticazione:

                0 1 2 3 4 5 6 7 8
                +-+-+-+-+-+-+-+-+
                |  Auth. Code   |
                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                |                                                     |
                |              Authentication Data                    |
                |                                                     |
                +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

E' stato anche proposto l'uso di un'opzione TCP come la MD5 Signature Option
per la gestione sicura dei segmenti TCP nel corso di sessioni BGP per
poter ovviare a problemi di hijack e man-in-the-middle.
   
Il messaggio di tipo OPEN deve essere lungo almeno 29 byte compreso l'header
del messaggio.

[2] Messaggio di tipo UPDATE

Questo messaggio viene usato per emanare o ritirare una singola route dal
servizio. Puo' farlo anche insieme specificando differenti route. Contiene
sempre l'header BGP e puo' anche contenere i seguenti campi opzionali:

      +-----------------------------------------------------+
      |   Unfeasible Routes Length (2 octets)               |
      +-----------------------------------------------------+
      |  Withdrawn Routes (variable)                        |
      +-----------------------------------------------------+
      |   Total Path Attribute Length (2 octets)            |
      +-----------------------------------------------------+
      |    Path Attributes (variable)                       |
      +-----------------------------------------------------+
      |   Network Layer Reachability Information (variable) |
      +-----------------------------------------------------+

I primi due ottetti contengono la lunghezza totale in byte del campo successivo
e deve permettere di calcolare la lunghezza del NLRI [vedi sotto]. Un valore
uguale a 0 indica che nessuna route viene ritirata e che quindi il campo
WITHDRAWN ROUTES non e' presente nel messaggio UPDATE.

Il campo successivo contiene una lista di prefissi IP codati come una coppia
<lugnhezza, prefisso> secondo questo schema:

                  +---------------------------+
                  |   Length (1 octet)        |
                  +---------------------------+
                  |   Prefix (variable)       |
                  +---------------------------+

la lunghezza indica il valore in bit del prefisso IP. Se uguale a 0 specifica
tutti gli indirizzi IP. Ad esempio <24, 192.168.1.3> sta per 192.168.1.0/24
secondo la notazione CIDR, o Classless Internet Domain Routing [non trattato
in questo articolo].

il prefisso invece l'indirizzo IP da associare ai bit di mascheramento.

Segue il campo di lunghezza totale degli attributi di percorso che indica in
byte la lunghezza del campo che lo segue. Deve permettere di calcolare anche
il NLRI [vedi sotto]. Un valore uguale a 0 indica che non c'e' NLRI.

Gli attributi di percorso sono presenti in ogni messaggio di tipo UPDATE. Ogni
attributo consta di una tripletta <tipo, lunghezza, valore>.

Il tipo consta di due ottetti, uno per delle flag, e l'altro per il codice
vero e proprio:

                0                   1
                0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
               |  Attr. Flags  |Attr. Type Code|
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Il primo bit delle flag e' il bit delle opzioni. Se uguale a 1 il parametro
e' opzionale, se uguale a 0 e' invece riconosciuto. Il secondo bit identifica
invece se un parametro debba essere propagato o meno, ovvero se sia transitivo,
con valore uguale a 1, o non transitivo, con valore uguale a 0. Se il primo e'
uguale a 0, il secondo e' sempre uguale a 1. Ovvero i parametri riconosciuti
sono sempre transitivi. Il terzo bit specifica se i parametri opzionali e
transitivi (11) sia parziale, se uguale a 1, o totale, se uguale a 0. Il quarto
specifica se la lunghezza degli attributi sia di un solo ottetto, uguale a 0,
o di due, se uguale a 1. Questo quarto bit puo' essere usato solo in caso di
lunghezza superiore a 255 byte. Gli ultimi 4 bit non sono utilizzati e devono
essere settati a 0. Se il 4 bit e' uguale a 0, allora la lunghezza sara' 
specificata nel terzo ottetto della tripletta degli attributi; nel quarto se
invece sara' uguale a 1.

I codici di attributo sono:

ORIGIN (Type Code 1)		Contiene un valore per identificare la origine 
				del'attributo di percorso.
				0 - ottenuto mediante IGP
				1 - ottenuto mediante EGP
				2 - INCOMPLETO - ottenuto altrimenti

AS_PATH (Type Code 2)		contiene triplette per indicare le sequenze di 
				percorso in segmenti della rete di AS. La 
				tripletta prende la forma <tipo, lunghezza, 
				valore>. Il tipo e' un long con questi valori:
				1 - AS_SET : set disordinato di AS
				2 - AS_SEQUENCE : set ordinato
				La lunghezza indica il numero di AS, mentre il
				valore contiene i numeri di AS percorsi.

NEXT_HOP (Type Code 3)		Indica il prossimo hop da usarsi per arrivare
				alle destinazioni listate nell'NLRI.

MULTI_EXIT_DISC (Type Code 4)	Opzionale non transitivo serve per il processo
				decisionale BGP per scegliere tra diversi
				punti di uscita verso il vicino AS

LOCAL_PREF (Type Code 5)	Serve per far conoscere il grado di preferenza
				del router mittente per una certa route

ATOMIC_AGGREGATE (Type Code 6)	Di lunghezza 0, serve per informare i peer che
				il sistema locale ha scelto una route non
				specifica, o meno, scartandone una piu' 
				specifica contenuta in essa.

AGGREGATOR (Type Code 7)	Opzionale transitivo, contiene il numero di AS
				che ha aggregato una route, seguito dal numero
				di router che ha aggregato.
					
COMMUNITY (Type Code 8)		Implementato da Cisco, permette di definire la
				propagazione delle route al di fuori di
				comunita' virtuali tra AS o router.

ORIGIN ID (Type Code 9)		Implementato da Cisco, serve per identificare
				il router originante di una route dopo una
				sua riflessione in un AS per evitare doppioni
				nel caso venisse riflessa anche all'origine.

CLUSTER LIST (Type Code 10)	Implementato da Cisco, contiene una lista di
				ID attraversati durante la riflessione di
				una route al di fuori del cluster di client.

Dopo segue l'NLRI. La sua lunghezza viene calcolata sulla base della lunghezza
degli altri campi del messaggio UPDATE, secondo questo algoritmo:

Lunghezza del messaggio UPDATE - 23 - Path Attributes - Withdrawn Routes 
dove 23 e' la lunghezza dell'header BGP, e dei due campi che contengono la 
lunghezza degli attributi e dei WITHDRAWN.

Le informazioni sulle destinazioni sono contenute mediante coppie di valori
<lunghezza, prefisso> :

                  +---------------------------+
                  |   Length (1 octet)        |
                  +---------------------------+
                  |   Prefix (variable)       |
                  +---------------------------+

questi due valori sono gli stessi utilizzati anche per rimuovere le route,
come visto in precedenza.

La lunghezza minima e' di 23 byte come visto prima, 19 per l'header BGP, 2 per
Unfeasible Routes Length e 2 per Total Path Attribute Length.

Ogni messaggio UPDATE puo' al massimo emanare una sola route, come riportato
nel campo dell' NLRI, e puo' descriverla con una serie di attributi. Puo' 
invece ritirare piu' di una route con il campo Withdrawn Routes.

[3] Messaggio di tipo KEEPALIVE

BGP non usa il sistema di timeout e retransmission proprio di TCP per gestire
e controllare la propria connessione tra peer, ma utilizza questo messaggio
per valutare lo stato delle route emanate da ogni peer, prima che il livello
di trasporto rilevi dei problemi di rete.

I messaggi di tipo KEEPALIVE non devono essere inviati piu' velocemente di uno
per secondo, ma devono comunque raggiungere il peer prima che il suo Hold Timer
raggiunga la fine. Un valore ragionevole e' un terzo dell' Timer remoto. Se il
valore e' stato negoziato uguale a 0, allora i messaggi non devono essere
inviati.

Questo messaggio consiste del solo header BGP di 19 byte.

[4] Messaggio di tipo NOTIFICATION

Questo messaggio viene inviato appena venga rilevata una condizione di errore.
Dopodiche' la connessione BGP viene conclusa.

Oltre all'header BGP, questo messaggio contiene i seguenti dati:

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       | Error code    | Error subcode |           Data                |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
       |                                                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

il codice di errore e' un unsigned int che puo' contenere i seguenti valori:

              1         Message Header Error
              2         OPEN Message Error 
              3         UPDATE Message Error
              4         Hold Timer Expired 
              5         Finite State Machine Error 
              6         Cease                     

il sottocodice contiene dei valori associati ad ognuno dei codici per meglio
definire il tipo di errore [un po' come succede nel caso dei pacchetti ICMP].
Se non contiene alcun valore deve essere settato a 0.
Ecco i sottocodici assegnati dall'RFC:

         Message Header Error subcodes:

                               1  - Connection Not Synchronized.
                               2  - Bad Message Length.
                               3  - Bad Message Type.

         OPEN Message Error subcodes:

                               1  - Unsupported Version Number.
                               2  - Bad Peer AS.
                               3  - Bad BGP Identifier. '
         		       4  - Unsupported Optional Parameter.
                               5  - Authentication Failure.
                               6  - Unacceptable Hold Time.

         UPDATE Message Error subcodes:

                               1 - Malformed Attribute List.
                               2 - Unrecognized Well-known Attribute.
                               3 - Missing Well-known Attribute.
                               4 - Attribute Flags Error.
                               5 - Attribute Length Error.
                               6 - Invalid ORIGIN Attribute
                               7 - AS Routing Loop.
                               8 - Invalid NEXT_HOP Attribute.
                               9 - Optional Attribute Error.
                              10 - Invalid Network Field.
                              11 - Malformed AS_PATH.

il campo dati invece contiene elementi necessari per diagnosticare l'errore.
Dipende strettamente dal codice e dal sottocodice di errore. Per maggiori
informazioni controllare l'RFC di BGP4.

-[ B G P 4 : N e g o z i a z i o n e  d e l l a  V e r s i o n e ]-

I dispositivi paritari BGP dispongono della possibilita' di negoziare durante
il messaggio OPEN la versione d BGP supportata da entrambi.
Nel caso di una versione non supportata, ogni router avra' la versione richiesta
dal peer con l'OPEN, quella da lui tentata, quelle ricevute dal peer mediante
un NOTIFICATION e quelle disponibili localmente. In questo modo saranno in
grado di scegliere una versione comune per la connessione BGP. D'altra parte e'
ovvio che future versioni di BGP, per poter supportare la negoziazione della
versione, dovranno mantenere l'uso e la conformazione dei messaggi OPEN e
NOTIFICATION.

-[ B G P 4 : E l a b o r a z i o n e  d e i  M e s s a g g i  U P D A T E ]-

Dopo che la connessione TCP sia stata effettuata, i messagi OPEN e KEEPALIVE
scambiati, il timer inizializzato, e' possibile ricevere messaggi di tipo
UPDATE.

Se il messaggio contiene un campo WITHDRAWN ROUTES non vuoto, allora le route
precedentemente emanate con quei prefissi IP saranno eliminate da Adj-RIB-In.
Dopodiche' il processo decisionale pensera' a cancellare la route dal Local-RIB
o a sostituirle con altre possibili.

Se il messaggio contiene una route accettabile allora succedera' questo:

1) se la nuova e' identica ad una gia' presente in Adj-RIB-In, allora quella
vecchia verra' sostituita e quindi cancellata, costringendo il processo BGP a
sostituirla in Local-RIB.

2) se la nuova route fa parte di una precedente contenuta in Adj-RIB-In allora
il processo decisionale fara' prevalere la nuova in quanto piu' specifica di
quella precedente

3) se la nuova ha uguali attributi ma e' piu' specifica allora non servono
altre azioni

4) se la nuova ha un NLRI non presente nelle vecchie route verra' inserita
subito nel Adj-RIB-In

5) se la nuova e' una meno specifica di una precedente allora il processo 
decisionale valutera' solo il set di IP raggiungibili con la nuova route

Come funziona questo processo decisionale ? Esso e' suddiviso in tre fasi
distinte. Nella prima BGP deve calcolare un livello di preferenza per ogni
route disponibile in Adj-RIB-In. Per route interne all'AS spesso il solo
parametro LOCAL_PREF verra' usato, altrimenti i parametri di percorso saranno
valutati secondo il PIB o Policy Information Base, i cui dati sono a cura di
ogni AS.

La seconda fase serve per scegliere la route considerata piu' efficiente tra
quelle disponibili per ogni destinazione. Dopo averla scelta, per miglior
livello di preferenza, od in quanto nuova ed unica route per una destinazione,
la porra' in Local-RIB. Esistono comunque delle regole specifiche nel caso
diverse route siano in parita' per quanto riguarda la preferenza.

Nella terza fase BGP si occupa di valutare Local-RIB per poter ottimizzare
secondo le policy dell'AS il Adj-RIB-Out. Nel momento in cui la valutazione di
Local-RIB ed il processo di Adj-RIB-Out siano completi, allora potra' avere
luogo l'invio di messaggi UPDATE.

-[ B G P 4 : C o n s i d e r a z i o n i  e  p o s s i b i l i  f l a w ]-

BGP fa parte di quella stregua di protocolli, come SNMP, che non sono subito
attaccabili o facilmente exploitabili, ma che permettono, con un po' di
astuzia, di poter ottenere interessanti informazioni sulla struttura interna
di una rete, o di un sistema autonomo.

Non tutte le sessioni BGP sembrano essere autenticate su InterNet ed anzi una
buona parte dei router che richiedono l'autenticazione, escono di default con
la possibilita' di negoziare verso il basso la versione di BGP, bypassando
totalmente ogni sicurezza.

Dal momento che il protocollo permette anche ad host non impiegati come router
di poter colloquiare con dispositivi BGP, allora potremmo costruire un semplice
scanner BGP in grado di trovare router che parlino questo protocollo, portare
a termine la sessione OPEN e KEEPALIVE e ricevere allegramente le route
gestite o servite da quel router.

Inoltre alcuni router non hanno una gestione dell'ISN TCP adeguata ai loro
scopi e sono passibili di IP Spoofing alla cieca che puo' permettere ad un
attaccante di spacciarsi per un router paritario di un AS vicino, inserendo
eventualmente route alternative o creando dei cicli di loop all'interno del
sistema autonomo del bersaglio. Quindi magari il nostro scanner potrebbe
decidere di tentare un possibile approccio attivo.

Per quanto riguarda i DoS, non e' necessario sempre cambiare una route per
bloccare un AS. Basta immobilizzare un router o farlo crashare, o mandarne
la CPU al 99.9%. Per far questo potrebbe essere interessante inserire il
router remoto in una serie di UPDATE e WITHDRAWN che lo porterebbero a forza
e costantemente all'interno del processo decisionale, creando non poco
sfruttamente di CPU e di banda per gli eventuali UPDATE esterni da Adj-RIB-Out.
Questo viene bloccato in maniera sensibile dalla tecnica di smorzamento della
route ideato da Cisco, che in pratica assegna una penalita' ad una route ogni
volta che passi da un UPDATE ad un WITHDRAWN nell'unita' di tempo. Una volta
capito dai NOTIFICATION remoti quale possa essere il numero di penalita'
massime prima che la route sia scartata, potremmo inviarne un numero massimo
meno 1 per poi passare ad una nuova route, nell'attesa che le propagazioni
interne all'AS facciano il loro lavoro.

C'e' da chiedersi poi quanto sia precisa l'implementazione nei vari router e
dispositivi BGP del protocollo e delle sue funzioni. Probabilmente, come
accade per i normali sistemi operativi, c'e' la possibilita' di creare danno
remoto mediante pacchetti malformati o valori errati. Un semplice reboot puo'
inchiodare un AS con i successivi problemi di ripristino delle sessioni BGP. 

Queste possibilita' saranno prese in esame nella seconda parte del progetto
GiRiNGiRO, con codice sorgente e qualche considerazione piu' specifica.

-[C O N C L U S I O N E]-

RIPv2, OSPFv2 e BGPv4. Tre importanti e conosciuti protocolli di rete, in
realta' abbastanza ignoti ai piu' se non a chi si occupa di installare e
gestire router, ed anche in quel caso, spesso solo dal punto di vista della
gestione, e non dei meccanismi alla base.

Il discorso non e' assolutamente esaurito con questo articolo, anzi. Spero
invece di aver messo in luce qualche idea e considerazione, una volta spiegato
come questi protocolli siano fatti dal punto di vista dei byte ...

Ad ogni modo, come al solito, potete contattarmi via email per domande o per
proporre idee o dare consigli.

							FuSyS [S0ftpj|BFi]
							  fusys@s0ftpj.org
		-------------------------------------------------
		|	RFC	1058, 1721, 1723, 1771, 1774, 	|
		|		2328, 2385			|
		|	LIBRI	Internet Routing Architectures	|
		|		Bassam Halabi, Cisco-Press	|
		|		TCP/IP Illustrated Vol.1	|
		|		W.R.Stevens, Addison-Wesley	|
		-------------------------------------------------
	---------------------------------------------------------
	|      Onori e squilli di tromba vanno a SMaster:	|
	|	scusa il ritardo brotha ! 			|
	|		  ed anche il minimeet mancato !	|
	---------------------------------------------------------
		---------------------------------------------------------
		|Greets'n'ShoutOuts*in*no*particular*order:bELF,Nello^Z,|
		|Kobaiashi,piGpEN,|scacco|,\sPIRIT\,B_Berry,Dold,Cavallo|
		|del0rean,ins4ne,KaF,|TSuNaMi|,golem,MNeMoNiCo,ZCuL,Slay|
		|awgn,raptor,LordFelix,ntf,vecna,Nail^d0d,#hackers@afork|
		|tutti*coloro*non*nominati*xche'*sono*le*5*del*mattino!!|
		---------------------------------------------------------
			-----------------------------------
			|#donne&pc*rulezza*nonostante*Koba|
			|;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP|
			-----------------------------------


==============================================================================
---------------------------------[ EOF 10/22 ]--------------------------------
==============================================================================

---------------------[ previous ]---[ index ]---[ next ]----------------------