Come posso acquisire il traffico di rete di un singolo processo?


93

Vorrei esaminare il traffico di rete gestito da un singolo processo, ma le acquisizioni di rete semplici non funzioneranno dal momento che ho a che fare con un sistema così impegnato (un sacco di altro traffico avviene contemporaneamente). Esiste un modo per isolare tcpdumpo wiresharkacquisire il traffico di rete di un singolo processo specifico? (L'uso netstatnon è sufficiente.)

Risposte:


21

In effetti c'è un modo, usando i filtri di Wireshark . Ma non puoi filtrare direttamente per nome processo o PID (perché non sono quantità di rete).

Dovresti prima capire i protocolli e le porte utilizzate dal tuo processo (il comando netstat nel commento precedente funziona bene).

Quindi utilizzare Wireshark per filtrare la porta in entrata (o in uscita) con quella appena recuperata. Ciò dovrebbe isolare il traffico in entrata e in uscita del processo.


6
Per una semplice connessione, questo è possibile, ma ho bisogno di tenere traccia di DNS, HTTP, ecc. Che passano tutti di fretta, quindi non c'è un modo semplice per usare netstate semplici filtri di acquisizione di rete su una macchina occupata.
Kees Cook,

Ok, le porte pubbliche HTTP e DNS sono utilizzate da molte applicazioni, ma la porta privata corrispondente è unica. Quindi perché non provi a filtrare dalla porta privata?
OpenNingia,

Perché le piccole richieste rapide non saranno visualizzate da netstat; Sarò solo in grado di catturare connessioni di lunga durata. :(
Kees Cook l'

cosa succede se il processo utilizza porte dinamiche in fase di esecuzione, quindi non sarà possibile utilizzare i filtri delle porte statiche
Unix Janitor

Penso che tu abbia la risposta migliore ... Purtroppo uno strumento di sniffing di rete funziona al livello più basso dello stack di rete, cercando di catturare tutto, è completamente inconsapevole dei processi in esecuzione sul sistema operativo. Sarebbe estremamente difficile scoprire da cosa è nata una certa chiamata. Uno sniffer di pacchetti potrebbe eventualmente capire (tramite il numero di porta) un ID processo ma non può capire quale processo ha effettuato una ricerca DNS poiché è completamente indipendente (è probabilmente lo stack di rete del kernel che ha attivato la chiamata). Ma con il filtraggio e l'interruzione di altri processi dovresti essere in grado di raggiungere il tuo obiettivo.
Huygens,

136

Per avviare e monitorare un nuovo processo:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Per monitorare un processo esistente con un PID noto:

strace -p $PID -f -e trace=network -s 10000
  • -f è per "seguire i nuovi processi"
  • -e definisce un filtro
  • -s imposta il limite di stringhe su più di 32
  • -p accetta l'id del processo a cui collegarsi

2
Ciò è utile perché può essere utilizzato senza accesso root o autorizzazioni speciali (su alcune distribuzioni Linux, comunque - su Ubuntu potrebbero essere necessarie autorizzazioni speciali).
Robin Green,

1
Questo è utile anche perché può essere eseguito su un processo già avviato ed è disponibile praticamente su qualsiasi box Linux.
zakmck,

53

So che questo thread è un po 'vecchio ma penso che questo potrebbe aiutare alcuni di voi:

Se il kernel lo consente, l'acquisizione del traffico di rete di un singolo processo è molto semplice eseguendo tale processo in uno spazio dei nomi di rete isolato e utilizzando WireShark (o altri strumenti di rete standard) nello stesso spazio dei nomi.

L'installazione potrebbe sembrare un po 'complessa, ma una volta che lo capisci e ti familiarizzi, faciliterà così tanto il tuo lavoro.

Per fare ciò:

  • creare uno spazio dei nomi di rete di prova:

    ip netns add test
    
  • creare una coppia di interfacce di rete virtuale (veth-a e veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • cambia lo spazio dei nomi attivo dell'interfaccia veth-a:

    ip link set veth-a netns test
    
  • configurare gli indirizzi IP delle interfacce virtuali:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • configurare il routing nello spazio dei nomi del test:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • attivare ip_forward e stabilire una regola NAT per inoltrare il traffico proveniente dallo spazio dei nomi creato (è necessario regolare l'interfaccia di rete e l'indirizzo IP SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (Puoi anche usare la regola MASQUERADE se preferisci)

  • infine, puoi eseguire il processo che desideri analizzare nel nuovo spazio dei nomi, e WireShark:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Dovrai monitorare l'interfaccia veth-a.


4
Ottima idea, ma attenzione alle "limitazioni". Poiché si tratta di uno spazio dei nomi separato, non è possibile comunicare con i processi locali nello spazio dei nomi predefinito utilizzando gli indirizzi di loopback oi socket di dominio UNIX. Quest'ultimo influisce sulla comunicazione tramite D-Bus.
Lekensteyn,

@Lekensteyn è ancora possibile utilizzare i socket di dominio unix su diversi spazi dei nomi di rete. Il file system non è isolato da loro.
randunel,

1
@randunel Avrei dovuto essere più preciso al riguardo. Quello che intendevo dire è che i socket di dominio Unix nello "spazio dei nomi dei socket astratti" (che non utilizza il filesystem) non sono accessibili direttamente tra gli spazi dei nomi di rete. Per ovviare al problema, è possibile utilizzare un proxy comesocat .
Lekensteyn,

A quale indirizzo IP usi con l' --to-sourceargomento iptables? È questo l'indirizzo IP dell'interfaccia che passi -oall'opzione, un indirizzo IP che crei o ??? Ho provato la versione mascherata che non è necessaria --to-source, come descritto qui , e ha funzionato!
ntc2

3
Tutto ciò sembra richiedere l'accesso come root.
simplegamer,

15
netstat -taucp | grep <pid or process name>

Ciò mostrerà le connessioni che un'applicazione sta realizzando, inclusa la porta utilizzata.


8
Ciò mostrerebbe le connessioni esistenti per quell'istante, ma non fornirà un registro del traffico stesso.
Kees Cook,

1
Non sono sicuro del commento di Kees Cook. Un semplice netstat mostra le informazioni sulle connessioni per un istante, ma con il flag -c ottieni un'istantanea di quello stato ogni secondo (vedi 'man netstat'). Forse non ha tutto il traffico, ma non è un'istantanea unica delle connessioni.
tremendows

3
Bene, ne sono sicuro. Ciò non acquisirà tutto il traffico di rete di un processo.
Reinier Post,

Ciò è stato utile per capire quale numero di porta veniva bloccato da un firewall interno. Mostrava i SYN TCP (insieme all'indirizzo di destinazione e al numero di porta) inviati dal comando che stavo eseguendo.
Anthony Geoghegan,

11

Solo un'idea: è possibile associare l'applicazione a un indirizzo IP diverso? In tal caso, puoi utilizzare i soliti sospetti ( tcpdump , ecc.)

Strumenti per applicazioni che non sono in grado di associarsi a un altro indirizzo IP:

http://freshmeat.net/projects/fixsrcip

fixsrcipè uno strumento per associare socket client TCP e UDP in uscita ( IPv4 ) a indirizzi IP di origine specifici su host multihomed

http://freshmeat.net/projects/force_bind

force_bindconsente di forzare l'associazione su un IP e / o una porta specifici. Funziona con IPv4 e IPv6 .


La maggior parte delle applicazioni non supporta la specifica dell'IP di origine, ma in realtà ciò potrebbe essere possibile utilizzando un contenitore con CLONE_NEWNET ma non CLONE_NEWNS.
Kees Cook,

In alternativa, puoi creare uno spazio dei nomi di rete ed eseguire la tua app al suo interno www.evolware.org/?p=293
Flint

9

Ho riscontrato un problema simile e sono stato in grado di risolverlo in base a questa risposta di ioerror , utilizzando NFLOG come descritto qui :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

Quindi puoi creare eseguire il processo in questione da un account utente che non fa nient'altro - e voilà, hai appena isolato e acquisito il traffico da un singolo processo.

Volevo solo postare nel caso in cui aiuti qualcuno.


6

Ho scritto un'applicazione C che fa ciò che è descritto nella grande risposta sopra di felahdab!

Vedi qui: nsntrace github repo


È bello, ma penso che sarebbe bello includere alcuni dettagli in più su come ottenerlo e usarlo :)
Zanna,

Grazie! Ho fornito un collegamento al repository github che contiene un file README.md con esempi di utilizzo ed esempi e istruzioni per il download!
Jonas Danielsson,

5

Questo è un trucco sporco ma suggerirei un deviazione o una destinazione del registro con iptables per un determinato UID. per esempio:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

Potrebbe anche valere la pena esaminare qualcosa come '--log-tcp-sequence', '--log-tcp-options', '--log-ip-options', '--log-uid' per quella destinazione del log . Anche se sospetto che ciò ti aiuterà solo a pubblicare un pcap che include una tonnellata di altri dati.

Il target NFLOG potrebbe essere utile se si desidera contrassegnare i pacchetti e quindi determinati pacchetti con tag verranno inviati su un socket netlink a un processo di propria scelta. Mi chiedo se sarebbe utile per hackerare qualcosa con WireShark e la tua specifica applicazione in esecuzione come utente specifico?


ma questo funziona solo per l'esterno, che dire di incomming?
risultati

5

Puoi provare tracedump - http://mutrics.iitis.pl/tracedump

Fa esattamente quello che vuoi, puoi assegnargli un ID processo o un programma da eseguire.


1
Bel progetto, ma ... "Tracedump attualmente funziona solo su host Linux a 32 bit", purtroppo lo uccide per me.
gertvdijk,

4

Prova a eseguire il processo che ti interessa sotto strace :

strace ping www.askubuntu.com

Ti fornirà alcune informazioni molto dettagliate su ciò che sta facendo il tuo processo. Poiché un processo può aprire qualsiasi porta voglia ovunque, usando un filtro predefinito potresti perdere qualcosa.

Un altro approccio sarebbe quello di utilizzare una macchina virtuale ridotta o una macchina di prova sulla rete e collocare il processo su di essa separatamente. Quindi puoi semplicemente usare Wireshark per catturare tutto da quella macchina. Sarai abbastanza sicuro che il traffico che acquisisci sarà rilevante.


L'aggiunta in una "-e trace = network" elimina parte dell'output, a scapito della perdita dei dati effettivamente scritti nella rete. Se ti interessa solo il "numero di prese aperte" o simili, questo semplifica le cose.
dannysauer,

3

Basandomi sulla risposta di ioerror sospetto che tu possa usare iptables --uid-ownerper impostare un marker sul traffico, e quindi puoi chiedere a WireShark di catturare solo il traffico con quel marker. Potresti essere in grado di utilizzare un DSCP (marker di servizi differenziali), id di flusso o un marker qos.

O in effetti potresti usarlo per inviare quei pacchetti a un'interfaccia diversa, e poi catturare solo su quella interfaccia.



-1

forse iptables e ulog possono funzionare? Non che io abbia una ricetta esatta, ma penso che iptables possa abbinare i processi, una volta abbinati potresti usare ulog.


3
Sfortunatamente, è iptables -m owner --pid-owner $PIDstato rimosso in Linux 2.6.14
Kees Cook il

-1

Penso che puoi creare uno script di shell per eseguire ciclicamente l'esecuzione di netstat e registrarlo in un file di testo. Qualcosa di simile (passaggi molto approssimativi):

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

Non sono un programmatore, quindi non posso perfezionarlo. Ma qualcuno qui può iniziare da dove mi ero interrotto e creare una sceneggiatura funzionante per te.


Non buono abbastanza. La domanda è catturare tutto il traffico di rete, non solo qualunque cosa sia attiva quando si verifica.
Reinier Post,
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.