Wie kann ich die Netzwerkaktivität eines Befehls verfolgen?

13

Ich möchte die Netzwerkaktivität eines Befehls verfolgen. Ich habe versucht, tcpdump und strace ohne Erfolg auszuführen.

Wenn ich beispielsweise ein Paket installiere oder einen Befehl verwende, der versucht, eine Site zu erreichen, möchte ich diese Netzwerkaktivität (die Site, die er zu erreichen versucht) anzeigen.

Ich denke, wir können dies mit tcpdump tun. Ich habe versucht, aber es verfolgt alle Netzwerkaktivitäten meines Systems. Angenommen, ich führe mehrere netzwerkbezogene Befehle aus und möchte nur bestimmte Befehlsnetzwerkaktivitäten verfolgen. In diesem Fall ist es schwierig, die genaue Lösung zu finden.

Gibt es eine Möglichkeit, das zu tun?

AKTUALISIEREN:

Ich möchte nicht alles auf meiner Netzwerkschnittstelle nachverfolgen. Ich möchte nur die Netzwerkaktivität des Befehls (zum Beispiel #yum install -y vim) verfolgen. Wie die Website, die es zu erreichen versucht.

Buvanesh Kumar
quelle
1
Platzieren Sie die Anwendung in einem Netzwerk-Namespace und verwenden Sie dann tcpdump / wireshark. Siehe zB hier .
Dirkt

Antworten:

17

Der Einfachheit halber netstat

Den netstatPID- oder Prozessnamen verwenden und nach ihm suchen:

# netstat -np --inet | grep "thunderbird"
tcp        0      0 192.168.134.142:45348   192.168.138.30:143      ESTABLISHED 16875/thunderbird
tcp        0      0 192.168.134.142:58470   192.168.138.30:443      ESTABLISHED 16875/thunderbird

Und Sie könnten watchfür dynamische Updates verwenden:

watch 'netstat -np --inet | grep "thunderbird"'

Mit:

  • -n: Zeigen Sie numerische Adressen an, anstatt zu versuchen, symbolische Host-, Port- oder Benutzernamen zu ermitteln
  • -p: Zeigt die PID und den Namen des Programms an, zu dem jeder Socket gehört.
  • --inet: Nur Raw-, UDP- und TCP-Protokoll-Sockets anzeigen.

Strace für Ausführlichkeit

Sie sagten, Sie haben das straceTool ausprobiert , aber haben Sie die Option ausprobiert trace=network? Beachten Sie, dass die Ausgabe sehr ausführlich sein kann, sodass Sie möglicherweise etwas Greifen benötigen. Beginnen Sie mit "sin_addr".

 strace -f -e trace=network <your command> 2>&1 | grep sin_addr

Oder verwenden Sie für einen bereits laufenden Prozess die PID:

 strace -f -e trace=network -p <PID> 2>&1 | grep sin_addr
Gohu
quelle
+1, für netstatdie IMHO die einfachste und sauberste Lösung ist.
dr01
@ Gohu Ich habe das gleiche für dnf. aber kein glück. Ich habe versucht, einige Pakete mit dnf zu installieren, dann sehe ich, dass der dnf-Prozess ausgeführt wird (Prozessname: dnf gemäß top und ps aux-Befehl). Leider habe ich keine Ausgabe von netstat -np --inet | erhalten grep "dnf".
Buvanesh Kumar
+1 für strace. Es ist mein Problem behoben. Ich kann die IP-Adressen abrufen. Vielen Dank für Ihre Antwort :) @ Gohu. Ich vermute, es gibt alle IP-Adressen an, die es über das Netzwerk erreicht (z. B. Router-IP und andere IPs). Wenn Sie wissen, ist es möglich, nur die Ziel-IP zu verfolgen?
Buvanesh Kumar
Sie können versuchen, die straceAusgabe weiter zu filtern , indem connectSie nur die Systemaufrufe beibehalten und die dnsAnforderungen (Port 53) entfernen :| grep connect | grep -v 'sin_port=htons(53)'
Gohu
+1 für die Trace-Netzwerk-Option auf Straße
Phreed
5

Ich würde einen neuen Netzwerk-Namespace erstellen , ihn mit dem realen Netzwerk verbinden und dann die Bridge mit überwachen tcpdump.

Simon Richter
quelle
1
Danke für die Antwort. Es wäre toll, wenn du mir sagen würdest, wie es geht :).
Buvanesh Kumar
5

sysdig Ermöglicht Ihnen die Überwachung aller Aktivitäten des Kernels oder mehrerer Befehle, die in Ihrem System ausgeführt werden, einschließlich und nicht beschränkt auf Netzwerkaktivitäten.

Da die Ausgabe sehr umfangreich sein kann, müssen Sie Filter erstellen. Die Standardseite für die grundlegendsten Filter ist verständlich.

Es hat auch den Vorteil, dass es nicht als Anwendungs-Wrapper wie in verwendet wird strace, und es kann sehr leistungsfähig sein.

Aus Sysdig-Beispielen

Vernetzung

Sehen Sie sich die wichtigsten Prozesse zur Auslastung der Netzwerkbandbreite an

sysdig -c topprocs_net 

Zeigen Sie die mit dem Host 192.168.0.1 ausgetauschten Netzwerkdaten an

Als binär:

sysdig -s2000 -X -c echo_fds fd.cip=192.168.0.1   

Als ASCII:

sysdig -s2000 -A -c echo_fds fd.cip=192.168.0.1 

Siehe die wichtigsten lokalen Server-Ports:

In Bezug auf bestehende Verbindungen:

sysdig -c fdcount_by fd.sport "evt.type=accept"   

In Bezug auf die Gesamtzahl der Bytes:

sysdig -c fdbytes_by fd.sport 

Siehe die Top-Client-IPs

In Bezug auf bestehende Verbindungen

sysdig -c fdcount_by fd.cip "evt.type=accept"   

In Bezug auf die Gesamtzahl der Bytes

sysdig -c fdbytes_by fd.cip 

Listen Sie alle eingehenden Verbindungen auf, die nicht von Apache bedient werden.

sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"
Rui F Ribeiro
quelle
1

Mit wireshark können Sie den gesamten Ein- und Ausgabeverkehr einer Netzwerkschnittstelle aufspüren. Falls Sie eine Option ohne GUI benötigen, können Sie tshark verwenden.

Mit beiden Optionen können Sie den gesamten Netzwerkverkehr anzeigen und speichern, um später alle eingerichteten Verbindungen zu analysieren.

Ricard Molins
quelle
1
Wie ich bereits sagte: Wenn ich mehrere netzwerkbezogene Befehle ausführe, wie kann ich dann feststellen, mit welchem ​​Befehl welche Site abgerufen wird?
Buvanesh Kumar
Dies ist eine allgemeinere Antwort. Dass ich bereits weiß, dass wir die Netzwerkaktivität einer Netzwerkschnittstelle verfolgen können :). Ich suche nach einer bestimmten Befehlsnetzwerkstatik.
Buvanesh Kumar
Wenn Sie wissen, welche Ports der Befehl verwendet, können Sie den Sniff möglicherweise filtern, um ihn auf den gewünschten Befehl zu beschränken. Dies ist jedoch in Ihrer Situation möglicherweise nicht möglich.
Ricard Molins