Esiste un semplice strumento da riga di comando per sniffare i pacchetti di un singolo comando su Linux?


11

Mi piacerebbe se esistesse un unico strumento da riga di comando per il pacchetto che annusa un singolo comando in Linux. qualcosa del genere in sniff dumpfile commandmodo che tu possa semplicemente eseguire il comando che vuoi sniffare nel terminale e ottenere un dump dei pacchetti da qualche altra parte.

Vorrei scaricare / salvare / vedere solo il traffico di rete del singolo comando che inserisco, non tutto il traffico TCP sulla mia singola interfaccia di rete. Quindi, se avessi effettuato l'accesso al mio computer e avessi IRC in esecuzione in background, e lo avrei fatto sniff somefile wget http://www.google.com, vorrei vedere tutto il traffico di rete che il comando wget ha fatto per scaricare http://www.google.com . Non voglio che 'somefile' abbia confuso il traffico di rete IRC.

Ci sono molti comandi linux / unix che accettano un comando diverso e fanno qualcosa di diverso. Da sudo(esegui come superutente), nicemodifica un buon livello trickle(limita la larghezza di banda di un comando)


1
Che cosa vuoi fare esattamente? Vuoi verificare se viene eseguito un determinato comando? Vuoi sniffare il traffico di rete? Perché usare la frase "pacchetto annusando un comando" non ha alcun senso per me ...
wzzrd,

wzzrd, vedi domanda estesa
Rory,

Risposte:


10

Non ne conosco nessuno, ma teoricamente non dovrebbe essere difficile ottenere qualcosa di simile. Strace può essere utilizzato per intercettare i syscall di rete.

# strace -f -e trace=network -s 10000 /usr/bin/command arguments

Questo ti darà informazioni sui dati inviati tra il kernel e il processo. L'output di strace non è esattamente quello che vorresti. Tuttavia, strace utilizza ptrace syscall per intercettare le chiamate di sistema. Potrebbe essere possibile scrivere un programma per produrre i dati in modo un po 'più utile.

In alternativa, puoi anche intercettare il simpatico socket utile, associare e ascoltare i syscall. Potrebbe essere possibile scrivere un piccolo programma che utilizza ptrace su queste chiamate e libpcap per modificare dinamicamente il filtro di acquisizione ogni volta che viene aperto un nuovo socket.


Sarebbe bello se emettesse qualcosa che Wireshark potesse leggere.
Brad Gilbert,

Tenere presente che la sequenza sopra descritta è accurata per Solaris (e forse per altri Unices commerciali). Su Linux, strace è un tracciante di chiamate di sistema, simile per funzionamento e output a truss su Solaris o tusc su HP-UX.
James F,

1
Ho descritto strace su Linux.
David Pashley,

8

Tracedump

Tracedump è uno sniffer di pacchetti IP a singola applicazione, che acquisisce tutti i pacchetti TCP e UDP di un singolo processo Linux.

Scarica e descrizione qui: http://mutrics.iitis.pl/tracedump


1
Questa dovrebbe essere la risposta corretta ora.
h0tw1r3,

4

Prova Wireshark: il comando sarà tshark

  • tshark ti consente di selezionare i filtri sul traffico acquisito da un'interfaccia
  • utilizzare altre utilità come debian lsof per identificare il tipo di comunicazione effettuata dall'applicazione di interesse.

Oppure vuoi davvero LSOF?


Non credo che esista uno strumento che manterrà dinamicamente il filtro per tutte le comunicazioni associate a un processo. Tuttavia, potresti provare a tracciare le comunicazioni del processo con strumenti come lsofe una volta che hai un buon filtro in grado di isolare la comunicazione di quel processo da tutto il traffico in esecuzione sul tuo sistema, potresti ottenere la cattura corretta.

Ad esempio, con di wgetsolito l'indirizzo IP di destinazione è distinto dall'altro traffico relativo al processo. Anche se prendi qualcosa come skypel'intervallo di porte di destinazione è di solito fisso per un'istanza.


Questo è un po 'come il principio di incertezza. Di solito puoi sapere cosa sta attraversando una serie di percorsi di comunicazione (con un filtro sniffer su un gruppo identificato di flussi), o dove vengono creati diversi collegamenti di comunicazione (con lsof).

Mi piacerebbe davvero sapere se entrambi possono essere fatti per un'applicazione. Penso che dovrebbe essere fattibile. Ma non ho ancora visto nessuno strumento farlo.


Isof è fantastico, ma preferirei vedere cosa sta facendo / invio / ricezione.
Rory,

4

Impara a usare le espressioni di filtro.

Anche se questo non farà la traccia di fantasia che stai chiedendo.

