Lo strato applicativo di Internet

Investigazioni di Rete

Trattiamo ora di alcuni strumenti utili per verificare la corretta configurazione degli host sia nella nostra rete, che remoti, e che possono aiutare di molto il compito di diagnosticare malfuzionamenti e problemi, investigare sulle possibili soluzioni, e svelare chi contattare.

Arrivo fin lì? Tu ci sei? Pronto?

Quando in un computer, abbiamo configurato

non ci resta che verificare se possiamo collegarci o meno. Per questo possiamo fare uso del programma ping (man page), che invia dei pacchetti ICMP echo, ne riceve la risposta, e ci informa del ritardo intercorso. Può essere usato per

Analizzando questo capture, possiamo verificare il traffico prodotto durante l'esecuzione di un ping.

Ora, sperimentiamo gli strumenti per la scoperta dei servizi attivi su uno o più computer della nostra rete.

Controllo delle intrusioni

L'intrusion detection è un aspetto di Network Security spesso trascurato dagli amministratori di rete (ammesso che, nelle piccole realtà, siano previsti), almeno finchè non si è oggetto di un serio attacco informatico. L'approfondimento della questione non è tra gli scopi di questo corso; ci limitiamo quindi ad indicare in Nessus uno degli applicativi più usati a questo scopo. Analizziamo invece ora una serie di strumenti più di base, ma che potremmo definire indispensabili.

Su quali porte stanno ascoltando, i miei servizi?

Mentre con il comando ps possiamo scoprire quali programmi sono in esecuzione presso il nostro computer, ma non cosa fanno, il comando

netstat -n --udp --tcp -p -l

ci mostra su quali numeri di porta (-n) udp e tcp ci sono programmi in ascolto (-l), indicando il PID ed il nome del programma (-p) che ha aperto il socket. Per lo stesso comando, sono possibili diverse combinazioni di opzioni, in grado di mostrare anche i socket non in ascolto (omettendo -l), mostrando il relativo stato, o di mostrare i socket unix, oppure ancora di mostrare le informazioni di instradamento (netstat -r)

Quale programma sta ascoltando su questa porta?

L'opzione -p di netstat, che ci mostra PID e nome del programma connesso al socket, è di introduzione recente, per la sola architettura Linux; altrimenti, una volta noto un numero di porta, si può ricorrere al comando

fuser -n tcp -v numero_di_porta

che ci mostra il nome del programma che sta usando il numero di porta specificato. Anche in questo caso, le opzioni della chiamata possono variare: ad es. l'opzione -n udp ci permette di interrogare il namespace udp, o (-n file) quello dei descrittori di file.

Nmap e Zenmap

Dopo aver investigato il proprio computer, può venire la voglia di curiosare in quello degli altri, e questo può essere fatto analizzando il tipo di risposta che il kernel invia, nel caso in cui presso una certa porta, ci sia un programma in ascolto o meno. Si badi che questo tipo di analisi non rappresenta necessariamente una azione di attacco, anzi, al contrario, permette ad un amministratore di verificare lo stato di salute (o di compromissione) delle macchine della propria rete.

Ad esempio se un virus ha infettato un computer, può mettersi in ascolto su di una porta non prevista, permettendo ad un attaccante di conettercisi, ed eseguire azioni da remoto. Per questo, un amministratore che voglia proteggere le proprie macchine da sguardi indiscreti, provvederà senz'altro a configurare un firewall che ne impedisca la raggiungibilità.

Un modo semplice di verificare su quali porte di un computer terzo vi siamo programmi in ascolto, ci viene offerto dal programma nmap (sito, man in italiano), che è eseguibile anche per mezzo del suo front-end grafico Zenmap, (precedentemente chiamato nmapfe). Zenmap ha l'aspetto mostrato sotto, in cui è evidenziato il campo Target in cui inserire l'indirizzo del computer da esaminare, ed il campo Profile che determina il tipo di analisi da effettuare; quindi, nella finestrella Command è mostrato il risultato, ovvero le opzioni con cui il comando nmap sarà effettivamente invocato.


Al momento della scrittura di questo testo, la versione di sviluppo (4.85) di Zenmap contiene già caratteristiche molto più avanzate di quelle presenti nella versione (4.62) presente nella distribuzione Linux Ubuntu 8.10 in uso, quindi si preferisce non entrare nella descrizione dei suoi dettagli, e limitare i commenti a solo alcune delle possibili opzioni con le quali invocare nmap, mediante il formato generale

nmap [Tipo di scan] [Opzioni] {specifica del target}

rimandando alla guida di riferimento per la descrizione competa delle possibilità di utilizzo.

Tipo di scan

