Problemi di rete ecco le migliori soluzioni | Linuxiano.it
Privacy Policy

Problemi di rete ecco le migliori soluzioni

Problemi di rete:

riga di comando

Come gestire da campioni i blocchi dela rete con le vostre armi più fidate: netstat, netcat e lsof.
Esistono tre strumenti da riga di comando legati al networking che approfondiremo in questo articolo: netstat, netcat e lsof. Netcat (nc)è un utility unix molto utile e potente che legge e scrive dati su connessioni di rete, attraverso TCP e UDP. Per funzionare la maggioranza delle opzioni a riga di comando non richiedono privilegi di root, cosa molto comoda in caso non aveste accesso amministrativo alla macchina. Potete installare facilmente netcat su un sistema Debian eseguendo:

Terminale
  • sudo apt-get install netcat-traditional
C’è un implementazione leggermente diversa che può essere instalata con il pacchetto netcat-openbsd. Quest’ultima versione supporta IPv6, proxy e i socket Unix, mancantinella versione tradizionale. Se non fate uso di tali caratteristiche non noterete differenze tra le due varianti. L’utility lsof è stata creata da Victor Abel per visualizzare elenchi di file aperti. Dal momento che in Unix ogni dispositivo è un file, lsof può gestire anche interfacce di rete e mostrare informazioni sulle connessioni di rete. Potete installare lsof in un sistema Debian con il comando:
Terminale
  • sudo apt-get install lsof
Netstat, al contrario, è uno strumento standart presente in tutte le installazioni Unix. Il consiglio che segue si applica e tutte le tre utility: le porte 0-1024 sono ad accesso imitato e possono essere usate solo dall’utente root, quindi è meglio evitare di usarle e sceglierne altre, posto che non siano già in uso da un processo diverso. Se avete privilegi di root potete usare le porte che volete. Tutti questi comandi si imparano meglio usandoli invece che leggendo le istruzioni, quindi durante la lettura di questo articolo cominciate a sperimentare.

Usare netcat

La forma generale di netcat è netcat (opzioni) host porta. L’uso più frequente di netcat è per risolvere problemi su servizi remoti. La singola opzione più importante di netcat è -u che permette a netcat di lavorare in modalità UDP, come sever o come client. Ciò significa che netcat è in grado di controllare connessioni UDP, cosa molto importante perché telnet può lavorare solamente con connessioni TCP. Se -u non è presente, netcat userà TCP. Il comando

Terminale
  • netcat -vv -u 8.8.8.8 53
Problemi di rete
prova a controllare la funzionalità di un server DSN usando UDP se combinate le opzioni -l e -u time yes | nc.traditional -vv -n 192.168.10.108. La seconda opzione più importante è -v che rende l’output di netcat più verboso. Se volete ancora più output potete usare -vv
al posto del solo -v. Il comando
Terminale
  • ncunWebserver 80
farà collegare netcat a un server Web.
Per simulare il resto della parte client della connessione dovrete scrivere:
Terminale
  • GET / HTPP/1.1
e premere il tasto invio due o tre volte. La prossima versione fa tutte queste cose in una volta senza richiedere ulteriori azioni:
Terminale
  • echo -en “GET / HTTP/1.0\n\n\n”| netcat www.linuxpro.it 80

La prossima tecnica deve essere usata con molta attenzione dal momento che può compromettere la sicurezza di un sistema Linux, se usata impropriamente. Netcat vi dà la capacità di trasformare qualsiasi processo Linux in un sever con l’aiuto del parametro -e. Un ottimo candidato come processo server è l’eseguibile /bin/bash. La parte server dovrebbe iniziare con:
Terminale
  • nc -vv hostRemoto 5432.
Dopo avere eseguito l’ultimo comando potete cominciare a lanciare comandi come se foste nella macchina remota. Il problema comunque non dispone di alcuna forma di crittografia. Lo screenshot qui sotto mostra come sia possibile usare netcat per controllare la velocità di rete tra le due macchine Linux:un altro uso intelligente dello strumento!

Usando l’utility bc potete anche scoprire che la velocità di rete era di circa 22.980.367 byte per secondo, piuttosto buono per una rete locale. Come capirete, netcat è più appropriato per provare la corretta operatività di una rete e dei servizi che girano sui vari server. Il prossimo strumento, lsof, è più appropriato per controllare l’operatività di una macchina locale.

Usare lsof

I due svantaggi di lsof sono il primo, vi servirà l’accesso da terminale alla macchina sulla quale volete lanciare lsof e per girare richiede privilegi di root. Per la maggior parte del tempo non lancierete lsof senza parametri da riga di comando, poiché l’output prodotto sarebbe troppo difficile da leggere:

