it-swarm.it

Qual è il modo più semplice per annusare TCP dati sul traffico su Linux?

Voglio un modo semplice per mostrare tutti i dati TCP (non le intestazioni TCP o qualsiasi altra cosa) su qualsiasi interfaccia sulla mia macchina Linux.

Per esempio, voglio un comando magico che se lo faccio:

magic_commmand_I_want port=1234

quindi se c'era un server in ascolto sulla porta 1234 sulla mia macchina, e qualcuno ha fatto:

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

Quindi il comando magico dovrebbe solo stampare:

hello

Ho provato "tcpdump", "Ethereal", "tethereal", "tshark" e altri, ma non è ovvio come li si possa ottenere:

  • non mostrare indirizzi IP o altri metadati
  • mostra solo i "dati" inviati, non i singoli pacchetti e le loro intestazioni
  • stampare i dati così come sono, non in esadecimale e non con i marcatori di offset del pacchetto
  • sniff all traffico di rete (sia su eth0 o eth1 o lo , ecc ...)

Sì, potresti probabilmente mettere insieme una serie di comandi unix convogliati per farlo, ma non è molto facile da ricordare per la prossima volta :)

Se hai un semplice esempio di una riga di comando esatta che fa questo, è quello che mi piacerebbe.

77
Dustin Boswell

Aggiornamento:

Come indicato da Michal nei commenti: Da tcpflow versione 1.3 l'opzione -e viene utilizzata per specificare il nome dello scanner. Quindi viene stampato l'errore "Nome scanner non valido '8983'". Il comando corretto è

Sudo tcpflow -i any -C -J port 1234

(anche -J è stato modificato 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 al loro interno
  • non mostra altri metadati
  • ascolta tutte le interfacce (quindi acquisisce i dati provenienti dall'interno della macchina e all'esterno)

Il "-C" dice di eseguire il dump sulla console anziché su un file. Il "-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
104
Dustin Boswell

socat è lo strumento che stai chiedendo. Può fungere da proxy:

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

quindi l'applicazione deve collegare la porta 4444 anziché connettersi direttamente a 1234

L'opzione -v è che socat stampi tutto ciò che riceve sull'errore standard (stderr).

Aggiornare:

Se socat non è disponibile sul tuo computer, puoi comunque emularlo in questo modo con netcat:

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

avvertimenti: questa opzione è unidirezionale. la seconda istanza di netcat stamperà qualsiasi risposta dal proprio server allo standard output. Puoi ancora fare allora:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
28
yves Baumes

Prova Wireshark . È un ottimo analizzatore di protocollo destinato a Linux e Windows.

20
Kevin Boyd

tcpflow è quello che vuoi. 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 conveniente per l'analisi del protocollo o il debug. Un programma come tcpdump (4) mostra un riepilogo dei pacchetti visti sul filo, ma di solito non memorizza i dati effettivamente trasmessi. Al contrario, tcpflow ricostruisce i flussi di dati effettivi e memorizza ciascun flusso in un file separato per un'analisi successiva. tcpflow comprende i numeri di sequenza TCP e ricostruisce correttamente i flussi di dati indipendentemente dalle ritrasmissioni o dalla consegna fuori ordine.

tcpflow memorizza tutti i dati acquisiti in file con nomi del modulo

192.168.101.102.02345-010.011.012.013.45103

dove i contenuti del file sopra sarebbero dati trasmessi dalla porta Host 192.168.101.102, alla porta Host 10.11.12.13 45103.

Configura una connessione dall'app dell'applicazione al tuo server. Quando la connessione è attiva e funzionante, tcpflow è ancora in grado di catturare i dati da essa. Ad esempio:

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

Ogni dato verrà archiviato in un file denominato 127.000.000.001.48842-127.000.000.001.05555.

È ancora possibile reindirizzare questo sullo standard output con l'opzione -Cs. Leggi la pagina del manuale per giocare con l'espressione per mettere a punto i riquadri che desideri catturare da tcpflow.

13
yves Baumes

ngrep è molto carino per questo. Richiede una stringa BPF e una stringa opzionale da ricercare all'interno dei pacchetti, quindi esegue il dump del contenuto del pacchetto sullo schermo in un formato piuttosto utile. Opzionalmente esegue anche il dump di un file pcap_dump che è possibile esaminare più da vicino in Wireshark in seguito.

2
hobbs

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

0
Andrew Y