Überwachen Sie den TCP-Verkehr auf einem bestimmten Port


49

Ich habe ziemlich ausgiebig danach gesucht, kann aber anscheinend kein funktionierendes Beispiel finden.

Mein Ziel ist es, den TCP-Verkehr an einem bestimmten Port zu überwachen, um eingehende Verbindungen zu erkennen und in eine Textdatei zu schreiben. Der Haken ist, ich brauche auch einen Zeitstempel in jeder Zeile, um genau zu zeigen, wann der Client eine Verbindung zum zweiten hergestellt hat.

Ich habe bereits netstat, nmap und tcptrack erschöpft, aber keiner unterstützt Timestamp.

Ich dachte, ein Linux-Shell-Skript könnte funktionieren, wenn ich einen bestimmten lokalen Port überwache und beim Herstellen einer Verbindung Text in eine Datei schreibe und dann das Datum in jeder Zeile verkette.

Ich habe damit gespielt:

netstat -ano|grep 443|grep ESTABLISHED

so gut wie das:

tcptrack -i eth0 port 443

Aber beides passt nicht zu meinen Bedürfnissen, da ich die Zeit benötige, in der die Verbindung hergestellt wird.

Wenn Sie Vorschläge haben oder mich in die richtige Richtung lenken könnten, wären wir Ihnen sehr dankbar.

Vielen Dank. :)

linux  bash 

Haha ist von stackoverflow migriert, muss aber auf Unix / Linux migrieren
Kolob Canyon

Antworten:


70

edit : Ich bekomme immer noch Stimmen für diese Jahre später. Bitte gehen Sie nicht für diese Antwort, die Antwortiptables hier ist meiner Meinung nach weit überlegen.


tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'

oder nur tcp-syn, oder nur tcp-ack, je nachdem, was Sie brauchen.


Gibt es eine Möglichkeit, den Hostnamen für jede Verbindung durch die IP zu überschreiben, anstatt ihn anzuzeigen?

Ja, fügen Sie -nnach tcpdump hinzu (man tcpdump: -n Konvertieren Sie keine Adressen (dh
Hostadressen

5
Ich würde argumentieren, dass das Spammen des Kernel-Logs nicht wirklich überlegen ist. ;)
Daniel B

1
Ah, aber ich würde vorausgesetzt, man konfiguriert richtig, wo welche Protokolle gehen sollen: P Aber hey, diese Antwort ist immer noch hier, wenn das ein Deal Breaker ist :)
Wrikken