Terminale
  • lsof | wc

62174 615484 7945295

Se scrivete semplicemante lsof come normale utente Linux, ci saranno diverse righe contenenti il messaggio Permission Denied per avviarvi che anche c’è un processo visibile, che potete visualizzare anche con il comando ps, non avete i permessi richiesti per leggerlo completamente.
Mysqld 31393 31407 mysql rtd unknown /proc/31393/task/31407/root (readlink: Permission Denied)
L’opzione -i indica a lsof di visualizzare informazioni riguardo la rete. In questo modo, quando l’utente root lancia il comando:

Terminale
  • lsof -i
otterrà tutti i file di rete internet.
L’output di lsof è una serie di colonne. La colonna PID mostra l’ID del processo,mentre la colonna USER mostra l’utente proprietario del processo. La colonna TID mostra il task ID e un TID vuoto indica un processo. La colonna FD sta per file descriptor i valori presenti possono essere cwd, txt, mem e nmap. La colonna TYPE mostra il tipo di file: regolare, directory, socket, ecc. La colonna DEVICE contiene i numeri separati da virgole, il valore della colonna SIZE/OFF è la dimensione del file o il file offset in byte. Il valore della colonna NODE è lo unix node number. Infine, la colonna NAME mostra il nome del punto di mounte del file system nel quale il file risiede, o l’indirizzo internet.
Gli stati possibili per una connessione TCP sono LISTEN, CLOSED, ESTABILISHED, SYN-SENT, SYN-RECIVED, CLOSE-WAIT, LAST-ACK, FIN-WAIT-1, FIN-WAIT-2, CLOSING e TIME-WAIT. Per capire quale eseguibile ascolta in una specifica porta usando TCP, dovete lanciare il comando:
Terminale
  • sudo lsof -nP-iTCP -sTCP:LISTEN
Lo screenshot sotto mostra l’output del comando precedente che mostra tutte le porte aperte. Come potete vedere anche dal output, mostra sia le connessioni IPv4 che IPv6.
Se volete solo mostrare le connessioni IPv4 , dovreste aggiungere -i 4. Per mostrare i processi che ascoltano sulla porta 80, usando sia TCP che UDP, lanciate il comando:
Terminale
  • lsof -1 :80.
Se nessun processo ascolta su una porta, il servizio al quale state cercando di accedere è probabilmente fermo e dovreste farlo ripartire. Il comando:

Terminale
  • lsof -u mysql
mostra tutti i file aperti di proprietà dell’utente mysql. Se volete vedere tutti i file aperti non di proprietà di tale utente, vi basterà invertire il parametro cosi:
Terminale
  • lsof -u ^mysql
Questa particolare variante del comando lsof vi può aiutare a risolvere problemi di rete che hanno a che fare con i permesso dei file Linux. Potete trovare tutte le connessioni LISTEN di proprietà dell’utente mysql lanciando il seguente comando:
Terminale
  • lsof -u mysql | grep -i LISTEN

Quest’ultimo vi può aiutare a capire se un determinato servizio accetta connessioni da internet o solamente da localhost. Il seguente comando trova tutte le connessioni di rete che arrivano da o vanno verso www.linuxpro.it che ha indirizzo IP 77.239.137.131:
Terminale
  • lsof -i @77.239.137.131
L’utility lsof è quindi particolarmente utile per verificare che un processo sia in esecuzione e disponibile ad accettare nuove connessioni. Quindi potete usare netcat per provare a conettervi a tale porta aperta e provare uno scambio di dati. Netstat è uno strumento UNIX molto utile che lavora a livello socket, TCP, UDP, IP e ETHERNET. Se usato con il parametro -s, netstat mostra le statistiche per ogni protocollo, molto comodo per capire se ci sono troppi errori nella vostra macchina.

Usare Netstat

Il comando

Terminale
  • netstat -l -A inet
mostra tutte le connessioni internet in ascolto, sia TCP che UDP, laddove
Terminale
  • netstat -l -tcp -A inet
visualizza solamente le connessioni TCP.

Se volete mostrare informazioni su un protocollo specifico, potete lanciare un comando simile a $ netstat -a | grep -i http che visualizza informazioni riguardo il solo protocollo HTTP. Il comando:
Terminale
  • netstat -a -t | grep -i LISTEN
mostra tutte le porte in ascolto. Il comando -v indica a netstat di aumentare la velocità dell’output. Il comando:

Terminale
  • netstat -ltpe
