Wie kann ich alle ausgehenden Anforderungen / Verbindungen von meinem Computer überwachen?

71

Mein Computer ist ein Server, daher möchte ich Verbindungen zu meinem Server ignorieren (z. B. wenn jemand meine Website besucht). Ich möchte nur Verbindungen / Anfragen von meinem Server zu anderen Orten sehen.

Wie sehe ich nur diese ausgehenden Verbindungen?

EDIT: Ich bin neu in diese Art von Dingen. Ich versuche nur festzustellen, ob von meinem Server etwas anderes als Daten für meine Web-Apps gesendet werden. Wenn zum Beispiel jemand meine Websites besucht, sendet mein Server offensichtlich Daten an den Browser des Kunden. Angenommen, irgendwo im Framework meiner Webanwendung befindet sich auch Code, der statistische Daten an einen anderen Ort sendet, den ich nicht kenne. Ich möchte die Orte sehen, an die mein Server Daten sendet, falls vorhanden. Es ist wahrscheinlich unwahrscheinlich, aber nehmen wir an, Sie verwenden ein PHP- oder NodeJS-Framework, das Sie nicht geschrieben haben: Es besteht eine geringe Wahrscheinlichkeit, dass es irgendwo Daten sendet. Wenn ja, würde ich das gerne sehen.

trusktr
quelle

Antworten:

77

Verwenden Sie netstat. Zum Beispiel

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

listet alle ausgehenden UDP ( u), TCP ( t) und RAW ( w) -Verbindungen (ohne loder a) in numerischer Form auf ( nverhindert mögliche lang andauernde DNS-Abfragen) und enthält das pdazugehörige Programm ( ).

Erwägen Sie das Hinzufügen der cOption, um die Ausgabe fortlaufend zu aktualisieren.

gertvdijk
quelle
Vielen Dank. Das sind gute Infos. Könnten Sie sich meine aktualisierte Frage ansehen?
Trusktr
1
Völlig unangemessener Hijack (außer dass diese Antwort gut gegoogelt hat): Diese Antwort funktioniert auch mit Windows. Dort netstatim "Continuous Mode" zu arbeiten, -cfunktioniert nicht. Sie verwenden stattdessen Zahlen, netstat -na 1 | find "[Scan_Host_IP_Addr]"damit diese jede 1Sekunde aktualisiert werden (in diesem Beispiel). ( Quelle ).
Ruffin
4
Bei diesen Umfragen werden nicht immer alle Verbindungen abgefangen .
reinierpost
Gibt es eine Möglichkeit, benutzerfreundlichere Informationen wie Domainnamen und Informationen zur IP-Adresse anzuzeigen? Vielleicht mit einem benutzerdefinierten Skript?
Awm
@awm Nun, das wäre machbar, wenn man stracenach Nameserver-Lookups filtert (keine Details, dies ist keine vollständige Antwort darauf). Alternativ können Sie die umgekehrte DNS der in aufgeführten IP-Adressen anzeigen, netstatindem Sie die nin meiner Antwort enthaltene Option weglassen .
Gertvdijk
11

Wenn Sie nur jeden Verbindungsversuch protokollieren möchten, ist das einfachste iptables LOGZiel wahrscheinlich Linux (oder die entsprechende Firewall-Protokollierungsfunktion auf Ihrem System).

Wenn Sie weitere Informationen benötigen, wie die Dauer der Verbindung und die Menge der in beide Richtungen ausgetauschten Daten, ist conntrackd(unter Linux) wahrscheinlich die beste Option.

Beachten Sie jedoch, dass die beiden oben genannten nur den Datenverkehr protokollieren, der durch Netfilter geleitet wird, bei dem es sich im Allgemeinen um den gesamten Datenverkehr handelt, jedoch nicht um Datenverkehr, der mit IP-Stacks im Benutzerbereich generiert wurde (z. B. virtuelle Maschinen oder alles, was Raw-Sockets verwendet), oder um überbrückten Datenverkehr.

Weitere allgemeine Lösungen können Sie einen Blick auf Dinge wie haben argus, bro-ids, sancpoder ntopdass melden Sie sich alle Arten von Informationen basierend auf den Verkehr sie auf einer Schnittstelle schnuppern.

Stéphane Chazelas
quelle
8

Ich habe eine Reihe von Werkzeugen versucht, einschließlich iftop, ntop, iptraf, und natürlich die sehr nützlich eingebauten in netstat -tupln(unterstützten Optionen sind OS-abhängig), aber die meist praktisch für meinen Anwendungsfall entpuppten nethogs- es aggregiert Verbindungen durch den Ursprung App , und ist die leiseste von allen.