Ti consentirà di rimuovere quasi tutte le "cose ​​confuse come IRC" dalla cattura.

Inoltre è molto utile conoscere la sintassi del filtro per un rapido riferimento in futuro.


2

In particolare per un browser / pagina Web qualcosa come il plug-in Firebug per Firefox può darti alcune delle informazioni che stai cercando: http://getfirebug.com/net.html

Per applicazioni più generali, potrebbe essere necessario utilizzare netstat per identificare le porte utilizzate dall'applicazione e quindi Wireshark / tshark / dtrace con un filtro per acquisire solo quel traffico. Non la risposta a una riga che stavi cercando però ...


1

Un'idea, prova VMWare

-setup a vm
-configurare quella vm per usare una particolare interfaccia
-sniff su quell'interfaccia dall'host (è come un uomo in mezzo all'attacco)

Se isola quali applicazioni di rete sono in esecuzione su quella VM, potresti avere la tua risposta

Una soluzione più ideale, suppongo, è fare ciò che VMWare fa in termini di come specifica come scegliere un'interfaccia di cui parlare. Penso che la sua magia provenga dai moduli del kernel che utilizza, in questo caso, probabilmente dal modulo kernel vmnet.

Per quanto ne so, le applicazioni non sono consapevoli dell'interfaccia di cui parlano e credo che ciò avvenga in base alla progettazione; non dovrebbero preoccuparsi di queste cose.

Inoltre,
forse esiste già un programma, non lo so. Ma se uno fosse scritto, potresti chiamarlo nettrace (per esempio) e Usage potrebbe essere simile

interfaccia del programma nettrace

quindi annusa l'interfaccia che utilizza e aggiungi percorsi (forse lo fa automaticamente) alla tua vera interfaccia


si sarebbe possibile Tuttavia sarebbe fantastico se ci fosse uno strumento semplice e veloce per farlo.
Rory,

Forse è tempo per questo semplice strumento? Mi chiedo se sarebbe così difficile, probabilmente la mod VMnet potrebbe essere un buon punto di partenza (anche se non so se ci sarebbero problemi di licenza). Forse (un hack) basta usare vmnet mod. So di essere interessato a domande come questa spesso.
rev

1

Supponendo che tu sia l'unica persona sulla scatola che tenti di connettersi a Google in quel momento, penso che qualcosa del genere dovrebbe fare il trucco:

tcpdump -w <outfile> -i <interface> tcp dst host www.google.com and dst port 80

Se non sei l'unica connessione che tenta di connettersi a Google sulla casella, quindi se riesci a identificare l'IP / la porta da cui ti stai connettendo, puoi anche specificare la porta src / ip src.

Identificare la porta src può essere un problema a meno che non sia possibile specificarlo su qualunque client si usi. Non sono sicuro che puoi con wget.

Sospetto fortemente che tu possa specificare sia le porte src che dst, netcatquindi se fosse davvero google a cui eri interessato, potresti fare il tuo GET (manualmente) tramite netcat.

Ovviamente la pagina man ti darà dettagli


1

La pagina man di tcpdump e molti siti web forniscono esempi approfonditi di filtri e ci sono anche alcuni repository online di espressioni di filtri di tcpdump. Dovrebbe essere in grado di fare quasi tutto ciò che puoi sognare, supponendo che tu sappia qualcosa sul traffico di rete (sorgente, destinazione, porte, protocolli, ecc.) Oltre a quale programma lo sta generando.

Se stai lavorando su un server o una scatola senza testa, puoi sempre fare in modo che tcpdump scriva un file di dump e poi lo apra in Wireshark sulla tua workstation e ottenga un filtro avanzato e un'interfaccia grafica.


Ehm, quale passaggio al comando tcpdump lo limiterebbe a una singola applicazione che genera il traffico?
Milan Babuškov,

1

Forse questo script farà quello che vuoi con opportune modifiche al comando tshark:

#!/bin/bash

# Start tshark in the background before we run the commsnd to be sniffed.
# Add more options to tshark, as appropriate to your command....
setsid tshark  -w dump -i eth0 tcp port 8080 >/dev/null 2>&1  &

sleep 2

wget www.google.com

# tshark keeps running if you don't kill it. 
# This kills all other tsharks that may be running.
pkill -9 tshark

Leggi il file di dump in seguito:

tshark -r dump

Stai acquisendo la porta 8080 ma stai generando traffico sulla porta 80; questo non farà esattamente ciò che intendi.
James F,

James: Il mio proxy si collega all'8080, ecco come ho eseguito lo script. Avrei dovuto cambiarlo 80 ai fini di questo post.
Non ora il

0

Dtrace dovrebbe permetterlo, anche se non so ancora se sia stato completamente trasformato in Linux.

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.