2009-08-13 22:44:50 +0000 2009-08-13 22:44:50 +0000
82
82

Qual è il modo più semplice per sniffare i dati del traffico TCP su Linux?

Voglio un modo semplice per mostrare tutti i dati TCP (non le intestazioni TCP o altro) che passano su qualsiasi interfaccia sulla mia scatola Linux.

Per esempio, voglio un comando magico che se faccio

magic_commmand_I_want port=1234

allora se ci fosse un server in ascolto sulla porta 1234 sulla mia macchina, e qualcuno facesse:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

Allora il comando magico stamperebbe semplicemente:

hello

Ho provato “tcpdump”, “ethereal”, “tethereal”, “tshark”, e altri, ma non è ovvio come si ottiene:

  • non mostrare indirizzi IP o altri metadati
  • mostrare solo i “dati” che vengono inviati, non i singoli pacchetti e le loro intestazioni
  • stampare i dati così come sono, non in esadecimale, e non con marcatori packet-offset
  • sniffare tutto il traffico di rete (che sia su eth0 o eth1 o lo, ecc. ..)

Sì, si potrebbe probabilmente mettere insieme una serie di comandi unix per fare questo, ma non è molto facile da ricordare per la prossima volta :)

Se avete un semplice esempio di un'esatta linea di comando che faccia questo, è quello che mi piacerebbe.

Risposte (7)

109
109
109
2009-08-14 17:05:54 +0000

Aggiornamento:

Come indicato da Michal nei commenti: Dalla versione 1.3 di tcpflow viene usata l'opzione -e per specificare il nome dello scanner. Quindi viene stampato l'errore “Invalid scanner name ‘8983’”. Il comando corretto è

sudo tcpflow -i any -C -J port 1234

(anche -J è stato cambiato in -g nell'ultima versione)


Grazie a yves per avermi indicato tcpflow “. Ecco la riga di comando:

tcpflow -i any -C -e port 1234 # as root, or with sudo

Questo fa tutto ciò che voglio

  • visualizza i dati byte per byte come arrivano
  • non visualizza nessun altro metadato
  • ascolta su tutte le interfacce (quindi cattura i dati provenienti dall'interno e dall'esterno della macchina)

Il ”-C“ gli dice di fare il dump sulla console invece che su un file. Lo ”-e“ abilita i colori in modo che client->server e server->client siano visivamente distinti.

Ho installato tcpflow semplicemente facendo

sudo apt-get install tcpflow
30
30
30
2009-08-13 22:48:27 +0000

socat è lo strumento che state chiedendo. Può agire come un proxy:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

allora la tua applicazione deve connettersi alla porta 4444 invece di connettersi direttamente alla 1234

l'opzione -v è per socat di stampare tutto ciò che riceve sull'errore standard (stderr).

Aggiornamento:

Se socat non è disponibile sulla vostra macchina, potete comunque emularlo con netcat:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

avvertenze: questa opzione è unidirezionale. la seconda istanza di netcat stamperà qualsiasi risposta dal vostro server allo standard output. Si può ancora fare allora:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
20
20
20
2009-08-13 22:47:06 +0000

Prova Wireshark . È un eccellente analizzatore di protocollo mirato sia per Linux che per Windows.

13
13
13
2009-08-14 15:04:28 +0000

tcpflow è quello che volete. Estratto dalla pagina man:

DESCRIZIONE tcpflow è un programma che cattura i dati trasmessi come parte delle connessioni TCP (flussi), e memorizza i dati in un modo che è conveniente per l'analisi del protocollo o il debug. Un programma come tcpdump(4) mostra un riassunto dei pacchetti visti sul filo, ma di solito non memorizza i dati che vengono effettivamente trasmessi. Al contrario, tcpflow ricostruisce i flussi di dati effettivi e memorizza ogni flusso in un file separato per analisi successive. tcpflow capisce i numeri di sequenza TCP e ricostruisce correttamente i flussi di dati indipendentemente dalle ritrasmissioni o dalle consegne fuori ordine.

tcpflow memorizza tutti i dati catturati in file che hanno nomi della forma

192.168.101.102.02345-010.011.012.013.45103

dove il contenuto del suddetto file sarebbe dati trasmessi dall'host 192.168.101.102 porta 2345, all'host 10.11.12.13 porta 45103.

Imposta una connessione dalla tua applicazione al tuo server. Quando la connessione è attiva e funzionante, tcpflow è ancora in grado di catturare dati da essa Per esempio:

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Ogni dato sarà memorizzato in un file chiamato 127.000.000.001.48842-127.000.000.001.05555.

Potete ancora reindirizzare questo sullo standard output con l'opzione -Cs . Leggete la pagina del manuale per giocare con l'espressione per sintonizzare i paquets che volete che tcpflow catturi.

2
2
2
2009-08-13 23:15:48 +0000

ngrep è molto bello per questo. Prende una stringa BPF e una stringa opzionale da cercare all'interno dei pacchetti, e poi scarica il contenuto del pacchetto sullo schermo in un formato abbastanza utile. Opzionalmente scarica anche in un file pcap\dump che si può esaminare più da vicino in Wireshark in seguito.

0
0
0
2009-08-13 23:08:00 +0000

Dai un'occhiata a Chaosreader . Anche se fa un po’ più di quello che chiedi e in modo leggermente diverso, probabilmente potresti modificarne il codice per fare quello che vuoi.

-1
-1
-1
2009-08-13 22:47:31 +0000

Forse puoi scrivere un wrapper per tcpdump, per esempio, che rimuova tutte le informazioni ridondanti