Installierbar über:

sudo apt-get install nethogs

Als root ausführen:

sudo nethogs

Wenn Sie nur alle von einer App initiierten TCP-Verbindungen anzeigen möchten, können Sie Folgendes verwenden:

sudo tcpdump -i lo -A | grep Host:
ccpizza
quelle
6

Ich denke, Sie möchten eine Liste der empfangsbereiten Ports abrufen und diese dann von allen anderen TCP-Verbindungen entfernen. Das sind dann alle ausgehenden Verbindungen. Der Befehl ss (Socket-Status) gibt die Spalten "Local Address: Port" und "Peer Address: Port" aus. Wir müssen die empfangsbereiten Ports aus der Spalte "Local Address: Port" und nicht aus der Spalte "Peer Address: Port" entfernen. Andernfalls verpassen Sie möglicherweise einige ausgehende Verbindungen. Um dies zu erreichen, verwende ich \s{2}+im grep die Zeichenfolge ": $ port", um die Leerzeichen zuzuordnen, die hinter der Spalte "Lokale Adresse: Port" vorhanden sind. Diese Spalte hat zwei oder mehr Leerzeichen dahinter, wobei die "Peer-Adresse: Port" ein Leerzeichen und dann eine neue Zeile (grrr ... sollte nur eine neue Zeile haben, IMO,\s+\s{2}+Normalerweise könnte ich versuchen, die Filterfunktionalität von ss zu verwenden, wie mit ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Aber es scheint eine Grenze für die Länge dieser Zeichenfolge zu geben, sie ist auf einem System ausgebombt, auf dem ich viele Abhörports hatte. Also versuche ich dasselbe mit grep zu machen. Ich glaube das folgende wird funktionieren:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

Beachten Sie, dass dies von der Version von ss abhängt, die Sie verwenden. Ältere Versionen (wie z. B .: ss utility, iproute2-ss111117) haben ein anderes Ausgabeformat. Daher müssen Sie in awk möglicherweise $ 3 anstelle von $ 4 verwenden. Beachten Sie auch ss -tlnund ss -tn state listeninggibt Ihnen andere Ausgabe, die für mich ein wenig kontraintuitiv ist. YMMV.

Ich habe eine etwas elegantere Lösung gefunden, die keine Kenntnis der Host-IP erfordert. Sie ss -tn state established dst :*funktioniert gut. Ich habe die obigen Befehlszeilen geändert.

Tal
quelle
Würden Sie bitte eine Erklärung hinzufügen, wie dies funktioniert? ( Bearbeiten Sie die Antwort. Veröffentlichen Sie keine klärenden Informationen als Kommentare.) Ich glaube, ich habe es teilweise herausgefunden. Es scheint, als ob es etwas mehr Arbeit braucht. Ich lief ss -tn state listeningauf einem Host, auf dem ein FTP-Server ausgeführt wird, und natürlich zeigte der Befehl, dass der Computer Port 21 egrep -vüberwacht "," 211 "," 212 ", ...)? Auch ist das asortwirklich notwendig, oder nur die Schaufensterdekoration?
G-Man,
Ich musste so ziemlich alles reparieren, das korrigierte Skript ist oben.
Dale
Letztendlich wäre es viel schöner, wenn ss oder netstat nur diese Funktionalität einbinden würden. Führen Sie a aus ss --out, um eine Liste der ausgehenden Verbindungen abzurufen.
Dale
Schön, ich mag diese Antwort. Ich werde es ausprobieren, wenn ich wieder die Sicherheit auf meinem Server verbessere. : D
trusktr
Sieht so aus, als könnte dies auch für UDP verwendet werden, aber Sie müssen natürlich nur verschiedene Flags und Status verwenden.
Dale
4

tcpdumpErmöglicht es Ihnen, den gesamten IP-Datenverkehr zu / von einer bestimmten Schnittstelle zu sehen und nach bestimmten Kriterien zu filtern. tcpdumpwird in der Regel standardmäßig auf den meisten * nix-Systemen installiert, andernfalls gibt es normalerweise irgendwo einen Port, um ihn für Ihre spezifische Distribution abzurufen.

txtechhelp
quelle
2

netstat ist eine gute Option. Verwenden Sie die erforderlichen Parameter (siehe Manpages). Zum Beispiel

netstat -antup

Hier kann es alle (a) hörenden numerischen (n) tcp (t) und udp (u) Prozesse (p) überwachen.

Sie können auch den ssBefehl versuchen . Als referenz verwenden:

SS Linux TCP / UDP Netzwerk- und Socket-Informationen

Kratos
quelle