L'opzione -s permette di specificare uno tra diversi Tipi di scan capaci utilizzare tecniche diverse per investigare a riguardo degli host target, e di seguito se ne descrivono le principali:

Nella stessa invocazione di nmap, possono essere contemporaneamente specificati più tipi di scan.

Intervallo delle porte

A parte il caso di Ping Sweep, in cui l'intenzione è quella di determinare se un computer remoto è in rete o meno, negli altri casi lo scan è orientato alla scoperta dei servizi in esecuzione sul target, ed è possibile specificare l'intervallo delle porte da esaminare, potendo ad es. scegliere tra

Indicazione del target

Possiamo specificare

e nel secondo e terzo caso, lo scan sarà ripetuto per tutti gli host indicati.

Stato delle porte

In funzione della presenza o meno di un programa in ascolto sulle porte esplorate, e della presenza o meno di un firewall tra i due computer, lo stato della porta può essere classificato come

Esperimenti di portscan

Proviamo a sperimentare l'uso di nmap, lasciando aperti sui nostri computer i programmi server (server, listener e selectserver) che ricordiamo, sono rispettivamente in ascolto sulle porte TCP 3490, UDP 4950 e TCP 9034.

  1. Proviamo a dirigere un SYN Scan (opzione -sS) verso le porte 0-10000 di 127.0.0.1, ed impostando l'opzione (opzione -r) Ordered Ports. Riusciamo ad individuare i servizi attivi? ne troviamo aperti altri? Quali?
  2. Durante lo scan, teniamo aperto Wireshark. Cosa accade ?
    1. Se richiediamo che lo lo scan avvenga con porte ordinate, ci è facile individuare che al pacchetto 5700 si trova il SYN diretto verso la porta 3490, dove è in ascolto server, che a differenza delle altre porte, risponde SYN, ACK anziché RST, ACK, dopodiché nmap interrompe la connessione con un RST.
  3. per scoprire i servizi offerti in UDP, selezioniamo UDP Port Scan (opzione -sU)
  4. mediante wireshark, etherape, tcpdump, iptraf, scopriamo qualche altro computer nella nostra stessa rete, scegliamone uno, e ripetiamo lo scan. Quali sono i servizi che troviamo attivi? Quindi, indirizziamo lo scan all'intera rete, lanciando nmap con l'opzione -sP e target 192.168.0.0/24. Mediante Wireshark, notiamo qual'è la tecnica usata da nmap.
  5. effettuiamo ora uno scan verso un computer fuori della nostra rete, ad esempio 151.100.122.122. Notiamo nuovi messaggi ? cosa vuol dire filtered ports ? (verifichiamolo con Wireshark).

Il percorso dei nostri pacchetti

Abbiamo parlato di come l'ICMP può essere usato dal programma traceroute per scoprire, utilizzando dei time to live via via crescenti, la sequenza dei router attraversati per raggiungere una determinata destinazione. Questo capture riporta il traffico prodotto durante l'esecuzione di un traceroute indirizzato verso www.fasthit.net, un service provider australiano.

Presso traceroute.org è possibile eseguire un traceroute che parte da svariate località del mondo, verso il nostro computer. Partiamo ad esempio dalla Cooperativa Telefonica Pinamar Ltda che si trova in Argentina, e

  1. contiamo quanti salti è possibile visualizzare;
  2. notiamo i nomi delle macchine attraversate. Notiamo che per alcuni hop, sono elencati più router, in alternativa tra loro;
  3. facciamo caso ai tempi che sono mostrati.
  4. Osserviamo infine, qual'è l'ultimo router che riusciamo a raggiungere, e l'IP ad esso associato, differente dal nostro. Perchè ?
  5. proviamo ora a fare il tragitto inverso, eseguendo traceroute a partire dal nostro computer. Facciamo lo stesso percorso ?
  6. mentre proviamo il traceroute che parte dal nosto computer, possiamo tenere aperto Wireshark, ed esaminare cosa avviene
    1. una alternativa a traceroute è tracepath, che realizza anche la funzione di path MTU discovery
    2. da notare anche xtraceroute (vedi anche, man), che offre una visione tridimensionale del globo, e tenta di localizzarvi i router incontrati per la strada

Qualora ci si trovi dietro un firewall che blocca i pacchetti ICMP, oppure se gli operatori di rete che gestiscono i router intermedi non generano, o bloccano, le risposte icmp time to live exceeded, possiamo provare ad usare

  1. finalmente, possiamo confrontare il percorso per il Cile, con quello dal Cile verso di noi.
  2. catturando con Wireshark il traffico generato da tcptraceroute e mtr, possiamo studiarne il funzionamento.