1
@Wrikken das Problem bei der Verwendung des Kernel-Protokolls ist, dass bei Verwendung Ihrer Lösung, wenn Sie Strg + C außerhalb von tcpdump verwenden, alles so bleibt wie zuvor. Die iptables-Lösung bedeutet, dass Sie eine "Überraschung" hinterlassen, wenn Sie die Regel nicht manuell entfernen. Diese Überraschung führt dazu, dass Sie in kürzester Zeit eine vollständige Root-Festplatte haben. Sorry, aber ich stimme dem zu (:
John Blackberry

31

Hierfür können Sie die iptables-Unterstützung im Linux-Kernel verwenden. Der Vorteil ist, dass keine zusätzliche Software erforderlich ist, um mäßig nützlich zu sein. Der Nachteil ist, dass zum Einrichten Root-Rechte erforderlich sind (da es sich jedoch um Port 443 handelt, bei dem es sich um einen privilegierten Port handelt, benötigen Sie bei den meisten Lösungen wahrscheinlich Root-Rechte).

Fügen Sie eine iptables-Regel mit etwas hinzu, wie:

sudo iptables -I INPUT -p tcp --dport 443 --syn -j LOG --log-prefix "HTTPS SYN: "

(Passen Sie das -I INPUTTeil an Ihren Geschmack an.)

Wenn die Regel ausgelöst wird, wird vom Kernel ein Syslog-Eintrag ausgegeben. Bei einer Eingaberegel sieht der Protokolleintrag beispielsweise folgendermaßen aus:

5. Dezember 09:10:56 Hostname Kernel: [1023963.185332] HTTPS SYN: IN = ifX OUT = MAC = 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 08: 00 SRC = ABCD DST = WXYZ LEN = 52 TOS = 0x00 PREC = 0x20 TTL = 119 ID = 11901 DF PROTO = TCP SPT = 37287 DPT = 443 WINDOW = 8192 RES = 0x00 SYN URGP = 0

Sie können dann ein beliebiges Protokollüberwachungstool verwenden, um mit diesen Informationen etwas Nützliches zu tun. Wenn Ihre Syslog-Implementierung dies unterstützt, können Sie diese sogar in eine separate Protokolldatei umleiten, wodurch Ihre Anforderung erfüllt wird, die Verbindungsdaten ohne zusätzliche Software in eine sekundengenaue Datei zu schreiben.

Beachten Sie, dass das LOGZiel ein nicht terminierendes Ziel ist. Dies bedeutet, dass alle darauf folgenden Regeln weiterhin ausgewertet werden und das Paket von der LOG-Regel selbst weder abgelehnt noch akzeptiert wird. Dies macht das LOGZiel auch zum Debuggen von Firewall-Regeln nützlich.

Verwenden Sie limitin diesem Zusammenhang das Modul, um ein Überfluten des Protokolls zu vermeiden . Weitere Informationen finden Sie auf der Manpage iptables (8).


ist es möglich, ein Python-Skript auszuführen, das dies auslöst?
Karl Zillner

Vergessen Sie nicht, diese IP-Tabellenregeln zu löschen, wenn Sie fertig sind. Andernfalls werden die Protokolle je nach Regel sehr stark gesperrt. digitalocean.com/community/tutorials/…
Mo Beigi

26

Mikrosekundenauflösung

Standardmäßig gibt das Dienstprogramm tcpdump die Zeit in Mikrosekundenauflösung an. Zum Beispiel:

$ sudo tcpdump -i any port 443

zeigt eine Ausgabe ähnlich der folgenden an:

12: 08: 14.028945 IP localhost.33255> localhost.https: Flags [S], seq 1828376761, win 43690, options [mss 65495, sackOK, TS val 108010971 ecr 0, nop, wscale 7], length 0
12:08: 14.028959 IP localhost.https> localhost.33255: Flags [R.], seq 0, ack 1828376762, win 0, length 0

Siehe tcpdump (8) für eine vollständige Liste der tcpdump-Optionen und pcap-filter (7) für die vollständige Syntax der Filter, die Sie verwenden können.


5

443 ist verschlüsselter Datenverkehr - so schwierig, den Datenverkehr auf diesem Port ohnehin zu kontrollieren:

du kannst tun

yum install ngrep oder apt-get install ngrep

dann renne

ngrep -W byline -d any port 443 -q

2

Dies kann auch erforderlich sein, um eingehende und ausgehende Pakete von anderen Computern zu überwachen.

tcpflow -i eth0 -c port 7891

(Option -izum Erwähnen des Netzwerks, Option -czum Drucken der Pakete in der Konsole)


Dies ist wirklich ein Kommentar und keine Antwort auf die ursprüngliche Frage. Wenn Sie einen Autor kritisieren oder um Klarstellung bitten möchten, hinterlassen Sie einen Kommentar unter seinem Beitrag. Sie können jederzeit Ihre eigenen Beiträge kommentieren. Wenn Sie über eine ausreichende Reputation verfügen, können Sie jeden Beitrag kommentieren . Bitte lesen Sie Warum brauche ich 50 Ruf, um einen Kommentar abzugeben? Was kann ich stattdessen tun?
DavidPostill


0

Wenn Sie eine permanente Lösung benötigen, die den Datenverkehr in den Ports von Interesse überwacht, empfehle ich die Verwendung von QoS (der Befehl tc unter Linux). tc ist ein bisschen kryptisch und undokumentiert, daher verwende ich FireQoS, um QoS und Netzdaten für die Echtzeitüberwachung einzurichten.

Überprüfen Sie dies für weitere Informationen: https://github.com/firehol/netdata/wiki/You-should-install-QoS-on-all-your-servers


Ich würde sagen, dies ist ein bisschen zu viel für das Protokollieren von Verbindungen, bei denen iPTables + --log funktioniert.
djsmiley2k - CoW

Sie haben Recht, es ist übertrieben, wenn Sie die Verbindungen protokollieren müssen. Mit dieser Lösung wird nicht überwacht, welche Clients verbunden sind, sondern wie viel Bandbreite der Dienst verwendet.
Costa Tsaousis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.