Netzwerkverbindungen eines Prozesses anzeigen

25

Gibt es eine Möglichkeit, die Zusammenhänge eines Prozesses zu zeigen? Sowas in der Art:

show PID

In welcher showist ein Befehl, dies zu tun, und PIDist die PID des Prozesses. Die Ausgabe, die ich möchte, besteht aus allen Verbindungen des Prozesses (in Echtzeit). Wenn der Prozess beispielsweise versucht, eine Verbindung zu 173.194.112.151 herzustellen , lautet die Ausgabe 173.194.112.151.

Ein genaueres Beispiel mit Firefox:

show `pidof firefox`

und mit firefox gehe ich erst auf google.com , dann auf unix.stackexchange.com und zuletzt auf 192.30.252.129 . Wenn ich den Browser schließe, muss die Ausgabe sein:

google.com
stackexchange.com
192.30.252.129

(Offensichtlich ist diese Ausgabe mit dem Browser nicht realistisch, da es viele andere verwandte Verbindungen gibt, aber dies ist nur ein Beispiel.)

ᴜsᴜ
quelle
Unter welcher Unix-Variante? Die meisten haben Werkzeuge, um dies zu tun, aber andere.
Gilles 'SO- hör auf böse zu sein'
Sie möchten also im Wesentlichen ein Protokoll aller Verbindungen?
Sergiy Kolodyazhnyy
Ich denke, tcpdump oder Wireshark sollten dann den Job machen.
Sergiy Kolodyazhnyy
Einige Möglichkeiten, dies zu tun: askubuntu.com/questions/11709/…
Mark Plotnick
@ Gilles Ubuntu 14.04.3 LTS
ᴜsᴜ

Antworten:

23

Du suchst nach strace! Ich habe diese Antwort auf askubuntu gefunden , aber sie gilt für Unix:

So starten und überwachen Sie einen neuen Prozess:

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

So überwachen Sie einen vorhandenen Prozess mit einer bekannten PID:

strace -p $PID -f -e trace=network -s 10000

