Salta al contenuto
Note per Studenti Routing statico in Katharà

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):

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]=C

Lettura: 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.

bash
# 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 B

Ogni 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).

bash
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 unreachable

Il 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.

bash
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.0 e maschera 0.0.0.0 (cioè 0.0.0.0/00.0.0.0/0, che contiene tutti gli indirizzi). Si usa quando nessuna rotta più specifica corrisponde.

bash
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).

bash
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 eth0

Esempio. 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

bash
root@pc1:~$ ping 100.0.0.10        # eth1 di r2
7 packets transmitted, 0 received, 100% packet loss

Nessuna risposta, eppure la richiesta c'è: si controlla sniffando su eth1 di r2 mentre pc1 fa il ping.

bash
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 3

Opzioni: -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 ping senza risposta non dice che l'andata sia rotta: bisogna sniffare ai due estremi.

Esempio. La richiesta pc1 →\to r2 funziona perché pc1 ha il default verso r1 e r1 conosce la rete 100.0.0.8/30. La risposta r2 →\to 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.

bash
r2:~# route add -net 195.11.14.0/24 gw 100.0.0.9 dev eth1

Formula (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 2424, raggiungibile tramite 100.0.0.9100.0.0.9 (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    eth1

Simmetricamente su r1 (rete di pc2 tramite l'eth1 di r2):

bash
r1:~# route add -net 200.1.1.0/24 gw 100.0.0.10 dev eth1

A questo punto i due PC si vedono.

bash
root@pc1:~$ ping 200.1.1.7
64 bytes from 200.1.1.7: icmp_seq=1 ttl=62 time=1.05 ms

Proprietà (TTL e router attraversati). Ogni router che inoltra un datagramma sottrae 11 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 TTL=64\text{TTL}=64, a destinazione arriva con 64−n64-n, dove nn è il numero di router attraversati.

Esempio. La risposta di pc2 a pc1 passa per r2 e r1: 64−2=6264-2=62, esattamente il ttl=62 della cattura. Verso un'interfaccia di r1 il TTL resta 6464 (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 00: 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 (/0/0) è 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 2424) 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 2424 e 00, vince il più lungo, 2424.

Esercizi proposti dalle slide

La rotta predefinita scritta come rotta statica. route add default gw 195.11.14.1 dev eth0 equivale a

bash
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 0.0.0.00.0.0.0, prefisso 00, gateway 195.11.14.1195.11.14.1, interfaccia eth0).

Router con sole rotte predefinite. Nella rete di questo laboratorio i router hanno un solo vicino, quindi basta una rotta predefinita ciascuno:

bash
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 r1

Tabella 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    eth1

Funziona 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 00. È 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):

bash
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 pc2

Bastano 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 192.168.20.192/28192.168.20.192/28 ha maschera 255.255.255.240255.255.255.240, broadcast 192.168.20.207192.168.20.207 e host da .193.193 a .206.206 (verificato con Python). In binario l'ultimo ottetto della maschera è 111100002=24011110000_2=240: i primi 44 bit sono di rete, gli ultimi 44 dell'host (24=162^4=16 indirizzi, da 192192 a 207207, di cui 1414 host). Con l'AND: 193=110000012→11000000=192193=11000001_2\to11000000=192; 206=110011102→192206=11001110_2\to192; 207=110011112→192207=11001111_2\to192 (broadcast); invece 1=000000012→01=00000001_2\to0 e 254=111111102→240254=11111110_2\to240: quindi pcA e pcD non sono nella rete 192192 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 192.168.20.0192.168.20.0–.255.255 siano locali: mandano ARP e frame direttamente a pcB e pcC;
  • pcB e pcC (/28) credono locali solo .192.192–.207.207: per pcA e pcD non hanno nessuna rotta.

Risultato, host per host (calcolato con Python):

Da →\to a Andata Ritorno Esito
A ↔\leftrightarrow D locale locale funziona
B ↔\leftrightarrow C locale locale funziona
A o D →\to B o C il frame arriva B o C non hanno rotta verso A o D fallisce
B o C →\to 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 192.168.20.1192.168.20.1, che non è nella sua /28/28. 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.

bash
route add -net 192.168.20.0/24 dev eth0   # su pcB e su pcC: la /24 è sullo stesso dominio, nessun gateway

pcA e pcD non hanno bisogno di nulla. Grazie al prefisso più lungo, il traffico B ↔\leftrightarrow C continua a usare la rotta /28/28.

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     eth0

Approfondimento: 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:

  1. 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 (src 200.1.1.7, dst 195.11.14.5) viaggia nel frame con MAC di pc2 e di r2.
  2. Dominio B: r2 consulta la tabella, trova il next hop 100.0.0.9 e fa ARP per quello (who-has 100.0.0.9 tell 100.0.0.10).
  3. 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 1616 (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 →): 200=12⋅16+8→C8200=12\cdot16+8\to\text{C8}; 100=6⋅16+4→64100=6\cdot16+4\to\text{64}; 10→0A10\to\text{0A}; 195=12⋅16+3→C3195=12\cdot16+3\to\text{C3}; 14→0E14\to\text{0E}; 11→0B11\to\text{0B}.

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 eth1 e si attiva il proxy ARP su r1 con echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp (e lo stesso per eth1): r1 risponde all'ARP con il proprio MAC, e nella cache di pc1 l'IP di pc3 compare con il MAC di eth0 di 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 ping arriva, la risposta no.
  • Mettere come gateway un indirizzo che non sta in una rete direttamente collegata.
  • Dimenticare dev eth1/l'interfaccia o confondere eth0 con eth1.
  • 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

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.

Proprietà (corrispondenza più specifica). Se più rotte contengono l'indirizzo, vince quella con il prefisso più lungo (longest prefix match). Il default, /0/0, vince solo se non c'è altro. Esempio: su r2 195.11.14.5 corrisponde a 195.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 eth0 equivale a route 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 come 8.8.8.8 rimbalza tra r1 e r2 finché il TTL arriva a 0. Per questo i router con più vicini usano rotte specifiche.
bash
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

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata