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


79

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

Ad 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 avrebbe semplicemente stampato:

hello

Ho provato "tcpdump", "etereo", "tethereal", "tshark" e altri, ma non è ovvio come si ottengono:

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

Sì, potresti probabilmente mettere insieme un set 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.


2
tcpdump è il comando magico che desideri. Wireshark è una bella interfaccia grafica in cima alla libreria che tcpdump usa
Vinko Vrsalovic

3
So che questa è una vecchia domanda, ma sono curioso di sapere perché usare nc anche per il "lato server" non era un'opzione? "nc -l 1234" crea un server in ascolto sulla porta 1234 e stampa tutto ciò che gli viene inviato e chiude la connessione. Se si desidera mantenere attiva la connessione e non disconnettersi, è possibile aggiungere l'opzione "-k".
StFS

2
@StFS perché vuole annusare una porta in esecuzione e nc si lamenterebbe.
Infocloggato il

Risposte:


106

Aggiornare:

Come sottolineato 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 "Nome scanner non valido '8983'". Il comando corretto è

sudo tcpflow -i any -C -J port 1234

(inoltre -Jè stato modificato -gin nell'ultima versione)


Grazie a Yves per avermi indicato " tcpflow ". Ecco la linea 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 non appena arrivano
  • non visualizza altri metadati
  • ascolta su tutte le interfacce (quindi acquisisce i dati provenienti dalla macchina e dall'esterno)

" -C" Indica 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

2
Wow. tcpflow è fantastico, grazie! Mi ha salvato una tonnellata di dolore che stavo provando con WireShark. Wireshark, tcpdump, ecc. Hanno troppe informazioni e in realtà non fanno ciò che pone la domanda originale. tcpflow è perfetto per questo.
Russ,

10
Dalla versione 1.3 di tcpflow -eviene utilizzata l' opzione 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
Michal Kováč,

6
Si noti che -Jè stato modificato in -gnelle ultime versioni.
tvon

2
Qualcuno deve spiegare agli autori dello strumento cosa significa il termine "compatibilità con le versioni precedenti"!
Sridhar Sarnobat,

Stampa "cose" due volte, per me. Perché ? lpaste.net/3984129577801744384
user1198559

29

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 invece di connettersi direttamente a 1234

-v L'opzione è per socat per stampare 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

avvertenze: questa opzione è unidirezionale. la seconda istanza netcat stamperà qualsiasi risposta dal tuo server allo standard output. Puoi ancora fare quindi:

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

Supponiamo che non abbia il controllo sul client e sul server (o non voglio interromperlo), quindi non posso cambiare la porta interessata o intercettare il traffico. E allora?

20

Prova Wireshark . È un eccellente analizzatore di protocollo destinato sia a Linux che a Windows.


3
La mia esperienza è che l'interfaccia fa davvero schifo su Linux.
Joe Phillips,

accidenti, ci sei arrivato prima di me, +1 su WireShark

Puoi fare un esempio da riga di comando?

Dai un'occhiata a questo link wiki.wireshark.org/Tools Fornisce un elenco di strumenti da riga di comando per WireShark. Cerca Dumpcap.
Kevin Boyd,

13

tcpflow è quello che vuoi. Estratto dalla pagina man:

DESCRIZIONE
tcpflow è un programma che acquisisce i dati trasmessi come parte delle connessioni TCP (flussi) e li memorizza in 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 che vengono effettivamente trasmessi. Al contrario, tcpflow ricostruisce i flussi di dati effettivi e memorizza ciascun flusso in un file separato per successive analisi. tcpflow comprende i numeri di sequenza TCP e ricostruisce correttamente i flussi di dati indipendentemente dalla ritrasmissione o dalla consegna fuori ordine.

tcpflow archivia tutti i dati acquisiti in file che hanno nomi del modulo

192.168.101.102.02345-010.011.012.013.45103

dove i contenuti del file sopra sarebbero dati trasmessi dall'host 192.168.101.102 porta 2345, all'host 10.11.12.13 porta 45103.

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

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

Tutti i dati verranno archiviati in un file denominato 127.000.000.001.48842-127.000.000.001.05555.

Puoi ancora reindirizzare questo sull'output standard con l'opzione -Cs. Leggi la pagina del manuale per giocare con l'espressione per ottimizzare i paquet che vuoi che tcpflow catturi.


2

ngrepè molto carino per questo. Ci vuole una stringa BPF e una stringa opzionale per cercare all'interno dei pacchetti, quindi scarica il contenuto del pacchetto per lo schermo in un formato piuttosto utile. Facoltativamente, esegue il dump anche a un file pcap_dump che è possibile esaminare più da vicino in Wireshark in seguito.


0

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

Forse puoi scrivere un wrapper per tcpdump, ad esempio, che rimuoverà tutte le informazioni ridondanti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.