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

77

Vorrei esaminare il traffico di rete gestito da un singolo processo, ma le acquisizioni di rete semplici non funzioneranno poiché ho a che fare con un sistema così occupato (un sacco di altro traffico che si verifica nello stesso momento). Esiste un modo per isolare un'acquisizione di tcpdump o wireshark al traffico di rete di un singolo processo specifico? (L'uso di netstat non è sufficiente.)

    
posta Kees Cook 06.11.2010 - 07:56

14 risposte

16

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

Dovresti innanzitutto 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. Questo dovrebbe isolare il traffico in entrata e in uscita del tuo processo.

    
risposta data OpenNingia 06.11.2010 - 10:53
105

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 "segui nuovi processi"
  • -e definisce un filtro
  • -s imposta il limite delle stringhe su un valore superiore a 32
  • -p accetta l'id di processo da allegare a
risposta data Clausi 10.11.2010 - 12:04
47

So che questa discussione è un po 'vecchia, ma penso che questo potrebbe aiutare alcuni di voi:

Se il tuo kernel lo consente, catturare il traffico di rete di un singolo processo è molto semplice eseguendo il suddetto processo in uno spazio dei nomi di rete isolato e usando wireshark (o altri strumenti di networking standard) anche nel suddetto namespace.

L'installazione potrebbe sembrare un po 'complessa, ma una volta che l'hai capita e acquisita familiarità con essa, faciliterà il tuo lavoro così tanto.

Per farlo:

  • crea uno spazio dei nomi della rete di prova:

    ip netns add test
    
  • crea 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
    
  • configura 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
    
  • configura il routing nello spazio dei nomi di test:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • attiva ip_forward e imposta una regola NAT per inoltrare il traffico proveniente dallo spazio dei nomi che hai creato (devi 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 vuoi analizzare nel nuovo spazio dei nomi e anche wirehark:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Dovrai monitorare l'interfaccia veth-a.

risposta data felahdab 19.07.2014 - 13:39
13
netstat -taucp | grep <pid or process name>

Questo mostrerà le connessioni che un'applicazione sta facendo includendo la porta in uso.

    
risposta data Oli 06.11.2010 - 10:15
9

Sono giunto a un problema simile e sono riuscito a 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 altro, e voilà, hai appena isolato e catturato il traffico da un singolo processo.

Volevo solo postare nel caso in cui aiuti qualcuno.

    
risposta data szymon 06.04.2014 - 16:49
9

Solo un'idea: è possibile associare la tua 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 collegarsi a un altro indirizzo IP:

link

  

fixsrcip è uno strumento per il binding di socket client TCP e UDP in uscita ( IPv4 ) a specifici indirizzi IP di origine su host multi-homed

link

  

force_bind consente di forzare il binding su un IP e / o una porta specifici. Funziona sia con IPv4 che con IPv6 .

    
risposta data Clausi 10.11.2010 - 13:33
5

Questo è un trucco sporco, ma suggerirei una deviazione o una destinazione del registro con iptables per un dato UID. ad 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 di guardare qualcosa come "--log-tcp-sequence", "--log-tcp-options", "--log-ip-options", "--log-uid" per quell'obiettivo di registro. Anche se ho il sospetto che questo ti aiuterà solo a postare un pcap che include una tonnellata di altri dati.

La destinazione NFLOG potrebbe essere utile se si desidera contrassegnare i pacchetti e quindi determinati pacchetti etichettati 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 applicazione specifica in esecuzione come utente specifico?

    
risposta data ioerror 12.12.2010 - 10:50
4

Puoi provare tracingump - link

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

    
risposta data pjf 01.04.2014 - 14:51
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 che desideri ovunque, utilizzando un filtro predefinito potresti perdere qualcosa.

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

    
risposta data user5883 10.11.2010 - 10:54
3

Basandosi su la risposta di ioerror Sospetto che tu possa usare iptables --uid-owner per impostare un indicatore sul traffico, e quindi puoi chiedere a wireshark di catturare solo il traffico con quel marcatore. Potresti essere in grado di utilizzare un DSCP (indicatore di servizi differenziali), un ID di flusso o un marcatore qos.

O in effetti potresti usarlo per inviare quei pacchetti a un'interfaccia diversa e quindi catturarli solo su quell'interfaccia.

    
risposta data poolie 12.12.2010 - 11:23
3

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

Vedi qui: nsntrace repo github

    
risposta data Jonas Danielsson 15.07.2016 - 13:24
2

wireshark bug # 1184 è questa funzionalità. Non è ancora stato implementato.
Copiato dall'utente cmanynard su ask.wireshark.org

    
risposta data JamesThomasMoon1979 15.01.2015 - 05:35
-1

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

    
risposta data chesty 06.11.2010 - 09:30
-1

Penso che sia possibile creare uno script di shell per eseguire l'esecuzione in loop di netstat e registrarlo in un file di testo. Qualcosa come (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 affinare questo. Ma qualcuno qui può iniziare da dove ho lasciato e creare uno script di lavoro per te.

    
risposta data tinhed 10.11.2010 - 07:59

Leggi altre domande sui tag