mostra il nome dell’utente proprietario di un processo.

Dal momento che sfrutta -p , è suggeribile lanciarlo come root per mostrare tutti i processi. Lo screenshot qui sotto mostra l’output del comando:

Terminale
  • netstat -nr.
La flag U indica che la route è in uso. La flag G indica il gateway di default. La flag H indica che la route è verso un host e non verso una rete. Tenete a mente che il comando $route -e produce lo stesso output di $ netstat -r. Notate che il secondo output è da macchina Linux che gira sotto la versione Mac OS X di virtualbox: non direste mai che è una macchina virtuale! Per rilevare tali informazioni vi servirebbe un utility come >traceroute. L’opzione -W fa si che netstat mostri la URL completa per ogni connessione dal momento che il comportamento di default è di troncare l’output per rimanere all’interno dello schermo. Quindi, l’output del comando $ netsat -tup -W mostrerà tutta la URL per ogni connessione. L’utility netstat è molto pratica poer controllare connessioni attive nella vostra macchina locale. Il suo svantaggio è che netstat non richiede molte risorse per lavorare, il che è un bene quando avete un server sotto sforzo.

Tecniche avanzate

Le caratteristiche uniche di netcat vengono rilevate nell’eseguire azioni che non immaginate di poter fare con altre utility. Una di queste rare cose è il trasferimento di file, ovvero la possibilità di agire come un server FTP semplificato. Per trasferire un file localmente, per prima cosa dovete lanciare la parte server usando:

Terminale
  • cat fileDaTrasferire | nc -l 4567
Quindi potete ottenere il file usando:
Terminale
  • nc localhost 4567 > fileDaTrasferire
L’unico svantaggio di questo approcio è che dovete scegliere il file da trasferire in anticipo. Se volete trasferire più di un file, dovreste lanciare i processi netcat aggiuntivi.
Questa tecnica vi può aiutare a capire se potete trasferire piccole quantità di dati da una macchina a un altra.
Analogalmente potete usare netcat per trasferire intere directory da una macchina a un altra. Se non volete creare file temporanei vi servirà l’aiuto della utility tar. Potete lanciare la parte server come:
Terminale
  • tar -cvf – directory | nc -l 1234
e, alla stessa maniera, potete ottenere la directory nella macchina locale come segue:

Terminale
  • nc localhost 1234 | tar -xvf –
Se state trasferendo la directory a un altra macchina su internet, dovreste sostituire localhost >con l’indirizzo IP o l’hostname della macchina su cui gira la parte server del comando netcat. Questa tecnica vi assicura che esista una connessione di rete affidabile tra le due macchine perché può trasferre grosse quantità di dati. Il comando seguente termina tutti i processi dell’utente “ciromattia” usando l’ID di processo, e dovrebbe essere usato solo se assolutamente necessario:
Terminale
  • kill -9 ‘lsof -t -u ciromattia’
Questo comando può tornare particolarmente utile quando i processi di un utente rendono la vostra macchina Linux particolarmente lenta.

Processare l’output

Potete trovare facilmente il numero totale di connessioni TCP e UDP con un d’aituo da parte dell’utilissimo linguaggio awk:

Terminale
  • lsof -i | awk ‘{print $8}’ | sort | uniq -c | grep -v NODE
Potete avere dettagli sul servizio, IP sorgente e destinazione cosi come i numeri di porta di tutte le connessioni attive usando il deguente comando:

Terminale
  • lsof -i -n -P | grep ESTABLISHED | AWK ‘{print $9}’ | sort -u

 

Il comando che segue mostra l’indirizzo IP da tutte le connessioni Apache stabilite e mostra il numero di connessioni per indirizzo IP:
Terminale
  • netstat -anpt | grep apache2 | grep ESTABILISHED | awk -F “[ :]* ‘{print $4}’ | uniq -c
Il prossimo comando calcola il numero di connessioni TCP per l’indirizzo IP e le ordina per numero totale di connessioni:
Terminale
  • netstat -nt | awk ‘/^tcp/ ‘{print$5}’ | awk -F: ‘{print$1}’ | sort | uniq | sort -nr
Il comando seguente conta i vari tipi di stato TCP e stampa i risultati:
Terminale
  • netstat -ant | awk ‘{print$6}’ | grep -v enstabilished\) | grep -v Foreign | sort | uniq -c | sort -n
Un grosso numero di connessioni TIME_WAIT potrebbe indicare che dovete regolare le vostre impostazioni per il timeout TCP. Il comando che segue mostra il numero di processi in ascolto per l’utente:
Terminale
  • netstat -ltpe | awk ‘{print $7}’ | grep -v remoto | grep -v “^$” | sort | uniq -c | awk ‘{print $2 “: “ $1}’

