Diagnosticare problemi di rete è attività che difficilmente si spiega a parole.
Per essere in grado di affrontare problematiche di rete complesse (ma anche quelle relativamente triviali) sono necessari diversi skill, non tutti tramandabili facilmente:
1 - Solide basi teoriche e conoscenza dello stack TCP/IP.
Inutile fingere, si deve poter diagnosticare in fretta un problema di DNS rispetto a quello dovuto ad un cavo scollegato, un problema di routing rispetto ad un problema dovuto a troppi errori su una interfaccia.
Per farlo, a prescindere dai sistemi usati, è sempre necessario avere in mente network layers e protocolli.
2 - Esperienza.
Come sempre, i trucchi migliori sono quelli che si acquisiscono sul campo e la familiarità con ambienti e dispositivi specifici ci rende più efficaci e rapidi nelle scelte e nelle implementazioni.
3 - Conoscenza degli strumenti a disposizione.
Qui possiamo dare qualche indicazione utile, valida per quasi tutti gli Unix e anche sistemi Windows:
- ping, traceroute, telnet sono utili per diagnosticare problemi di raggiungibilità di sistemi remoti
- ifconfig, route servono per identificare la configurazione di rete corrente ed evidenziare routing particolari o problemi di errori a livello di interfaccia fisica.
- arp e le arp cache sono sempre da considerare quando si cambia IP di una macchina o la macchina associata ad un IP
- netstat è uno strumento flessibile per identificare connessioni di rete attive e errori e statistiche di traffico su IP, TCP, UDP e ICMP.
- tcpdump, snoop e altri sniffer sono fondamentali quando si devono analizzare nel dettagli dei flussi di pacchetti in rete
- nslookup e dig sono fondamentali per diagnosticare problemi di DNS.
Netstat è un comando polifunzionale che ti permettere di verificare le connessioni, le route e statistiche del proprio sistema. Un comando che ogni sys adm deve conoscere alla perfezione, utile per diagnostica e controllo del sistema.
netstat [information-type] [options]
netstat {--help|-h}
Richiama l'help
Per selezionare il tipo di informazioni da visualizzare, bisogna mettere come primo argomento una delle seguenti opzioni. Se non si specifica nulla il comando visualizzera' la lista delle socket aperte, opzione di default.
Information Type
--route , -r
Visualizza le route impostate sul sistema
--groups , -g
Visualizza informazioni riguardanti i multicast group membership (ipv4 e ipv6)
--interface=iface , -i
Visualizza le statistiche di tutte le interfacce o della singola interfaccia specificata
--masquerade , -M
Verifica le connessioni che hanno subito masquerading
--statistics , -s
Visuallizza un sommario di statistiche
Options
--verbose , -v
Abilita il verbose mode.
--numeric , -n
Non risolve gli Ip e il numero delle porte, risparmiando i tempi per query DNS.
--protocol=family , -A
Opzione per specificare l'address family quando si vuole visualizzare le connessioni.
-c, --continuous
Esegue il comando ogni secondo (o ogni intervallo di secondi specificato).
-p, --program
Mostra il PID, ed il nome del programma proprietario della socket. Utile per capire, per esempio, quale programma utilizza una specifica porta TCP.
-l, --listening
Mostra solo le conessioni in LISTENING
-a, --all
Mostra tutte le connessioni (LISTENING e non), se abbinato al flag -i visualizza le informazioni per tutte le interfacce
Visualizzazione dei software che mantengono porte in listening, con relativo indirizzo IP.
root@enigma:/# netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 640/inetd
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 773/mysqld
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 640/inetd
tcp 0 0 192.168.0.2:80 0.0.0.0:* LISTEN 783/httpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 640/inetd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 643/sshd
tcp 0 0 0.0.0.0:631 0.0.0.0:* LISTEN 722/cupsd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 692/master
udp 0 0 0.0.0.0:631 0.0.0.0:* 722/cupsd
...
L'opzione -n visualizza gli indirizzi in formato numerico, -l filtra solamente le porte in stato listen mentre -p visualizza il PID ed il nome del programma che mantiene aperta una determinata porta
Visualizzazione delle statistiche per quanto riguarda la network.
Utili per capire se il vostro server ha problemi, anomalie in ambito network o semplicemente per dedurre quanto traffico ha prodotto la vostra macchina.
[neo@dido neo]$ netstat -s
Statistiche relative ai pacchetti IP
Ip:
14743 total packets received
0 forwarded
0 incoming packets discarded
14385 incoming packets delivered
15907 requests sent out
Statistiche relative ai pacchetti ICMP
Icmp:
6 ICMP messages received
0 input ICMP message failed.
ICMP input histogram:
destination unreachable: 6
6 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 6
Statistiche relative ai pacchetti TCP
Tcp:
1039 active connections openings
0 passive connection openings
0 failed connection attempts
0 connection resets received
2 connections established
14419 segments received
15721 segments send out
145 segments retransmited
0 bad segments received.
25 resets sent
Statistiche relative ai pacchetti UDP
Udp:
169 packets received
2 packets to unknown port received.
0 packet receive errors
180 packets sent
TcpExt:
ArpFilter: 0
567 TCP sockets finished time wait in fast timer
7 packets rejects in established connections because of timestamp
269 delayed acks sent
Quick ack mode was activated 134 times
16 packets directly queued to recvmsg prequeue.
400 packets directly received from prequeue
6182 packets header predicted
16 packets header predicted and directly queued to user
TCPPureAcks: 1336
TCPHPAcks: 1195
TCPRenoRecovery: 0
TCPSackRecovery: 0
TCPSACKReneging: 0
TCPFACKReorder: 0
TCPSACKReorder: 0
TCPRenoReorder: 0
TCPTSReorder: 0
TCPFullUndo: 0
TCPPartialUndo: 0
TCPDSACKUndo: 0
TCPLossUndo: 0
TCPLoss: 0
TCPLostRetransmit: 0
TCPRenoFailures: 0
TCPSackFailures: 1
TCPLossFailures: 0
TCPFastRetrans: 0
TCPForwardRetrans: 0
TCPSlowStartRetrans: 0
TCPTimeouts: 69
TCPRenoRecoveryFail: 0
TCPSackRecoveryFail: 0
TCPSchedulerFailed: 0
TCPRcvCollapsed: 0
TCPDSACKOldSent: 158
TCPDSACKOfoSent: 29
TCPDSACKRecv: 0
TCPDSACKOfoRecv: 0
TCPAbortOnSyn: 0
TCPAbortOnData: 4
TCPAbortOnClose: 34
TCPAbortOnMemory: 0
TCPAbortOnTimeout: 8
TCPAbortOnLinger: 0
TCPAbortFailed: 0
TCPMemoryPressures: 0
Visualizzazione delle route configurate sul sistema.
L'output e' identico al comando route -n , l'unica differenza dei due comandi e' il PATH; ovvero il comando route non e' all'interno dei path settati di default da RH linux per i normali utenti netstat invece si.
Output del comando netstat.
[neo@dido neo]$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.208.0 0.0.0.0 255.255.255.0 U 40 0 0 eth0
Route per i pacchetti che hanno come destinazione la propria network
127.0.0.0 0.0.0.0 255.0.0.0 U 40 0 0 lo
Route per i pacchetti che hanno come destinazione lo
0.0.0.0 192.168.208.254 0.0.0.0 UG 40 0 0 eth0
Route che identifica il default gw
Output del comando route. Da notare che si e' dovuto specificare il path assoluto del comando!
[neo@dido neo]$ route -n
bash: route: command not found
[neo@dido neo]$ /sbin/route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.208.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Route per i pacchetti che hanno come destinazione la propria network
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
Route per i pacchetti che hanno come destinazione lo
0.0.0.0 192.168.208.254 0.0.0.0 UG 0 0 0 eth0
Route che identifica il default gw
Per far funzionare tcpdump su alcuni OS occorrono alcuni accorgimenti.
SunOS con nit o bpf: Permessi di lettura /dev/nit or /dev/bpf*.
Solaris con dlpi: Accesso in lettura e scrittura al network pseudo device, Es. /dev/le.
HP-UX con dlpi: Essere root o tcpdump installato con setuid a root.
IRIX con snoop: Essere root o tcpdump installato con setuid a root.
Linux: Essere root o tcpdump installato con setuid a root.
Ultrix e Digital UNIX: Abilitare il promiscue-mode da root e tramite pconfig abilitare l'utilizzo a tcpdump a chiunque.
BSD: Permessi di lettura a /dev/bpf
Tcpdump è un ottimo sniffer che permette di monitorare il traffico di rete con filtri flessibili per limitare l'output a video secondo varie regole di matching di pacchetti.
tcpdump [ options ] [ expression ]
-a
Tenta di risolvere network e broadcast address
-c [count]
Esegue l'exit dopo aver raccolto tot pacc
-F [file]
Specifica di utilizzare un file in input per le expression
-i
Specifica l'interfaccia da cui sniffare
-n
Non risolve gli indirizzi ip
-nn
Non risolve ne gli ip ne il numero delle porte
-p
Non abilita il promiscuous mode sull'interfacce da cui tcpdump e' in ascolto
-v,-vv,-vvv
Abilita il verbose mode
-x
Printa ogni paccheto sniffato
Le expression servono per limitare il matching dei pacchetti
proto
Specifica il protocollo [tcp,udp,ether etc...]
dst host [host]
Specifica l'host di destinazione dei pacchetti
dst net
Specifica la network di destinazione dei pacchetti
dst port
Specifica la porta di destinazione dei pacchetti
src host [host]
Specifica l'host sorgente dei pacchetti
src net
Specifica la network sorgente dei pacchetti
src port
Specifica la porta sorgente dei pacchetti
`!' o `not'
Simbolo di negazione, ovvero inverte il matching
`&&' or `and'
Simbolo di concatenazione, visualizza il pacchetto che fa il match di tutte le regole concatenate
`||' or `or
Simbolo di alternanza, visualizza il paccheto o con questa opzione o con quest'altra
Quando lanciate il comando tcpdump, su una macchina remota con una sola interfaccia oppure dovete sniffare il traffico dalla stessa interfaccia da cui avete aperto la connessione, dovrete utilizzare dei filtri per evitare di sniffare il vostro stesso traffico telnet o ssh e ricadere in vorticosi loop che rendono l'opera di analisi dei pacchetti improba.
Se mi collego ad un host remoto con SSH, dovro' sniffare tutto tranne i pacchetti con src e dst port 22
[root@morpheus pub]# tcpdump -i eth0 ! port 22
Kernel filter, protocol ALL, datagram packet socket
tcpdump: listening on eth0
[ Traffico sniffato ]
Per Interrompere Ctrl-c
Se devo sniffare ANCHE pacchetti SSH, ma non quelli generati dalla mia connessione posso scrivere (ipotizzando che il mio IP sorgente sia 10.0.0.10):
tcpdump -n -i eth0 ! host 10.0.0.10
(Notare il -n per evitare che venga fatto un DNS reverse lookup dell'IP 10.0.0.10, rendendo inefficace il filtro)
Comando che ti permette di visualizzare e manipolare le voci di arp nella cache del sistema.
Come la maggior parte dei comandi relativi alla network ottiene informazioni dal proc file-system (/proc/net/arp)
Visualizzazione del contenuto di tutta la cache, oppure specificando l'host solo l'arp del suddetto host
arp [opzioni] -a [hostname]
Cancellazzione dell'arp di uno specifico host
arp [opzioni] -d hostname
Creazione manuale di uno specifico arp di un host
arp [opzioni] -s hostname hw_addr [opzioni]
Options
-v, --verbose
Abilita il verbose mode
-n, --numeric
Non esegue il DNS lookup degli indirizzi ip
-H type, --hw-type type, -t type
Specifica quale classe di arp deve visualizzare,cancellare inserire. ( ARCnet (arcnet) , PROnet (pronet) , AX.25 (ax25) and NET/ROM (netrom). Default=ether)
-i If, --device If
Specifica l'interfaccia
-e
Visualizza il risultato in linux standard
TTCP, test TCP è un tool Open Source originariamente scritto da Mike Muuss che permette di verificare le performance (Throughput) della propria network evitando di scrivere o leggere dati su disco dando dunque la possibilità di testare anche network basate su fibra.
Il test si basa sull'invio e ricezione di pacchetti UDP o TCP tramite due host oppure utilizzandolo come "network pipe" , quindi con un terzo host che ha la funzione di inviare e ricevere, è possibile verificare il Throughput di un segmento di network che originariamente per motivi di routing o strutturali non possono colloquiare fra di loro.
Installazione
L'installazione non richiede nessuna particolare attenzione, sia tramite rpm o compilazione dei sorgenti. Per i primi ci si può appoggiare ai vari repository come http://www.rpmfind.net per trovare il package più adatto per i sorgenti si possono trovare in rete in varti ftp server pubblici come
Installazione da RPM
[root@dido root]# wget ftp://216.254.0.38/linux/redhat/9/en/os/i386/RedHat/RPMS/ttcp-1.12-7.i386.rpm
--11:12:45-- ftp://216.254.0.38/linux/redhat/9/en/os/i386/RedHat/RPMS/ttcp-1.12-7.i386.rpm
=> `ttcp-1.12-7.i386.rpm'
Connecting to 216.254.0.38:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done. ==> PWD ... done.
==> TYPE I ... done. ==> CWD /linux/redhat/9/en/os/i386/RedHat/RPMS ... done.
==> PORT ... done. ==> RETR ttcp-1.12-7.i386.rpm ... done.
Length: 12,259 (unauthoritative)
100%[=================================================================================>] 12,259 33.72K/s ETA 00:00
11:12:47 (33.72 KB/s) - `ttcp-1.12-7.i386.rpm' saved [12259]
[root@dido root]# rpm -ihv /home/neo/fastweb/ttcp-1.12-7.i386.rpm
Preparing... ########################################### [100%]
1:ttcp ########################################### [100%]
[root@dido root]# rpm -qil ttcp
Name : ttcp Relocations: (not relocateable)
[...]
Binario
/usr/bin/ttcp
Manual e file README
/usr/share/doc/ttcp-1.12
/usr/share/doc/ttcp-1.12/README
/usr/share/man/man1/ttcp.1.gz
Installazione da sorgenti
[root@dido root]# wget http://www.netcordia.com/tools/tools/TTCP/ttcp.c
--11:22:11-- http://www.netcordia.com/tools/tools/TTCP/ttcp.c
=> `ttcp.c'
Resolving www.netcordia.com... done.
Connecting to www.netcordia.com[63.208.176.20]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19,554 [text/plain]
100%[=================================================================================>] 19,554 60.81K/s ETA 00:00
11:22:12 (60.81 KB/s) - `ttcp.c' saved [19554/19554]
[root@dido root]# gcc -O3 -o ttcp ttcp.c
ttcp.c:539: warning: static declaration for `gettimeofday' follows non-static
Esempi di uso
Qualunque sia la funzione del test o l'invio dati tramite ttcp occorre attivarlo almeno su due host, sul primo in modalità "trasmitter" e il secondo in modalità "receiver".
Abilitazione del receiver tramite l'opzione -r, maggior verbosità con l'opzione -v e l'opzione -s per eviatre che i dati in stdin vengano printati sullo stdout.
La porta di ascolto di default è la 5001
[root@nefertiti root]# ttcp -r -v -s
ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001 tcp
ttcp-r: socket
Abilitazione del trasmitter tramite l'opzione -t , specificando nella linea di comando l'host receiver o l'host che ha la funzione di network pipe e come era per il receiver anche qui l'opzione -s è dobbligo se si vuole effetuare un test.
[root@pippo root]# ttcp -t -v -s 192.168.1.2
Esempio Risulato
Per un considerare un test valido vengono richiesti almeno dieci secondi di trasferimento dati.
ttcp-r: accept from 192.168.1.5
ttcp-t: 16777216 bytes in 408.85 real seconds = 40.07 KB/sec +++
ttcp-t: 16777216 bytes in 0.00 CPU seconds = 1638400000.00 KB/cpu sec
ttcp-t: 2048 I/O calls, msec/call = 204.42, calls/sec = 5.01
ttcp-t: 0.0user 0.0sys 6:48real 0% 0i+0d 0maxrss 0+2pf 0+0csw
ttcp-t: buffer address 0x8050000
Esempio di utilizzo di ttcp come "network pipe"
[root@pippo root]# ttcp -rvs | ttcp -tvs 192.168.1.5
ttcp-r: socket
ttcp-t: buflen=8192, nbuf=2048, align=16384/0, port=5001 tcp -> 192.168.1.5
ttcp-t: socket
ttcp-t: connect
In questo caso tutto il traffico ricevuto dall'host pippo sulla porta 5001 verrà dirottato sull'host 192.168.1.5
Utility per test di network performance per protocollo UDP e TCP.
ttcp -t [-options] host [ < in ]
ttcp -r [-options > out]
Opzioni comuni
-l ##
lunghezza dei buffer da leggere o scrivere sulla network (default 8192)
-u
Specifica di utilizzare il protocollo UDP al posto di TCP
-p ##
Specifica la porta in listening o la porta a cui inviare i pacchetti(default 5001)
-s
Lato receiver i dati ricevuti vengono scartati, lato trasmitter viene specificato di non aspettarsi nulla dallo stdin
-v
Abilita il verbose mode
-d
Abilita il debugging delle socket
-f X
Specifica l'unità di misura: k,K = kilo{bit,byte}; m,M = mega; g,G = giga
Opzioni trasmitter
-n##
Numero di buffers da scrivere sulla network(default 2048)
-D
Setta l'opzione TCP_NODELAY