venerdì 24 dicembre 2010

Tabella di instradamento

route è il comando in grado di manipolare la tabella di instradamento del kernel (routing table). Cos'è una tabella di instradamento? Niente di complicato, si tratta di una tabella con indirizzi ip usata dall'interfaccia di rete per stabilire l'instradamento dei pacchetti.


Se usato senza opzioni, il comando route stampa sullo standard output la tabella di instradamento in uso. La colonna Destination indica un gruppo di indirizzi ip, quelli cioè che appartengono all'intervallo individuato dall'and logico con la maschera di rete, descritta nella colonna Genmask. La colonna Gateway indica all'interfaccia di rete dove instradare i pacchetti.
Vediamo con un esempio come viene usata la tabella di instradamento: supponiamo che una nostra applicazione generi un pacchetto la cui destinazione sia l'host all'indirizzo ip 93.238.238.124. La prima riga della tabella di instradamento dice che i pacchetti appartenenti all'intervallo 93.238.238.1-93.238.238.255 (ottenuto mediante and logico fra l'indirizzo Destination della tabella di instradamento, 93.238.238.1, e la maschera di rete Genmask, 255.255.255.0, il cui risultato è un qualunque indirizzo ip del tipo 93.238.238.*) non vanno instradati verso nessun gateway. In tal caso i pacchetti dovranno essere instradati all'interno della rete locale!
Supponiamo adesso che una nostra applicazione generi un pacchetto la cui destinazione sia l'host all'indirizzo ip 94.238.238.124. Questa volta il pacchetto non sembra rientrare nell'instradamento (locale) previsto dalla prima riga della tabella di instradamento. Analizziamo pertanto la seconda riga: qui nella colonna Destination non leggiamo nessun indirizzo ip da mettere in and logico con la maschera di rete Genmask, che in tal caso è 0.0.0.0. Il motivo è molto semplice, qualsiasi indirizzo ip messo in and logico con la maschera di rete 0.0.0.0 genera un indirizzo ip del tipo *.*.*.*, in altre parole qualsiasi indirizzo ip! Pertanto se il pacchetto da instradare non rientra nella prima regola (quella locale analizzata in precedenza) occorre instradare lo stesso pacchetto all'indirizzo presente nella colonna Gateway, il router della mia rete con ip 93.238.238.1.
La tabella di instradamento stampata da route, come potete vedere nell'immagine sopra, ci fornisce altre informazioni. Nella colonna Flags ci viene indicato lo stato e/o la tipologia della rotta. Ogni lettera, dunque, ha un suo significato: U, significa che quella rotta è attiva; H, significa che la rotta è verso un host; G, indica che la rotta usa il gateway; R, indica che la rotta per l'instradamento dinamico è stata ripristinata; D, indica che la rotta è stata aggiunta dinamicamente da qualche daemon; M, indica che la rotta è stata modificata dinamicamente da qualche daemon; A, indica che la rotta è stata aggiunta da addrconf; C, indica che la rotta è una voce della cache; !, indica che l'instradamento è respinto. La colonna Metric indica il numero di salti per i pacchetti, mentre la colonna Iface indica l'interfaccia di rete che usa quell'instradamento (le altre colonne non vengono utilizzate dal kernel).
Le opzioni add e del consentono (all'utente root), rispettivamente, di aggiungere e cancellare le rotte per l'instradamento dei pacchetti.
Quando aggiungiamo una nuova rotta dobbiamo fornire tutti i parametri necessari a popolare la riga della tabella di instradamento (se alcuni valori non saranno presenti il comando userà dei valori di default). Vi elenco le opzioni più comuni da usare con add:
  • netmask indirizzo: specifica la maschera di rete;
  • gw indirizzo: specifica l'indirizzo del gateway;
  • metric n: specifica il numero di salti (se conoscete questo valore inseritelo, potrebbe essere usato da qualche daemon che applica un algoritmo di instradamento ottimale);
  • dev nome_dispositivo: specifica il dispositivo che userà la rotta;
  • -net indirizzo: indica che l'obiettivo dell'instradamento è una rete;
  • -host indirizzo: indica che l'obiettivo dell'instradamento è un host;
Ad esempio, il comando sudo route add -host 93.238.238.124 netmask 255.255.255.0 dev wlan0 aggiunge l'instradamento locale, per l'interfaccia di rete wlan0, per tutti i pacchetti nell'intervallo di indirizzi 93.238.238.0-93.238.238.255 verso l'host con indirizzo ip 93.238.238.124. Per cancellare una rotta di instradamento fate seguire all'opzione del l'indirizzo Destination della riga da cancellare. Ad esempio, il comando sudo route del 93.238.238.124 cancella la rotta aggiunta in precedenza.

giovedì 23 dicembre 2010

Seguire i pacchetti con traceroute

Com'è possibile? Il sito web che ho visitato qualche ora fa adesso non è più accessibile! Vi è mai capitata una situazione come quella appena descritta? Prima ancora di iniziare a indagare sul nostro computer vi consiglio di seguire il percorso fatto dai vostri pacchetti per giungere a destinazione con il comando traceroute. Passate al comando traceroute il nome o indirizzo dell'host irraggiungibile e osservate bene l'output prodotto dal comando. Ad esempio, traceroute luca-petrosino.blogspot.com:


Il comando traceroute sfrutta il campo TTL (time to live) assegnato ad ogni pacchetto trasmesso. Quando la nostra interfaccia di rete immette nella rete un pacchetto assegna a quest'ultimo un valore per il TTL (di default pari a 30 salti, da router a router). Tutto ciò viene fatto per evitare loop e cammini senza meta all'interno della rete e per non aggiungere un inutile carico di lavoro per i router che devono indirizzare il pacchetto verso la destinazione. Quando un pacchetto transita per un router (che lo indirizza verso un router più vicino all'host di destinazione, oppure, se il prossimo salto lo permette, all'host finale) il campo TTL del pacchetto viene diminuito di un'unità. Se il TTL di un pacchetto si annulla il router che lo riceve non effettua più l'instradamento a destinazione e invia al mittente un messaggio di errore, notificando l'impossibilità a raggiungere l'host di destinazione.
traceroute mostra i router attraversati dai pacchetti, la prima richiesta passa per l'interfaccia di rete del nostro computer. Nell'output vengono mostrati i nomi degli host e gli indirizzi ip delle interfacce attraversate. Nell'immagine sopra, allora, per nascondere il mio indirizzo ip ho coperto la prima riga con un rettangolo rosso. Tutti i successivi salti sono invece visibili.
Il comando traceroute invia pacchetti UDP (protocollo di trasporto dati) con TTL crescente, generalmente tre pacchetti (simultaneamente), e ne attende la ricezione dei rispettivi messaggi di errore ICMP (internet control message protocol, il protocollo usato per inviare i messaggi di errore), segnandone i tempi (quelli visibili in corrispondenza della riga che fa riferimento all'host attraversato). Un pacchetto con TTL pari a 1 attraverserà pertanto un solo router! Se i pacchetti ICMP in risposta ai pacchetti UDP inviati da traceroute tardano ad arrivare (il comando li attende per almeno 5 secondi) leggeremo sulla riga dell'host da raggiungere il simbolo *. Si tratta di un evento molto importante per stabilire il punto esatto della rete in cui i nostri pacchetti si perdono! In tal caso il problema risiede in uno dei router attraversati in fase di instradamento (oppure dall'eccessivo numero di salti compiuti dal pacchetto, che ne annullano il TTL). Se invece traceroute ci mostra che i pacchetti UDP vengono persi già dopo il primo salto è evidente che il problema risiede nel gateway usato dalla nostra rete.
Attenzione, non tutti i pacchetti inviati seguono lo stesso percorso! Questo influenza sia i tempi di risposta che i router visitati per ogni salto, non dimenticatelo.

mercoledì 22 dicembre 2010

Altre informazioni per le interfacce wireless

In precedenza, quando vi parlavo di come configurare una scheda di rete wireless con iwconfig, ho indicato il comando iwlist come quel comando utile a scoprire quanti canali (e quali frequenze) supporta la nostra scheda di rete wireless. In realtà il comando iwlist ci permette di ottenere anche altre informazioni dell'interfaccia wireless. La sintassi da usare è la seguente: iwlist nome_interfaccia informazione, dove nome_interfaccia (l'etichetta assegnata dal sistema operativo alla scheda di rete wireless) può essere trovata con il comando iwconfig e il parametro informazione fa riferimento all'informazione che vogliamo cercare.
Ecco l'elenco delle informazioni più comuni, per un'interfaccia di rete, che possiamo chiedere al comando iwlist:
  • scanning: ritorna una lista degli acces point rilevati (compresi quelli delle interfacce di rete impostate sulla modalità di funzionamento ad-hoc) dalla scheda di rete wireless;
  • frequency oppure channel: stampa l'elenco dei canali e delle frequenze supportate dalla scheda di rete wireless;
  • keys: lista (codificata) e dimensione delle chiavi salvate per il dispositivo interrogato;
  • event: lista degli eventi supportati dal dispositivo wireless;
  • auth: lista degli algoritmi di codifica supportati (ad esempio WPA, WPA2 etc...) dal dispositivo wireless;

Per una lista completa delle informazioni consultate la pagina del manuale relativa al comando, con man iwlist. Non tutte le informazioni elencate nella pagina del manuale sono disponibili, sta al driver che interagisce con la periferica wireless implementarle. Le informazione elencate sopra sono comunque implementate nella maggior parte dei driver.