Spiegazione:

il primo comando grep cancella la riga con le informayioni di intestazione dall’output netstat. Il secondo comando grep cancella le righe vuote dall’output. Il primo comando awk recupera le informazioni desiderate dall’output di netstat. Il comando sort >ordina l’output laddove uniq conta le occorenze delle righe ommetendo output ripetuto. L’ultimo comando AWK rovescia le due colonne dell’output uniq e stampa i dati a schermo. Lo screenshot sottostante mostra l’output di alcuni dei comandi che avete appena visto, lanciati in un server nono troppo carico.

Parliamo di IPv6

IPv6 è stato sviluppato dalla IETF (internet Engineering Task force) e il suo scopo è di risolvere il problema imminente della fine degli indirizzi IPv4,IPv6 usa indirizzi a 128 bit laddove IP usava indirizzi a 32 bit.
IPv6 è già in uso e rimpiazzerà a breve IPv4,diventando il protocollo internet dominante,quindi è bene sapere che tutti gli strumenti presentati supportano IPv6 con l’aiuto di parametri specifici da riga di comando.
L’utility Isof può mostrare connessioni IPv6 quando combinato con -I6 o -I 6.L’utility netcat può funzionare in modalità IPv6 quando usata con il parametro -6.Usando netstat potete vedere la tabella di routing di IPv6 eseguendo netstat -6 -m.Lìoutput è molto più complesso del comando netstat -nr,il che prova che IPv6 è un protocollo un po’ più complicato di IPv4.Analogamente il comando netstat -a -A inet6,equivalente a netstat -a -6,mostra tutte le connessioni internet attive (sia server sia stabilite).
Per riferimento,sia ping sia traceroute hanno una versione IPv6 chiamata rispettivamente ping6 e traceroute6.

Quale strumento usare

Rispondere a questa domanda è un impresa tutt’altro che semplice.Il mio consiglio è quello di usare lo strumento che conoscete meglio,posto che sia in grado di risolvere il vostro problema.Il vantaggio principale di nestcat è che la maggior parte delle sue opzioni da riga di comando non richiedono privilegi di root per essere usate.Quello che dovrebbe essere chiaro è il fatto che netcat svolge un lavoro completamente diverso dagli altri due.È uno strumento che può aiutarvi a controllare le connessioni di rete tra due macchine.D’altra parte,sia lsof che netstat mostrano informazioni riguardo porte aperte, connessioni stabilite, ecc.solo sulla macchina locale.Ogni strumento ha i propri vantaggi e svantaggi ed è vostro compito come amministratori di sistema o di rete trovare il modo più semplice e veloce per risolvere il problema usando quasiasi strumento vogliate!In conclusione, usate quello che funziona meglio per voi: se non siete in grado di risolvere un problema con gli strumenti che conoscete è comunque un chiaro segnale che dovete impararne qualcuno di nuovo!

Sostituire nmap con netcat

L’utility netcat vi permette di specificare un range di porte in cui fare port scanning.
Il seguente comando indica a netcat di scansionare l’indirizzo 192.168.2.1 usando un range di porte da 20 a 40:

Terminale
  • netcat -z -v -n 192.168.2.1 20-40
L’opzione -n indica a netcat di disabilitare il lookup DSN per l’indirizzo IP fornito, mentre -z indica di inviare zero dati, ovvero di chiudere la connessione appena aperta senza inviare alcun dato.
Notate che non potete usare un range di porte per far si che netcat ascolti su molteplici numeri di porta con un solo comando: per far ascoltare netcat su molteplici processi netcat. Lo script seguente risolverà il problema
#!/bin/bash
fromPort=2000
toPort=2100
for (( i = fromPort+1;i<=Port ; i++ )) do
nc -l -k -p $i -c “nc localhost $last_port” &
done
nc -l -k -p çfromPort
Nota: lanciate questo script con grande attenzione, può rendere Linux molto lento se usato impropriamente e assicuratevi di provarlo prima con un range di porte limitato. Tenete a mente anche che diverse varianti di Unix hanno diverse opzioni da riga di comando per gli strumenti presentati in questo tutorial, inclusi i tre principali: netcat, netstat e lsof.

Grazie! per l’utilizzo della Guida di Linuxiano.

Trovi questo tutorial utile? Condividi con i tuoi amici per tenerlo in vita.
Sii il primo a commentare, apprezzo i tuoi suggerimenti. Per ulteriori domande potete commentare qui sotto.