Andernfalls, aber nur für Linux, können Sie den Prozess in einem isolierten Netzwerk-Namespace ausführen und den Datenverkehr mit wireshark überwachen . Dies ist wahrscheinlich praktischer als das Lesen des straceProtokolls:

  • Erstellen Sie einen Testnetzwerk-Namespace:

    ip netns add test
    
  • Erstellen Sie ein Paar virtueller Netzwerkschnittstellen (veth-a und veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • Ändern Sie den aktiven Namespace der Veth-A-Schnittstelle:

    ip link set veth-a netns test
    
  • Konfigurieren Sie die IP-Adressen der virtuellen Schnittstellen:

    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
    
  • Konfigurieren Sie das Routing im Testnamespace:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • Aktivieren Sie ip_forward und richten Sie eine NAT-Regel ein, um den vom erstellten Namespace eingehenden Datenverkehr weiterzuleiten (Sie müssen die Netzwerkschnittstelle und die SNAT-IP-Adresse anpassen):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o YOURNETWORKINTERFACE -j SNAT --to-source YOURIPADDRESS
    

    (Sie können auch die MASQUERADE-Regel verwenden, wenn Sie es vorziehen)

  • Schließlich können Sie den zu analysierenden Prozess im neuen Namespace ausführen und auch wireshark:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Sie müssen die veth-a-Schnittstelle überwachen.

Olivier
quelle
2
straceist eigentlich spezifisch für den Linux-Kernel, gilt also nicht für alle Unix-ähnlichen Betriebssysteme. Soweit ich weiß, haben BSD-ähnliche Systeme ähnliche Dienstprogramme (DTrace und Truss). Wie auch immer, gute Antwort (so positiv). Willkommen bei Stack Exchange.
Anthony G - Gerechtigkeit für Monica
Die Antwort scheint in die richtige Richtung zu weisen, aber ich habe Probleme, die straceAusgabe während der Prüfung zu interpretieren git fetch. Ich hatte erwartet, dass eine Art URL in der Ausgabe enthalten sein würde, wie dies auch vom OP gefordert wurde. Kann jemand helfen?
Andreee
14

Versuchen

lsof -i -a -p `pidof firefox`
alxrem
quelle
Es funktioniert teilweise: Es druckt einige der aktuellen Verbindungen des Prozesses, wird dann aber automatisch geschlossen. Für einige Programme ist die Ausgabe nur diese Warnung:lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /home/user/.gvfs Output information may be incomplete.
ᴜsᴜ
Sie können Optionen hinzufügen, -r1um die Ausgabe jede Sekunde zu wiederholen und -wWarnungen zu unterdrücken.
Alxrem
2
Hier werden nur Verbindungen zu einem bestimmten Zeitpunkt angezeigt. Es werden nicht alle Verbindungen aufgelistet, die ein Prozess im Laufe seiner Lebensdauer herstellt. Selbst wenn Sie diesen Befehl in eine Schleife einfügen, werden kurzlebige Verbindungen übersehen.
Gilles 'SO- hör auf böse zu sein'
Der Fragesteller hat nicht darum gebeten, die Verbindungen während der gesamten Lebensdauer anzuzeigen. Man könnte interpretieren , (in real-time)wie from the point in time of tracking and forward.
llua
8

Hier ist ein anderer Ansatz:

ss -nap | grep $(pidof firefox)

Beispielausgabe:

tcp    ESTAB      0      0          192.168.0.222:49050    216.58.218.164:443    users:(("firefox",3280,69))
tcp    ESTAB      0      0          192.168.0.222:48630    198.252.206.25:443    users:(("firefox",3280,106))
tcp    ESTAB      0      0          192.168.0.222:44220     216.58.217.38:443    users:(("firefox",3280,140))
tcp    ESTAB      0      0          192.168.0.222:52690    54.240.170.181:80     users:(("firefox",3280,107))
tcp    ESTAB      0      0          192.168.0.222:48744    198.252.206.25:443    users:(("firefox",3280,87))
tcp    ESTAB      0      0          192.168.0.222:48811    198.252.206.25:443    users:(("firefox",3280,73))
Sergiy Kolodyazhnyy
quelle
1
Hier werden nur Verbindungen zu einem bestimmten Zeitpunkt angezeigt. Es werden nicht alle Verbindungen aufgelistet, die ein Prozess im Laufe seiner Lebensdauer herstellt. Selbst wenn Sie diesen Befehl in eine Schleife einfügen, werden kurzlebige Verbindungen übersehen.
Gilles 'SO- hör auf böse zu sein'
5

Du kannst es auch mit probieren netstat -p. Von der Manpage:

netstat - Druckt Netzwerkverbindungen, Routingtabellen, Schnittstellenstatistiken, Maskeradeverbindungen und Multicast-Mitgliedschaften

Um nur Netzwerkverbindungen anzuzeigen, verwenden Sie netstat -tup. Beachten Sie, dass Sie möglicherweise root sein müssen, um die Prozess-PID zu sehen.

Wenn Sie nicht netstatauf Ihrem System haben ss, haben Sie möglicherweise , die fast die genaue Syntax hat. Sie können dann ss -tup(als root) verwenden.

abel
quelle
1
Hier werden nur Verbindungen zu einem bestimmten Zeitpunkt angezeigt. Es werden nicht alle Verbindungen aufgelistet, die ein Prozess im Laufe seiner Lebensdauer herstellt. Selbst wenn Sie diesen Befehl in eine Schleife einfügen, werden kurzlebige Verbindungen übersehen.
Gilles 'SO- hör auf böse zu sein'
1
netstat -p | grep firefox | grep tcp
Philip Kirkbride
@Gilles Das heißt, es ist eine großartige Antwort für alle, die die Verbindungen zu einem bestimmten Zeitpunkt anzeigen möchten. Wie war mein Fall vor kurzem.
Jose Antonio Reinstate Monica