Lezione interlacciata con [[D. Wireshark]] e [[E. Traceroute]]
È parte di IPv4. Protocollo di livello 3 pensato per segnalare e rilevare errori. Usato solitamente tra i router per segnalare problemi su un link, problemi di frammentazione, regole di routing, ecc. Ma anche gli host, solitamente dal LV4, inviano messaggi ICMP.
È un metodo best-effort per segnalare che qualcosa non funziona: non rende IP affidabile. Es: un datagramma può essere perso senza garanzie che un messaggio di controllo venga inviato.
Non vengono mai mandati messaggi ICMP riguardanti altri messaggi ICMP per evitare effetti valanga. Inoltre, per i datagrammi frammentati vengono inviati messaggi di controllo solo sul primo frammento (offset = 0) del datagramma, non sui successivi.
Esistono diversi comandi che usano ICMP (o sue varianti):
ping
usa echo request e repy per debuggare la retetraceroute
sfrutta ICMP per ottenere informazioni in maniera indiretta
Campi: | type | code | checksum | data |
Ricorda che questo header è inserito successivamente all'header IP (dove
#Prova sperimentalmente: ping IPQUALSIASI
Vedrai che ICMP echo aggiunge un numero di sequenza i pacchetti inviati (oltre a un numero identificativo), cosa non fornita dal puro IP.
Il campo data
, ovvero il payload dei pacchetti ICMP, è generato in modo random. Nel caso di echo request-reply la risposta deve contenere lo stesso payload della richiesta. Questo aiuta a rilevare eventuali corruzioni.
Il campo type dei messaggi ICMP definisce 17 tipi di messaggi:
- 0 echo reply
- 3 destination unreachable
- 4 source quench
- 5 redirect
- 8 echo (request) -> ogni host che riceve una echo request deve rispondere con echo reply
- 11 time exceeded
- 12 parameter problem
- 13 timestamp
- ...
- 16 information reply
#Nota esistono messaggi *fragment too big
Utilizzato per informare che è impossibile raggiungere una certa destinazione
L'indirizzo IP sorgente del pacchetto ICMP è l'indirizzo IP del gateway/router/host che invia il pacchetto.
I campo code declina i seguenti errori:
- 0 network unreachable -> next hop sconosciuto
- 1 host unreachable -> host non raggiungibile a livello H2N
- 3 port unreachable > impossibile usare la porta indicata. Unico messaggio inviato da un host, non da un router.
#Nota non sono solo errori di destinazione a livello IP
Segnalazione inviata da un router quando il tempo di vita (TTL) di un pacchetto scade, per cui il router è costretto a scartarlo.
#Prova con topologia (slide 12) ciclica, con regole di routing cicliche.
type = 3, appartiene alla famiglia unreachable. Non definito in RFC792, estensione RFC4884
Scenario: host1 -l1- router -l2- host2
, con l1 (link1)'s MTU > l2's MTU. In particolare MTU1=1500, MTU2=600
Invio ping -M do -s 1000 192.168.2.1
-s
size -> dimensioni in byte del pacchetto che si vuole inviare-M do
don't fragment.M
serve a selezionare la strategia di path MTU discovery:do
proibisci la frammentazione, anche a livello locale (+ livello remoto con don't fragment = 1)want
esegui PMTU discovery, frammenta il pacchetto quando la dimensione è troppo grandedont
non impostare il flag don't fragment
Risultato: ping: local error: message too long, mtu=600
-> local perché localmente non viene frammentato, a causa del rigido argomento -M do
Struttura:
| type=3 | code=4 | checksum |
| unused | length | next-hop MTU |
| ... |
#Nota il pacchetto Packet too big segnala esplicitamente l'MTU che ha causato l'errore.
ip route get 192.168.2.1
Il verbo get
permette di visualizzare configurazioni dinamiche appese a quelle statiche/permanenti.
Ad esempio cache expires 572sec mtu 600
-> il SO fa caching della dimensione minima dell'MTU incontrata sulla rotta.
#Attenzione a non pestarti i piedi. Se configuri un rete/un router per scartare pacchetti che superano l'MTU, in modalità stealth (no ICMP messages).
#Esercizio ICMP Packet too big, alla slide 24. Juice: ifconfig eth0 192.168.1.1/24 mtu 1500
Usati per segnalare a un host o a un router che esiste un router contattabile direttamente dalla sorgente per ottenere una rotta più efficiente. Capita tipicamente che la risposta venga inviata da un router sulla stessa rete del mittente, se R si accorge che sta inviando il pacchetto di nuovo sulla rete del mittente, permettendo all'host mittente di accorgersi che non era necessario passare per il router che ha inviato host redirect per arrivare a destinazione.
#Nota il percorso di andata può essere diverso da quello di ritorno
Se l'host accetta il pacchetto redirect viene cambiata dinamicamente la sua regola di routing -> conservata nella cache.
Spesso capita quando vengono scelte regole di routing spicciole.
#Nota accettare pacchetti redirect potrebbero causare problemi di sicurezza. Per prevenire attacchi MITM si disabilitano le seguenti regole:
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
La configurazione di default prevede che vengano accettati host redirect solamente da gateway listasti nei router di default.