Vraag Hoe kan ik netwerkverkeer van een enkel proces vastleggen?


Ik zou willen onderzoeken hoe het netwerkverkeer in één proces wordt afgehandeld, maar eenvoudige netwerkopnames werken niet omdat ik te maken heb met een dergelijk druk systeem (veel ander verkeer gebeurt tegelijkertijd). Is er een manier om een ​​te isoleren tcpdump of wireshark vastleggen op het netwerkverkeer van een specifiek proces? (Gebruik makend van netstat is onvoldoende.)


78
2017-11-06 06:56


oorsprong




antwoorden:


Er is inderdaad een manier om de Wireshark filters. Maar u kunt niet rechtstreeks filteren op procesnaam of PID (omdat het geen netwerkhoeveelheden zijn).

U moet eerst de protocollen en de poorten vinden die door uw proces worden gebruikt (de netstat commando in de vorige opmerking werkt goed).

Gebruik vervolgens Wireshark om de inkomende (of uitgaande) poort te filteren met degene die u zojuist hebt opgehaald. Dat zou het inkomende en uitgaande verkeer van uw proces moeten isoleren.


16
2017-11-06 09:53



Voor een eenvoudige verbinding is dit mogelijk, maar ik moet DNS, HTTP enz. Volgen die allemaal voorbij komen, dus er is geen eenvoudige manier om alleen te gebruiken netstat en eenvoudige netwerkopvangfilters op een drukke machine. - Kees Cook
Ok, HTTP- en DNS-openbare poorten worden door veel applicaties gebruikt, maar de bijbehorende privépoort is uniek. Dus waarom probeer je niet te filteren door de privépoort? - OpenNingia
Omdat snelle kleine verzoeken niet zichtbaar zijn netstat; Ik zal alleen in staat zijn om langlevende verbindingen te vangen. :( - Kees Cook
Wat als het proces tijdens runtime dynamische poorten gebruikt, dan kunt u statische poortfilters niet gebruiken - user5883
Ik denk dat je hier het beste antwoord hebt ... Helaas werkt een netwerksnuifwerktuig op het laagste niveau van de netstapel, probeert alles te vangen, het is volledig onbewust van processen die op het besturingssysteem draaien. Het zou buitengewoon moeilijk zijn om erachter te komen wat er uit een bepaalde oproep is voortgekomen. Een pakketsniffer kon uiteindelijk (via het poortnummer) een proces-ID achterhalen, maar kon niet achterhalen welk proces een DNS-lookup deed, omdat dit volledig onafhankelijk is (dat is waarschijnlijk de kernelnetstack die de oproep heeft geactiveerd). Maar met het filteren en stoppen van andere processen zou je je doel moeten kunnen bereiken. - Huygens


Om een ​​nieuw proces te starten en te monitoren:

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

Om een ​​bestaand proces met een bekende PID te bewaken:

strace -p $PID -f -e trace=network -s 10000
  • -f is voor "volg nieuwe processen"
  • -e definieert een filter
  • -s stelt de limiet van strings in op meer dan 32
  • -p neemt het proces-ID om aan te hechten

106
2017-11-10 11:04



Dit is handig omdat het kan worden gebruikt zonder root-toegang of speciale permissies (op sommige Linux-distributies, hoe dan ook - op Ubuntu zijn mogelijk speciale rechten nodig). - Robin Green
Dit is ook handig, omdat het tegen een al gestart proces kan worden uitgevoerd en op vrijwel elke Linux-box beschikbaar is. - zakmck


Ik weet dat deze thread een beetje oud is, maar ik denk dat dit sommigen van jullie misschien kan helpen:

Als uw kernel dit toestaat, wordt het vastleggen van het netwerkverkeer van een enkel proces heel gemakkelijk gedaan door het genoemde proces in een geïsoleerde netwerknaamruimte uit te voeren en ook wireshark (of andere standaard netwerktools) in de genoemde naamruimte te gebruiken.

De installatie lijkt misschien een beetje ingewikkeld, maar als je het eenmaal begrijpt en ermee vertrouwd raakt, zal het je werk zo gemakkelijk maken.

Om dit te doen:

  • een testnetwerknaamruimte maken:

    ip netns add test
    
  • maak een paar virtuele netwerkinterfaces (veth-a en veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • verander de actieve naamruimte van de veth-a interface:

    ip link set veth-a netns test
    
  • configureer de IP-adressen van de virtuele interfaces:

    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
    
  • configureer de routing in de testnaamruimte:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • activeer ip_forward en stel een NAT-regel in om het verkeer uit de door u gecreëerde naamruimte door te sturen (u moet de netwerkinterface en het SNAT-IP-adres aanpassen):

    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>
    

    (Je kunt ook de MASQUERADE-regel gebruiken als je dat liever hebt)

  • ten slotte kunt u het proces uitvoeren dat u wilt analyseren in de nieuwe naamruimte en ook de draadhark:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Je zult de veth-a interface moeten monitoren.


48
2017-07-19 11:39



Goed idee, maar pas op voor de 'beperkingen'. Aangezien dit een afzonderlijke naamruimte is, kunt u niet communiceren met lokale processen in de standaardnaamruimte met behulp van de loopback-adres (sen) of UNIX-domeincontactdozen. Dit laatste beïnvloedt de communicatie via D-Bus. - Lekensteyn
@Lekensteyn je kunt nog steeds unix domain sockets gebruiken op netwerknaamruimten afaik. Het bestandssysteem wordt niet door hen geïsoleerd. - randunel
@randunel Ik zou daar wat preciezer over moeten zijn. Wat ik wilde zeggen is dat Unix-domeincontactdozen in de "abstracte socketnaamruimte" (die het bestandssysteem niet gebruikt) niet rechtstreeks toegankelijk zijn tussen netwerknaamruimten. Als een tijdelijke oplossing, kunt u gebruik een proxy zoals socat. - Lekensteyn
Welk IP-adres gebruikt u bij de --to-source argument voor iptables? Is dit het IP-adres van de interface die u doorgeeft aan de -o optie, een IP-adres dat u verzint, of ??? Ik heb de maskerade-versie geprobeerd die niet nodig is --to-source, zoals hier beschreven, en dat werkte! - ntc2
Dit lijkt allemaal root-toegang te vereisen. - simplegamer


netstat -taucp | grep <pid or process name>

Dat toont de verbindingen die een applicatie maakt, inclusief de poort die wordt gebruikt.


13
2017-11-06 09:15



Hiermee worden verbindingen weergegeven die op dat moment bestaan, maar deze bieden geen logboek van het verkeer zelf. - Kees Cook
Niet zeker over de Kees Cook-opmerking. Een eenvoudige netstat toont informatie over verbindingen voor een ogenblik, maar met de vlag -c krijgt u elke seconde een momentopname van die status (zie 'man netstat'). Misschien heeft het niet al het verkeer, maar is het geen unieke momentopname van de verbindingen. - tremendows
Nou, dat weet ik zeker. Dit zal niet vastleggen van alle netwerkverkeer van een proces. - Reinier Post


Ik ben tot een soortgelijk probleem gekomen en heb het op basis van dit antwoord door ioerror, met behulp van NFLOG zoals beschreven hier:

# 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

Vervolgens kunt u het proces in kwestie uitvoeren vanuit een gebruikersaccount dat niets anders doet - en voila, u hebt zojuist het verkeer geïsoleerd en vastgelegd uit een enkel proces.

Ik wilde gewoon een bericht plaatsen voor het geval dit iemand zou helpen.


9
2018-04-06 14:49





Gewoon een idee: is het mogelijk om uw aanvraag aan een ander IP-adres te koppelen? Als dat zo is, kunt u de gebruikelijke verdachten gebruiken (tcpdump, enz.)

Hulpmiddelen voor toepassingen die niet in staat zijn om aan een ander IP-adres te binden:

http://freshmeat.net/projects/fixsrcip

fixsrcip is een hulpmiddel voor het binden van uitgaande TCP- en UDP-clientcontactdozen (IPv4) naar specifieke bron-IP-adressen op hosts met meerdere hosts

http://freshmeat.net/projects/force_bind

force_bind kunt u bindend maken voor een specifieke IP en / of poort. Het werkt met zowel IPv4 als IPv6.


9
2017-11-10 12:33



De meeste toepassingen bieden geen ondersteuning voor het opgeven van hun bron-IP, maar dit kan in feite mogelijk zijn door een container te gebruiken met CLONE_NEWNET maar niet CLONE_NEWNS. - Kees Cook
U kunt ook een netwerknaamruimte maken en uw app daarin uitvoeren www.evolware.org/?p=293 - Flint


Dit is een vuile hack, maar ik zou een omleiding of een logdoel met iptables voor een bepaalde UID voorstellen. bijvoorbeeld:

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 

Het is misschien ook de moeite waard om naar zoiets als '--log-tcp-sequence', '--log-tcp-options', '--log-ip-options', '--log-uid' voor dat logdoel te kijken . Hoewel ik vermoed dat dit je alleen maar zal helpen bij het verwerken van een pcap met een heleboel andere gegevens.

Het NFLOG-doel kan handig zijn als u pakketten wilt markeren en bepaalde gecodeerde pakketten vervolgens via een netlink-socket naar een door u gekozen proces worden verzonden. Ik vraag me af of dat nuttig zou zijn voor het hacken van iets met wireshark en je specifieke applicatie die als een specifieke gebruiker wordt uitgevoerd?


5
2017-12-12 09:50



maar dit werkt alleen voor uitgaande, hoe zit het met incomming? - resultsway


Je kunt proberen tracoop - http://mutrics.iitis.pl/tracedump

Het doet precies wat u wilt, u kunt het een proces-ID of een programma geven om uit te voeren.


4
2018-04-01 12:51



Mooi project, maar ... "Tracedump draait momenteel alleen op 32-bits Linux-hosts", maar helaas voor mij. - gertvdijk


Voer het proces waarin u geïnteresseerd bent, uit onder strace:

strace ping www.askubuntu.com

Het geeft je een aantal zeer gedetailleerde informatie over wat je proces aan het doen is. Omdat een proces poorten naar elke gewenste locatie kan openen, kunt u met een vooraf gedefinieerd filter iets missen.

Een andere benadering zou zijn om een ​​uitgeklede virtuele machine of een testmachine in uw netwerk te gebruiken en uw proces hierop geïsoleerd te plaatsen. Dan kun je gewoon gebruiken Wireshark om alles van die machine te vangen. Je bent er vrij zeker van dat het verkeer dat je vastlegt relevant zal zijn.


4
2017-11-10 09:54



werkt prima voor osx - somid3
Toevoegen in een "-e trace = netwerk" snoeit een deel van de uitvoer, ten koste van het verliezen van de gegevens die feitelijk naar het netwerk zijn geschreven. Als u alleen maar om "het aantal uitgangen" of iets dergelijks geeft, maakt dit het u gemakkelijker. - dannysauer


Voortbouwen op het antwoord door ioerror Ik vermoed dat je kunt gebruiken iptables --uid-owner om een ​​markering op het verkeer in te stellen, en dan kunt u wireshark vragen om alleen verkeer met die markering te vangen. Mogelijk kunt u een DSCP (differential services marker), flow id of een qos-marker gebruiken.

Of je zou dit inderdaad kunnen gebruiken om die pakketten uit een andere interface te sturen en vervolgens alleen op die interface vast te leggen.


3
2017-12-12 10:23