Presso cybergeography si trova una interessante rassegna di links a siti e strumenti che svolgono un compito simile, di cui alcuni sviluppati in java, alcuni non più raggiungibili, ed altri che integrano ulteriori funzionalità, come la ricerca whois. Un altro sito (Morgan) offre (oltre a diverse altre cose utili) un servizio di traceroute da loro verso di noi, senza mappatura geografica, ma con la visualizzazione del dove si generano i maggiori ritardi.

A quanto vado?

Come discusso altrove, il TCP fa del suo meglio per adeguare la finestra di trasmissione all'RTT stimato per l'instradamento IP tra sorgente e destinazione, in modo da massimizzare la velocità di trasmissione, altrimenti nota come throughput, che può quindi raggiungere un massimo teorico pari a

Max. Throughput = TCP Window Size / Round-trip time

Ad esempio, considerando che la massima ampiezza di finestra del TCP è pari a 65,535 bytes (a meno che non sia attiva l'opzione window scale), un instradamento con RTT di 220 msec permette di conseguire una velocità pari a 65535 bytes / 0.220 s = 297886.36 bytes/s = 2.38 Mbit/s. D'altro canto, non è affatto detto che tutti i singoli links attraversati possiedano una tale capacità, e dunque il throughput può essere inferiore.

In tal caso la strategia di controllo congestione del TCP impedisce alla finestra di trasmissione di aprirsi completamente, in quanto la coda di uscita del router connesso al link con capacità minore vincola il massimo ritmo a cui sono inviati i pacchetti, e di conseguenza quello dei rispettivi riscontri. Trasmettere a velocità maggiore causa presto una perdita di pacchetti in tale coda, facendo intervenire i meccanismi di controllo congestione.

L'unico modo per conoscerne il valore effettivo della velocità è di misurarlo, facendo uso di una coppia di programmi client-server posti ai due estremi del collegamento, che realizzano una connessione TCP greedy (letteralmente, avido), e che al tempo stesso valutano ad intervalli di tempo regolari la quantità di dati scambiati, e determinano sia la velocità media, sia come questa evolve nel tempo. Questo è l'approccio seguito da siti come Speedtest, che poi conserva i valori misurati presso Netindex permettendo interessanti confronti.

Esperimento Netkit

Allo scopo di sperimentare questo tipo di misura, scegliamo di usare iperf (wikipedia), e di operare il test su di un ambiente di rete simulato come quello offerto da netkit. Per questo, dopo aver inizializzato le variabili di ambiente, copiamo presso il nostro computer la configurazione posta nella directory /media/netkit/labs/labthru (versione on-line), e rendiamo eseguibile (se non lo è) il file iperf. Come possiamo osservare, si tratta di una unica LAN su cui si affacciano tre host, r1 r2 ed r3, con indirizzi IP rispettivamente pari a 30.0.0.1, 30.0.0.2, e 30.0.0.3. Nella stessa directory si trova anche il file eseguibile iperf, che può quindi essere invocato da parte delle VM come /hostlab/iperf, e infatti, nei file di startup delle tre VM sono presenti (oltre ai comandi per configurare le interfacce di rete) anche quelli per lanciare iperf, specificando gli opportuni parametri in modo che su r1 iperf operi in modo server

/hostlab/iperf -s

e su r2 e r3 in modo client

/hostlab/iperf -c 30.0.0.1 -t 8 -i 1

Infine, mentre su r1 è anche lanciato tcpdump

tcpdump -i any -s 0 -w /hosthome/cattura.pcap

in modo da salvare il traffico osservato nel file cattura.pcap presso la home della macchina host, su r2 e r3 sono impostati degli intervalli di attesa in modo che il traffico generato sia in parte indipendente, ed in parte sovrapposto temporalmente.

Lanciamo le tre VM con il comando lstart -f, permettendo a queste (in virtù dell'opzione -f) di partire in contemporanea. Osserviamo l'evoluzione dei comandi nelle tre finestre terminali, ed al termine degli iperf client, prendiamo nota delle porte effimere da loro usate, e killiamo il tcpdump in esecuzione su r1.

Possiamo ora aprire il file cattura.pcap con Wireshark (è grande!) e richiedere Statistics/IOGraph, impostando quattro display filter come mostrato a fianco con le porte effimere usate dai client, e ottenendo un grafico mostrato sotto


A quanto pare, il throughput conseguito si arresta poco sotto al valore di 100 Mbit/sec, che potrebbe dipendere dalle limitazioni imposte dal virtualhub che interconnette le VM di Netkit. I client sono configurati per produrre 8 secondi di traffico, ma probabilmente per effetto dello slowstart del TCP, nei primi due secondi il throughput di r2 non raggiunge la velocità massima; per quanto riguarda r3 inoltre, anche se i suoi pacchetti dovrebbero iniziare attorno al terzo secondo, a quanto pare il traffico non inizia veramente finché non termina quello prodotto da r2, nei confronti del quale (a partire dal sesto secondo) opera addirittura una azione di contrasto. Questo fenomeno può essere interpretato considerando che, in presenza di un traffico molto elevato in una direzione del collegamento, anche gli ACK nella stessa direzione sono ostacolati e possono venir perduti, impedendo di fatto anche il traffico entrante.

Iperf su rete locale

Ripetiamo l'esperimento precedente utilizzando tre computer nella stessa LAN, di indirizzo 192.168.100.156, 157 e 234: sui primi due eseguiamo l'applicazione client, e sul terzo quella server, con le stesse opzioni prima indicate. Il risultato è salvato in questo nuovo file di capture (più di 130 MB) che analizzato con Wireshark, permette di visualizzare l'andamento

iperf-lan

Osserviamo come al quarto secondo inizi il traffico proveniente dal secondo computer (linea verde), entrando subito in competizione con quella dal primo (linea rossa): come possiamo osservare, dopo una iniziale oscillazione, la ripartizione della banda del collegamento tra i due flussi non risulta equa. Dopo aver cliccato su di un pacchetto del primo flusso, sperimentiamo l'opzione di wireshark Statistics/TCP stream graph/Throughput Graph in modo da osservare l'evoluzione della velocità; cliccando ora su di uno dei punti, possiamo posizionare l'elenco dei pacchetti in corrispondenza del preciso pacchetto.

Proviamo ora ad analizzare ciò che avviene quando i due flussi iniziano a competere: al pacchetto 47247 osserviamo la notifica dell'evento TCP previouos segment lost, dedotto da Wireshark in quanto il numero di sequenza 47020233 non corrisponde al precendente più la dimensione del segmento MSS, pari a 47017337 + 1448 = 47018785. Il motivo della perdita risiede probabilmente nella coda FIFO della porta di uscita dello switch collegata all'iperf-server, che ora non è più in grado di smaltire il nuovo volume di traffico. La perdita determina gli ACK ripetuti osservabili ai pacchetti n. 47250, 47254, e 47257, e poi si assiste ad una sequanza di ben 155 ACK duplicati, arrivando al pacchetto n. 47805, poiché evidentemente sono stati nel frattempo ricevuti i pacchetti già presenti nella code di uscita. Finalmente al pacch. n. 47808 viene reinviato il segmento con n. di seq. 47018785, indicato come Fast retransmission. Da quel momento inizia una fase in cui gli ACK indicano i numeri di sequenza attesi, che quando ricevuti sono indicati da Wireshark come Out-Of-Order segment.

Traffic shaping

Potrebbe essere interessante sperimentare gli effetti di una limitazione della velocità di trasmissione, allo scopo di meglio simulare situazioni come ad es. il collegamento al proprio ISP via ADSL: purtroppo sembra che il kernel compilato per Netkit non comprenda i moduli che implementano le discipline di coda qdisc necessarie al comando tc. Neanche trickle, che offre un meccanismo di shaping operante in user space, sembra compilarsi correttamente in Netkit, e quindi forse l'ultima possibilità può essere quella di invocare l'opzione --limit-rate= del comando wget.

Chi è chi?

Per quanto riguarda gli indirizzi IP ed i numeri di sistema autonomo, questi sono registrati presso i Registri Internet Regionali (RIR): ce ne sono 5 nel mondo, dislocati nei continenti. Gli Internet Service Provider (ISP), a loro volta, si rivolgono ai RIR per vedersi assegnate risorse di questo tipo. In supporto all'ICANN, si è creato il Number Resource Organization (NRO) allo scopo di coordinare i cinque RIR.

Whois

E' un comando che si immette da tastiera sui sistemi Unix, che implementa il protocollo descritto dalla RFC 3912 operante via TCP su porta 43, e che permette di risalire alle informazioni riguardanti gli intestatari dei domini, degli indirizzi IP, e dei sistemi autonomi. In linea di principio, eseguendo whois per i router descritti da traceroute, potremmo risalire a tutte le organizzazioni da ringraziare per l'inoltro del nostro traffico Internet. Proviamo quindi ad iniziare questa ricerca, partendo dalla nostra rete locale.

Ma il comando whois effettua anche ricerche sui domini:

Riferimenti

x
Logo

Lo Strato Applicativo
di Internet

Dal TCP al VoIP, dal DNS all'Email alla crittografia, tutto ciò che accade dietro le quinte di Internet, completo di cattura del traffico.
Scopri come effettuare il download, ricevere gli aggiornamenti, e contribuire!


Realizzato con Document made with Kompozer da Alessandro Falaschi -
Capitolo: Domain Name System