Routing statico in Katharà
In questa pagina 9
Questo laboratorio (LAB2) mostra come si costruisce a mano la tabella di instradamento di host e router. Si usa Katharà come spiegato in Katharà - emulare una reteKatharà è un emulatore di rete: ogni dispositivo (host, router, server) è un container Docker, e i container sono collegati da "domini di collisione" virtuali (reti locali). Un laboratorio è una cartella con lab.conf (topologia), un file <dispositivo>.startup per ogni macchina (comandi eseguiti all'avvio) e, se serve, una cartella per dispositivo con i file da copiare nel suo filesystem. Si avvia con lstart, si ferma con lclean; le macchine si configurano con ifconfig, si provano con ping e si osservano con tcpdump (file .pcap da aprire con Wireshark).Katharà - emulare una rete →; la teoria è in Instradamento e inoltroL'inoltro (forwarding) mette il pacchetto sulla strada verso la destinazione, un salto alla volta (hop by hop). Se la destinazione è nella stessa rete del mittente l'inoltro è diretto (si usa l'ARP per il MAC del destinatario), altrimenti è indiretto: il pacchetto va al router successivo (next hop) indicato dalla tabella di instradamento, o al default gateway. Con le netmask: l'inoltro è diretto attraverso l'interfaccia $x$ se $\text{IP(dst)}\ \text{AND}\ \text{NM}(x)=\text{IP}(x)\ \text{AND}\ \text{NM}(x)$; altrimenti si scorre la tabella dalla maschera più lunga (longest prefix match) e si usa il primo match. La riga con rete $0.0.0.0$ e maschera $0.0.0.0$ (default route) corrisponde sempre. L'aggregazione di rotte (route aggregation) riduce la tabella, e nell'inoltro con etichette (MPLS) la tabella si consulta per indice.Instradamento e inoltro → e nella nota sull'Livello di rete e indirizzamento IPIl livello di rete (network layer) porta i datagrammi da host a host attraverso i router: incapsula (framing), sceglie il percorso (routing) e sposta il pacchetto da un ingresso a un'uscita del router (forwarding); in Internet lascia ai livelli superiori controllo d'errore, di flusso e di congestione. Un indirizzo IPv4 è di 32 bit, diviso in prefisso (rete, $n$ bit) e suffisso (host, $32-n$ bit). L'indirizzamento a classi (A, B, C, D, E) è obsoleto; oggi si usa quello senza classi (CIDR): data una notazione $a.b.c.d/n$ si ricavano $N=2^{32-n}$ indirizzi, indirizzo di rete (suffisso tutto 0) e di broadcast (suffisso tutto 1), oppure con la netmask: rete $=$ indirizzo AND maschera, broadcast $=$ indirizzo OR (NOT maschera).Livello di rete e indirizzamento IP →.
La topologia
Due reti locali (LAN) con un host ciascuna, collegate da due router che si vedono su una piccola rete di collegamento.
195.11.14.0/24 (dominio A) 100.0.0.8/30 (dominio B) 200.1.1.0/24 (dominio C)
pc1 .5 --eth0-- .1 eth0 [r1] eth1 .9 ============ .10 eth1 [r2] eth0 .1 --eth0-- .7 pc2| Dispositivo | Interfaccia | Dominio | Indirizzo |
|---|---|---|---|
| pc1 | eth0 | A | 195.11.14.5/24 |
| r1 | eth0 | A | 195.11.14.1/24 |
| r1 | eth1 | B | 100.0.0.9/30 |
| r2 | eth1 | B | 100.0.0.10/30 |
| r2 | eth0 | C | 200.1.1.1/24 |
| pc2 | eth0 | C | 200.1.1.7/24 |
Verifica degli indirizzi (calcolata con Python):
- ha broadcast e host da a ; stessa struttura per ;
- ha solo due indirizzi utilizzabili, e , e broadcast : è la rete giusta per un collegamento punto-punto tra due router (vedi Subnetting e supernettingIl subnetting divide un blocco di indirizzi in sottoblocchi più piccoli allungando la maschera ($n_{\text{sub}}=n_{\text{rete}}+s$, con $2^s$ sottoreti); il supernetting (aggregazione CIDR) fa l'opposto, accorciando il prefisso per unire blocchi contigui in uno più grande. Regole di progetto: ogni sottorete ha un numero di indirizzi potenza di 2 ($M=2^k\ge$ host richiesti $+2$), prefisso $n=32-k$, indirizzo iniziale multiplo di $M$; si assegnano prima le sottoreti più grandi. Per aggregare $2^j$ blocchi di prefisso $n$ servono blocchi contigui il cui primo indirizzo sia multiplo della dimensione dell'aggregato, e il nuovo prefisso è $n-j$.Subnetting e supernetting →). Perché: la maschera
/30è255.255.255.252, in binario l'ultimo ottetto è (Basi di numerazione e conversioni - binario, ottale ed esadecimaleUn numero in base $r$ vale $\sum a_i r^i$ (cifre $a_i\in{0,\dots,r-1}$). Conversioni: base $r\to$ decimale con la somma pesata; decimale $\to$ base $r$ per divisioni successive (parte intera, resti letti dal basso) e moltiplicazioni successive (parte frazionaria, parti intere lette dall'alto); binario $\leftrightarrow$ ottale/esadecimale a gruppi di 3/4 bit. Somma, differenza e prodotto binari seguono le regole decimali con cifre 0 e 1; la differenza ha prestiti, il prodotto somma prodotti parziali traslati.Basi di numerazione e conversioni - binario, ottale ed esadecimale →): i primi bit sono di rete, gli ultimi dell'host, quindi indirizzi. Con l'AND bit a bit (Algebra di Boole e porte logicheVariabili booleane, operatori AND, OR, NOT e derivati (NAND, NOR, XOR, XNOR) con tabelle di verità; assiomi e teoremi dell'algebra di Boole, De Morgan; porte logiche e completezza di NAND e NOR; semplificazione algebrica con esempio.Algebra di Boole e porte logiche →): ; ; ; . Gli indirizzi hanno tutti rete : è l'indirizzo di rete (host ), e sono gli host ( e ), è il broadcast (host ).
I file del laboratorio
La cartella contiene lab.conf e un file .startup per macchina (struttura spiegata in Katharà - emulare una reteKatharà è un emulatore di rete: ogni dispositivo (host, router, server) è un container Docker, e i container sono collegati da "domini di collisione" virtuali (reti locali). Un laboratorio è una cartella con lab.conf (topologia), un file <dispositivo>.startup per ogni macchina (comandi eseguiti all'avvio) e, se serve, una cartella per dispositivo con i file da copiare nel suo filesystem. Si avvia con lstart, si ferma con lclean; le macchine si configurano con ifconfig, si provano con ping e si osservano con tcpdump (file .pcap da aprire con Wireshark).Katharà - emulare una rete →).
r1[0]=A
r1[1]=B
r2[0]=C
r2[1]=B
pc1[0]=A
pc2[0]=CLettura: r1 ha eth0 sul dominio A ed eth1 sul B; r2 ha eth0 sul C ed eth1 sul B (il dominio B è quindi condiviso da r1 e r2); pc1 sta solo su A, pc2 solo su C.
# pc1.startup
ifconfig eth0 195.11.14.5/24 up # indirizzo e attivazione dell'unica interfaccia di pc1
# pc2.startup
ifconfig eth0 200.1.1.7/24 up # idem per pc2
# r1.startup
ifconfig eth0 195.11.14.1/24 up # lato LAN A
ifconfig eth1 100.0.0.9/30 up # lato collegamento B ("backbone")
# r2.startup
ifconfig eth0 200.1.1.1/24 up # lato LAN C
ifconfig eth1 100.0.0.10/30 up # lato collegamento BOgni riga fa una cosa sola: assegna un indirizzo con la lunghezza del prefisso e attiva l'interfaccia. Non c'è nessuna rotta: è proprio quello che si aggiunge nei passi seguenti. Si avvia con kathara lstart dalla cartella del laboratorio.
Passo 1: cosa raggiunge pc1 senza rotte
Da pc1 si prova prima l'interfaccia eth0 di r1 (stessa rete) e poi l'interfaccia eth1 di r1 (altra rete).
root@pc1:~$ ping 195.11.14.1 # eth0 di r1: stessa rete di pc1
64 bytes from 195.11.14.1: icmp_seq=1 ttl=64 time=3.17 ms
root@pc1:~$ ping 100.0.0.9 # eth1 di r1: rete diversa
connect: Network is unreachableIl primo ping funziona (ttl=64: nessun router in mezzo). Il secondo fallisce subito, senza mandare nulla in rete: il kernel di pc1 non trova nessuna rotta per 100.0.0.9 e risponde Network is unreachable. Per capire perché si guarda la tabella.
Come il kernel controlla una riga: per ogni riga calcola indirizzo di destinazione AND Genmask e vede se il risultato è uguale alla colonna Destination. Per 195.11.14.1: 195.11.14.1 AND 255.255.255.0 195.11.14.0, uguale alla riga, quindi la rete è collegata e il pacchetto esce da eth0. Per 100.0.0.9: 100.0.0.9 AND 255.255.255.0 100.0.0.0, diverso da 195.11.14.0: nessuna riga corrisponde, non c'è default, quindi Network is unreachable.
root@pc1:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
195.11.14.0 * 255.255.255.0 U 0 0 0 eth0(l'uscita, con -n, mostra gli indirizzi numerici). Le colonne:
| Colonna | Significato |
|---|---|
Destination |
rete (o host) di destinazione |
Gateway |
prossimo router; * (o 0.0.0.0 con -n) vuol dire "nessuno: la rete è direttamente collegata" |
Genmask |
maschera della destinazione |
Flags |
U = rotta attiva (up), G = si passa da un gateway |
Metric, Ref, Use |
costo, riferimenti, utilizzi: non servono in questo laboratorio |
Iface |
interfaccia da cui uscire |
Proprietà (reti direttamente collegate). Quando un'interfaccia viene attivata, la rete a cui appartiene è inserita automaticamente nella tabella di instradamento. Tutte le altre reti vanno inserite a mano (o da un protocollo di instradamento). Vale per qualunque dispositivo IP, anche per i router veri.
Esempio. Con ifconfig eth0 195.11.14.5/24 up, pc1 ottiene la riga 195.11.14.0 * 255.255.255.0 U eth0: per questo vede r1 (195.11.14.1) ma non le interfacce 100.0.0.9 o 200.1.1.7. Allo stesso modo, anche r1 e r2 conoscono solo le proprie reti: r2 ha 100.0.0.8/30 su eth1 e 200.1.1.0/24 su eth0.
Passo 2: la rotta predefinita sui PC
Un host di solito ha un solo router di uscita. Invece di elencare tutte le reti raggiungibili, gli si dice: «per tutte le altre reti, passa da questo gateway».
Definizione (rotta predefinita). Default route o default gateway: rotta con destinazione
0.0.0.0e maschera0.0.0.0(cioè , che contiene tutti gli indirizzi). Si usa quando nessuna rotta più specifica corrisponde.
root@pc1:~$ route add default gw 195.11.14.1 # per le reti sconosciute passa da r1 (eth0)
root@pc2:~$ route add default gw 200.1.1.1 # per pc2 il gateway è r2 (eth0)route add default gw <indirizzo> inserisce la riga default 195.11.14.1 0.0.0.0 UG eth0: la G indica che si passa da un gateway. L'indirizzo del gateway deve essere raggiungibile direttamente (qui 195.11.14.1 è nella rete di pc1).
root@pc1:~$ route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
195.11.14.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 195.11.14.1 0.0.0.0 UG 0 0 0 eth0Esempio. Ora ping 100.0.0.9 da pc1 funziona: nessuna rotta specifica corrisponde, si usa quella predefinita, il pacchetto va al MAC di r1 (ARP sul gateway, vedi Protocollo ARPUn host ha tre «nomi»: nome DNS, indirizzo IP (rete) e indirizzo MAC (collegamento). Per spedire un datagramma IP in un frame serve il MAC del prossimo nodo, che si ottiene da quel nodo con ARP: richiesta in broadcast (MAC destinazione FF:FF:FF:FF:FF:FF, contiene IP e MAC del mittente e l'IP cercato) e risposta unicast con il MAC richiesto, memorizzata nella cache ARP. ARP risolve sempre il prossimo salto (host di destinazione o router), non la destinazione finale. Un broadcast non esce dalla sottorete: il proxy ARP del router risponde con il proprio MAC.Protocollo ARP →) e r1, che ha l'indirizzo 100.0.0.9 su eth1, risponde. Nella lezione si osserva che l'«interfaccia backbone» di r1 è raggiungibile.
Perché pc1 non raggiunge r2
root@pc1:~$ ping 100.0.0.10 # eth1 di r2
7 packets transmitted, 0 received, 100% packet lossNessuna risposta, eppure la richiesta c'è: si controlla sniffando su eth1 di r2 mentre pc1 fa il ping.
r2:~# tcpdump -tenni eth1
arp who-has 100.0.0.10 tell 100.0.0.9
arp reply 100.0.0.10 is-at fe:fd:64:00:00:0a
IP 195.11.14.5 > 100.0.0.10: icmp 64: echo request seq 1
IP 195.11.14.5 > 100.0.0.10: icmp 64: echo request seq 2
IP 195.11.14.5 > 100.0.0.10: icmp 64: echo request seq 3Opzioni: -t niente orari, -e mostra i MAC, -nn niente nomi, -i eth1 interfaccia. Le richieste arrivano a r2 (r1 le inoltra, perché ha la rete 100.0.0.8/30 collegata), ma non si vedono echo reply: r2 deve rispondere a 195.11.14.5 e nella sua tabella non c'è nulla per 195.11.14.0/24, quindi non sa da dove farle uscire.
Proprietà (raggiungibilità in due versi). Perché due nodi comunichino serve un percorso di andata e uno di ritorno: ogni router lungo la strada deve avere una rotta verso la destinazione e verso il mittente. Un
pingsenza risposta non dice che l'andata sia rotta: bisogna sniffare ai due estremi.
Esempio. La richiesta pc1 r2 funziona perché pc1 ha il default verso r1 e r1 conosce la rete 100.0.0.8/30. La risposta r2 pc1 non parte perché r2 non conosce 195.11.14.0/24.
Passo 3: le rotte statiche sui router
Bisogna «insegnare» a r2 come raggiungere la LAN di pc1.
r2:~# route add -net 195.11.14.0/24 gw 100.0.0.9 dev eth1Formula (sintassi di
route add).route add -net <rete>/<prefisso> gw <next hop> dev <interfaccia>: «la rete<rete>/<prefisso>si raggiunge tramite<next hop>uscendo da<interfaccia>». Il next hop deve stare in una rete direttamente collegata all'interfaccia indicata.
Esempio. Su r2: rete 195.11.14.0 con prefisso , raggiungibile tramite (l'eth1 di r1) uscendo da eth1. Equivale a route add -net 195.11.14.0 netmask 255.255.255.0 gw 100.0.0.9 dev eth1.
Tabella di r2 dopo il comando:
Destination Gateway Genmask Flags Iface
100.0.0.8 * 255.255.255.252 U eth1
200.1.1.0 * 255.255.255.0 U eth0
195.11.14.0 100.0.0.9 255.255.255.0 UG eth1Simmetricamente su r1 (rete di pc2 tramite l'eth1 di r2):
r1:~# route add -net 200.1.1.0/24 gw 100.0.0.10 dev eth1A questo punto i due PC si vedono.
root@pc1:~$ ping 200.1.1.7
64 bytes from 200.1.1.7: icmp_seq=1 ttl=62 time=1.05 msProprietà (TTL e router attraversati). Ogni router che inoltra un datagramma sottrae al TTL (vedi Datagramma IP e frammentazioneIPv4 è un servizio senza connessione, non affidabile, best effort: i pacchetti (datagrammi) possono essere persi, corrotti, riordinati o ritardati. L'intestazione ha 20-60 byte (HLen conta parole da 4 byte, da 5 a 15); il campo Total Length (16 bit) dà la lunghezza totale fino a 65 535 byte; TTL limita i salti, Protocol identifica il protocollo trasportato (1 ICMP, 6 TCP, 17 UDP), il checksum copre solo l'intestazione. Se un datagramma è più grande dell'MTU del collegamento viene frammentato: solo il payload si divide, ogni frammento ha un'intestazione propria; l'Offset (13 bit) è in unità di 8 byte, MF=1 in tutti i frammenti tranne l'ultimo, e il riassemblaggio avviene solo a destinazione.Datagramma IP e frammentazione → e Protocollo ICMPIPv4 non ha meccanismi per segnalare o correggere gli errori né per interrogare host e router: li fornisce l'ICMP (Internet Control Message Protocol), un protocollo di rete i cui messaggi viaggiano dentro datagrammi IP con campo Protocol $=1$. I messaggi sono di errore (destination unreachable, tipo 3; time exceeded, tipo 11; redirect, tipo 5; parameter problem, tipo 12), sempre inviati alla sorgente originale e con l'intestazione IP più i primi 8 byte del datagramma che ha causato l'errore, oppure di interrogazione (echo request 8 e reply 0, timestamp 13-14). ICMP segnala ma non corregge. Con l'echo si fanno ping (RTT) e scoperta dell'MTU (bit D, codice 4, payload massimo $1500-20-8=1472$ byte); con time exceeded e port unreachable si fa traceroute ($n+1$ messaggi con TTL crescente). Attacchi: smurf e redirect.Protocollo ICMP →). Se l'host di destinazione parte con , a destinazione arriva con , dove è il numero di router attraversati.
Esempio. La risposta di pc2 a pc1 passa per r2 e r1: , esattamente il ttl=62 della cattura. Verso un'interfaccia di r1 il TTL resta (nessun router attraversato, perché è r1 stesso a rispondere).
Con traceroute 200.1.1.7 da pc1 si vedono tre righe: 195.11.14.1 (r1, interfaccia da cui il pacchetto è entrato), 100.0.0.10 (r2) e 200.1.1.7 (destinazione). Ogni router risponde con un messaggio ICMP time exceeded quando il TTL scende a : così traceroute scopre i router (vedi Routing avanzato in KatharàLaboratorio 3 (LAB3). Tre router r1, r2, r3 a triangolo con tre LAN (96.96.0.0/24, 192.192.192.0/20, 128.128.0.0/20) e tre collegamenti /30 (10.0.0.0/30, 20.0.0.0/30, 30.0.0.0/30). Obiettivo: ogni dispositivo deve poter fare ping a ogni interfaccia di ogni altro. Gli host usano una rotta predefinita; i router soltanto rotte statiche (vietato il default), tre per router, una per ogni rete non direttamente collegata. Con soli default in un triangolo i percorsi si allungano e i pacchetti per indirizzi sconosciuti girano in cerchio fino al TTL; un buon compromesso è un default più qualche rotta specifica. traceroute scopre i router incrementando il TTL: ogni router che lo porta a 0 risponde con ICMP time exceeded.Routing avanzato in Katharà →).
Rotte statiche contro rotta predefinita
Proprietà (corrispondenza più specifica). Se più rotte corrispondono a un indirizzo di destinazione, il kernel usa quella con il prefisso più lungo (longest prefix match). La rotta predefinita () è la meno specifica e vince solo se non c'è altro.
Esempio. Su r2 un pacchetto per 195.11.14.5 corrisponde a 195.11.14.0/24 (prefisso ) e alla rotta predefinita, se ci fosse: vince la prima. Verifica: con /24, 195.11.14.5 AND 255.255.255.0 195.11.14.0 (corrisponde); con /0 la maschera è 0.0.0.0 e qualunque indirizzo dà 0.0.0.0 (corrisponde sempre). I prefissi sono e , vince il più lungo, .
Esercizi proposti dalle slide
La rotta predefinita scritta come rotta statica. route add default gw 195.11.14.1 dev eth0 equivale a
route add -net 0.0.0.0/0 gw 195.11.14.1 dev eth0 # rete 0.0.0.0/0 = tutti gli indirizzi(cioè route add -net __/__ gw __ dev __ con , prefisso , gateway , interfaccia eth0).
Router con sole rotte predefinite. Nella rete di questo laboratorio i router hanno un solo vicino, quindi basta una rotta predefinita ciascuno:
r1:~# route add default gw 100.0.0.10 dev eth1 # tutto ciò che non è locale va a r2
r2:~# route add default gw 100.0.0.9 dev eth1 # tutto ciò che non è locale va a r1Tabella di r1:
Destination Gateway Genmask Flags Iface
100.0.0.8 * 255.255.255.252 U eth1
195.11.14.0 * 255.255.255.0 U eth0
default 100.0.0.10 0.0.0.0 UG eth1Funziona per tutte le destinazioni dei due PC. Attenzione ai limiti: per un indirizzo che non esiste da nessuna parte (per esempio 8.8.8.8) il pacchetto rimbalza tra r1 e r2, che si rimandano l'un l'altro la rotta predefinita, finché il TTL arriva a . È il motivo per cui i router con più vicini si configurano con rotte specifiche.
Esercizi del foglio facoltativo di LAB2
Esercizio 1. Si avviano le quattro macchine come in figura, si prova ping verso 195.11.14.1 (funziona) e verso 100.0.0.9 (Network is unreachable) e si riporta la tabella di pc1 con route: l'unica riga è 195.11.14.0 * 255.255.255.0 U eth0.
Esercizio 2. Dopo la rotta predefinita su pc1 e pc2, pc1 raggiunge le due interfacce di r1 (195.11.14.1 e 100.0.0.9) e nient'altro: le interfacce di r2 non rispondono perché r2 non ha la rotta di ritorno. r1 raggiunge pc1, le sue due interfacce e l'interfaccia 100.0.0.10 di r2 (sono tutte reti collegate, anche per la risposta), ma non 200.1.1.1 né 200.1.1.7: nessuna rotta verso 200.1.1.0/24.
Esercizio 3. Su r1: route add -net 200.1.1.0 netmask 255.255.255.0 gw 100.0.0.10 dev eth1.
Esercizio 4. Rotte statiche su pc1 al posto della rotta predefinita (prima si toglie il default con route del default):
route del default # rimuove la rotta predefinita
route add -net 100.0.0.8/30 gw 195.11.14.1 dev eth0 # collegamento tra i router
route add -net 200.1.1.0/24 gw 195.11.14.1 dev eth0 # LAN di pc2Bastano due righe perché dietro r1 ci sono solo due reti: 100.0.0.8/30 (che comprende 100.0.0.9 e 100.0.0.10) e 200.1.1.0/24.
Esercizio 5. Router con sole rotte predefinite: vedi sopra (tabella di r1).
Esercizio avanzato: quattro host su un solo dominio con maschere diverse
Quattro host sono sullo stesso dominio di collisione (in Katharà si ottiene mettendo le quattro eth0 sullo stesso dominio, senza hub), ma con maschere diverse.
| Host | Indirizzo | Rete |
|---|---|---|
| pcA | 192.168.20.1/24 | 192.168.20.0/24 |
| pcB | 192.168.20.193/28 | 192.168.20.192/28 |
| pcC | 192.168.20.206/28 | 192.168.20.192/28 |
| pcD | 192.168.20.254/24 | 192.168.20.0/24 |
La rete ha maschera , broadcast e host da a (verificato con Python). In binario l'ultimo ottetto della maschera è : i primi bit sono di rete, gli ultimi dell'host ( indirizzi, da a , di cui host). Con l'AND: ; ; (broadcast); invece e : quindi pcA e pcD non sono nella rete di pcB e pcC.
Ogni host decide da solo se una destinazione è «sulla mia rete» usando la propria maschera, e le due viste non coincidono:
- pcA e pcD (/24) credono che tutti gli indirizzi – siano locali: mandano ARP e frame direttamente a pcB e pcC;
- pcB e pcC (/28) credono locali solo –: per pcA e pcD non hanno nessuna rotta.
Risultato, host per host (calcolato con Python):
| Da a | Andata | Ritorno | Esito |
|---|---|---|---|
| A D | locale | locale | funziona |
| B C | locale | locale | funziona |
| A o D B o C | il frame arriva | B o C non hanno rotta verso A o D | fallisce |
| B o C A o D | Network is unreachable |
fallisce |
La richiesta di A verso B arriva davvero (ARP e frame sono sullo stesso dominio), ma pcB non sa rispondere a , che non è nella sua . Dipende dall'impostazione del kernel (filtro sul percorso inverso) se la richiesta venga già scartata a pcB o se sia la risposta a non partire: in ogni caso non c'è comunicazione.
Soluzione. Basta una rotta senza gateway su pcB e pcC: la rete più grande è raggiungibile direttamente sulla stessa interfaccia.
route add -net 192.168.20.0/24 dev eth0 # su pcB e su pcC: la /24 è sullo stesso dominio, nessun gatewaypcA e pcD non hanno bisogno di nulla. Grazie al prefisso più lungo, il traffico B C continua a usare la rotta .
Esercizio 6. Tabella di pcB:
Destination Gateway Genmask Flags Iface
192.168.20.192 * 255.255.255.240 U eth0
192.168.20.0 * 255.255.255.0 U eth0Approfondimento: ARP lungo il percorso (laboratorio 2022-23)
Con la stessa topologia più un terzo host pc3 (200.1.1.3, rete C) il laboratorio ARP del 2022-23 fa osservare come i router si scambiano i MAC a ogni salto. Si vede con arp -n (cache ARP) e tcpdump -tenni. Ping di pc2 (200.1.1.7) verso pc1 (195.11.14.5), tre domini attraversati:
- Dominio C: pc2 non conosce il MAC del gateway e fa ARP in broadcast (
who-has 200.1.1.1 tell 200.1.1.7); r2 risponde in unicast. Il pacchetto IP (src200.1.1.7, dst195.11.14.5) viaggia nel frame con MAC di pc2 e di r2. - Dominio B: r2 consulta la tabella, trova il next hop
100.0.0.9e fa ARP per quello (who-has 100.0.0.9 tell 100.0.0.10). - Dominio A: r1 vede che
195.11.14.5è nella rete direttamente collegata e fa ARP per l'indirizzo finale.
Proprietà (ARP risolve il prossimo salto). In ogni rete locale l'ARP chiede il MAC del prossimo nodo (gateway o destinazione finale). Gli indirizzi IP del pacchetto restano uguali per tutto il percorso, i MAC cambiano a ogni dominio.
Esempio. I MAC di Katharà si ricavano dall'IP (fe:fd più i quattro byte): 200.1.1.1 è FE:FD:C8:01:01:01, 100.0.0.10 è FE:FD:64:00:00:0A, 195.11.14.5 è FE:FD:C3:0B:0E:05 (verificato con Python). Conversione di ogni byte in esadecimale, dividendo per (Basi di numerazione e conversioni - binario, ottale ed esadecimaleUn numero in base $r$ vale $\sum a_i r^i$ (cifre $a_i\in{0,\dots,r-1}$). Conversioni: base $r\to$ decimale con la somma pesata; decimale $\to$ base $r$ per divisioni successive (parte intera, resti letti dal basso) e moltiplicazioni successive (parte frazionaria, parti intere lette dall'alto); binario $\leftrightarrow$ ottale/esadecimale a gruppi di 3/4 bit. Somma, differenza e prodotto binari seguono le regole decimali con cifre 0 e 1; la differenza ha prestiti, il prodotto somma prodotti parziali traslati.Basi di numerazione e conversioni - binario, ottale ed esadecimale →): ; ; ; ; ; .
Osservazioni del foglio: la cache ARP parte vuota; chi riceve una richiesta ARP impara subito il MAC del mittente (RFC 826), e infatti dopo che pc3 fa ping verso pc2 anche la cache di pc2 contiene il MAC di pc3; per una destinazione fuori dalla rete la cache contiene il MAC del router, non quello della destinazione; ping verso un indirizzo inesistente nella stessa rete produce alcune richieste ARP senza risposta (di solito tre, da controllare con tcpdump) e poi Destination Host Unreachable; verso una rete senza rotta non parte nulla (Network is unreachable). Gli esercizi avanzati dello stesso foglio:
- Cache non aggiornata. Se si scambiano gli indirizzi di due host dopo che pc1 li ha messi in cache, pc1 continua a spedire i frame ai vecchi MAC: l'host che li riceve non ha più quell'IP e non risponde, finché la voce non scade o non viene ricontrollata (talvolta con una richiesta ARP in unicast).
- Proxy ARP. Due domini con la stessa rete IP: pc1 non può raggiungere pc3 perché la richiesta ARP non esce dal dominio. Si aggiunge su r1
route add 192.168.10.30/32 eth1e si attiva il proxy ARP su r1 conecho 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp(e lo stesso pereth1): r1 risponde all'ARP con il proprio MAC, e nella cache di pc1 l'IP di pc3 compare con il MAC dieth0di r1. La rotta per pc3 è obbligatoria: il kernel risponde per conto di altri solo per indirizzi che conosce.
Errori tipici
- Dimenticare la rotta di ritorno: la richiesta di
pingarriva, la risposta no. - Mettere come gateway un indirizzo che non sta in una rete direttamente collegata.
- Dimenticare
dev eth1/l'interfaccia o confondereeth0coneth1. - Scrivere la rotta senza prefisso:
route add -net 195.11.14.0 gw ...assume la maschera della classe e può dare una rete sbagliata. - Aspettarsi che un host con maschera più stretta (
/28) raggiunga tutta la/24.
Versione ripasso
- Topologia (LAB2). pc1
195.11.14.5/24(dominio A) - r1 (195.11.14.1/24su A,100.0.0.9/30su B) - r2 (100.0.0.10/30su B,200.1.1.1/24su C) - pc2200.1.1.7/24(dominio C).lab.conf:r1[0]=A,r1[1]=B,r2[0]=C,r2[1]=B,pc1[0]=A,pc2[0]=C. La rete100.0.0.8/30ha solo due host,.9e.10, e broadcast.11(Subnetting e supernettingIl subnetting divide un blocco di indirizzi in sottoblocchi più piccoli allungando la maschera ($n_{\text{sub}}=n_{\text{rete}}+s$, con $2^s$ sottoreti); il supernetting (aggregazione CIDR) fa l'opposto, accorciando il prefisso per unire blocchi contigui in uno più grande. Regole di progetto: ogni sottorete ha un numero di indirizzi potenza di 2 ($M=2^k\ge$ host richiesti $+2$), prefisso $n=32-k$, indirizzo iniziale multiplo di $M$; si assegnano prima le sottoreti più grandi. Per aggregare $2^j$ blocchi di prefisso $n$ servono blocchi contigui il cui primo indirizzo sia multiplo della dimensione dell'aggregato, e il nuovo prefisso è $n-j$.Subnetting e supernetting →). - Reti collegate. Attivare un'interfaccia (
ifconfig eth0 IP/prefisso up) inserisce da sola la sua rete nella tabella; le altre vanno inserite a mano. Senza rotte, da pc1ping 195.11.14.1funziona conttl=64, mentreping 100.0.0.9dàNetwork is unreachablee non esce nulla dalla scheda. Vale anche per i router veri (Instradamento e inoltroL'inoltro (forwarding) mette il pacchetto sulla strada verso la destinazione, un salto alla volta (hop by hop). Se la destinazione è nella stessa rete del mittente l'inoltro è diretto (si usa l'ARP per il MAC del destinatario), altrimenti è indiretto: il pacchetto va al router successivo (next hop) indicato dalla tabella di instradamento, o al default gateway. Con le netmask: l'inoltro è diretto attraverso l'interfaccia $x$ se $\text{IP(dst)}\ \text{AND}\ \text{NM}(x)=\text{IP}(x)\ \text{AND}\ \text{NM}(x)$; altrimenti si scorre la tabella dalla maschera più lunga (longest prefix match) e si usa il primo match. La riga con rete $0.0.0.0$ e maschera $0.0.0.0$ (default route) corrisponde sempre. L'aggregazione di rotte (route aggregation) riduce la tabella, e nell'inoltro con etichette (MPLS) la tabella si consulta per indice.Instradamento e inoltro →). - Lettura di
route -n.Destinationrete;Gatewaynext hop, con*o0.0.0.0se la rete è collegata;Genmaskmaschera;FlagsconU(attiva) eG(si passa da un gateway);Ifaceinterfaccia di uscita. - Rotta predefinita sui PC.
route add default gw 195.11.14.1(su pc2200.1.1.1) è la rotta , usata quando nessuna rotta più specifica corrisponde. Il gateway deve stare in una rete collegata. Dopo, da pc1ping 100.0.0.9funziona: la richiesta va al MAC di r1 e r1 risponde. - Perché pc1 non raggiunge r2. Su r2 con
tcpdump -tenni eth1arrivano le echo request (r1 le inoltra), ma non partono le echo reply: r2 non ha rotta verso195.11.14.0/24.
Proprietà (raggiungibilità in due versi). Due nodi comunicano solo con un percorso di andata e uno di ritorno: ogni router lungo la strada deve avere una rotta verso la destinazione e verso il mittente. Un ping senza risposta non dice dove si rompe: bisogna sniffare ai due estremi.
- Rotte statiche sui router. Su r2
route add -net 195.11.14.0/24 gw 100.0.0.9 dev eth1; su r1route add -net 200.1.1.0/24 gw 100.0.0.10 dev eth1. Formula: «la reterete/prefissosi raggiunge tramite il next hop, uscendo dadev». Il next hop deve stare in una rete collegata a quell'interfaccia. Equivale aroute add -net 195.11.14.0 netmask 255.255.255.0 gw 100.0.0.9 dev eth1. - Esito. Da pc1
ping 200.1.1.7risponde conttl=62: due router attraversati, . Un router che inoltra sottrae 1 al TTL (Datagramma IP e frammentazioneIPv4 è un servizio senza connessione, non affidabile, best effort: i pacchetti (datagrammi) possono essere persi, corrotti, riordinati o ritardati. L'intestazione ha 20-60 byte (HLen conta parole da 4 byte, da 5 a 15); il campo Total Length (16 bit) dà la lunghezza totale fino a 65 535 byte; TTL limita i salti, Protocol identifica il protocollo trasportato (1 ICMP, 6 TCP, 17 UDP), il checksum copre solo l'intestazione. Se un datagramma è più grande dell'MTU del collegamento viene frammentato: solo il payload si divide, ogni frammento ha un'intestazione propria; l'Offset (13 bit) è in unità di 8 byte, MF=1 in tutti i frammenti tranne l'ultimo, e il riassemblaggio avviene solo a destinazione.Datagramma IP e frammentazione →).traceroute 200.1.1.7mostra195.11.14.1(r1),100.0.0.10(r2),200.1.1.7: ogni router risponde con ICMP time exceeded quando il TTL arriva a 0 (Protocollo ICMPIPv4 non ha meccanismi per segnalare o correggere gli errori né per interrogare host e router: li fornisce l'ICMP (Internet Control Message Protocol), un protocollo di rete i cui messaggi viaggiano dentro datagrammi IP con campo Protocol $=1$. I messaggi sono di errore (destination unreachable, tipo 3; time exceeded, tipo 11; redirect, tipo 5; parameter problem, tipo 12), sempre inviati alla sorgente originale e con l'intestazione IP più i primi 8 byte del datagramma che ha causato l'errore, oppure di interrogazione (echo request 8 e reply 0, timestamp 13-14). ICMP segnala ma non corregge. Con l'echo si fanno ping (RTT) e scoperta dell'MTU (bit D, codice 4, payload massimo $1500-20-8=1472$ byte); con time exceeded e port unreachable si fa traceroute ($n+1$ messaggi con TTL crescente). Attacchi: smurf e redirect.Protocollo ICMP →, Routing avanzato in KatharàLaboratorio 3 (LAB3). Tre router r1, r2, r3 a triangolo con tre LAN (96.96.0.0/24, 192.192.192.0/20, 128.128.0.0/20) e tre collegamenti /30 (10.0.0.0/30, 20.0.0.0/30, 30.0.0.0/30). Obiettivo: ogni dispositivo deve poter fare ping a ogni interfaccia di ogni altro. Gli host usano una rotta predefinita; i router soltanto rotte statiche (vietato il default), tre per router, una per ogni rete non direttamente collegata. Con soli default in un triangolo i percorsi si allungano e i pacchetti per indirizzi sconosciuti girano in cerchio fino al TTL; un buon compromesso è un default più qualche rotta specifica.traceroutescopre i router incrementando il TTL: ogni router che lo porta a 0 risponde con ICMP time exceeded.Routing avanzato in Katharà →).
Proprietà (corrispondenza più specifica). Se più rotte contengono l'indirizzo, vince quella con il prefisso più lungo (longest prefix match). Il default, , vince solo se non c'è altro. Esempio: su r2
195.11.14.5corrisponde a195.11.14.0/24, quindi vince questa rotta rispetto al default.
- Default come rotta statica.
route add -net 0.0.0.0/0 gw 195.11.14.1 dev eth0equivale aroute add default gw 195.11.14.1 dev eth0. - Router con soli default. Nella rete del laboratorio basta un default per router:
r1: route add default gw 100.0.0.10 dev eth1,r2: route add default gw 100.0.0.9 dev eth1. Funziona per i due PC, ma un indirizzo inesistente come8.8.8.8rimbalza tra r1 e r2 finché il TTL arriva a 0. Per questo i router con più vicini usano rotte specifiche.
route del default # toglie il default su pc1
route add -net 100.0.0.8/30 gw 195.11.14.1 dev eth0 # collegamento tra i router, senza default
route add -net 200.1.1.0/24 gw 195.11.14.1 dev eth0 # LAN di pc2: bastano due righe- Quattro host sullo stesso dominio con maschere diverse. pcA
192.168.20.1/24e pcD192.168.20.254/24(rete/24); pcB192.168.20.193/28e pcC192.168.20.206/28(rete192.168.20.192/28, host da.193a.206, broadcast.207). Ogni host decide se una destinazione è locale con la propria maschera.- AD e BC funzionano, perché sono locali per entrambi.
- A o D verso B o C: il frame arriva, ma B o C non ha rotta verso A o D e la risposta non riesce.
- B o C verso A o D:
Network is unreachable, perché A e D non stanno nella loro . - Soluzione su pcB e pcC:
route add -net 192.168.20.0/24 dev eth0(senza gateway). Il prefisso più lungo mantiene BC sulla rotta . Tabella di pcB:192.168.20.192/28e192.168.20.0/24, entrambe sueth0.
- ARP lungo il percorso. Ping da pc2 a pc1 attraversa tre domini: C (pc2 chiede il MAC di r2), B (r2 chiede il MAC di
100.0.0.9), A (r1 chiede il MAC di195.11.14.5). Gli IP restano uguali, i MAC cambiano a ogni salto (Protocollo ARPUn host ha tre «nomi»: nome DNS, indirizzo IP (rete) e indirizzo MAC (collegamento). Per spedire un datagramma IP in un frame serve il MAC del prossimo nodo, che si ottiene da quel nodo con ARP: richiesta in broadcast (MAC destinazione FF:FF:FF:FF:FF:FF, contiene IP e MAC del mittente e l'IP cercato) e risposta unicast con il MAC richiesto, memorizzata nella cache ARP. ARP risolve sempre il prossimo salto (host di destinazione o router), non la destinazione finale. Un broadcast non esce dalla sottorete: il proxy ARP del router risponde con il proprio MAC.Protocollo ARP →). Chi riceve una richiesta ARP impara il MAC del mittente, e per una destinazione fuori rete la cache contiene il MAC del router. - Cache ARP non aggiornata e proxy ARP. Con due host che si scambiano gli IP, la cache vecchia spedisce i frame ai MAC sbagliati finché la voce non scade. Il proxy ARP su r1 (
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp) risponde al posto di un host di un altro dominio: serve la rotta per quell'host (route add 192.168.10.30/32 eth1), perché il kernel risponde per conto di altri solo agli indirizzi che conosce. - Errori tipici: rotta di ritorno mancante (la richiesta arriva, la risposta no); gateway che non sta in una rete collegata; interfaccia sbagliata (
eth0al posto dieth1); rotta senza prefisso (route add -net 195.11.14.0 gw ...prende la maschera di classe); aspettarsi che un host con maschera/28raggiunga tutta la/24.