2013-06-07 15:55:48 +0000 2013-06-07 15:55:48 +0000
51
51

TCP-Verkehr auf einem bestimmten Port überwachen

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

Mein Ziel ist es, den TCP-Verkehr auf einem bestimmten Port zu überwachen, um eingehende Verbindungen zu sehen und sie in eine Textdatei zu schreiben. Der Haken an der Sache ist, dass ich auch einen Zeitstempel auf jeder Zeile brauche, um genau zu zeigen, wann der Client sich auf die Sekunde genau verbunden hat.

Ich habe netstat, nmap und tcptrack bereits ausgeschöpft, aber keine unterstützen Zeitstempel.

Ich dachte, ein Linux-Shell-Skript könnte funktionieren, wenn ich einen bestimmten lokalen Port überwache und Text in eine Datei schreibe, wenn eine Verbindung hergestellt wird, und dann einfach das Datum auf jeder Zeile verknüpfe.

Ich spielte mit diesem:

netstat -ano|grep 443|grep ESTABLISHED

sowie diesem:

tcptrack -i eth0 port 443

, aber keines von beiden entsprach meinen Bedürfnissen, da ich die Zeit brauche, zu der die Verbindung hergestellt wird.

Wenn Sie irgendwelche Vorschläge haben oder mir die richtige Richtung weisen könnten, wäre ich Ihnen sehr dankbar.

Danke. :)

Antworten (7)

73
73
73
2013-06-07 16:03:28 +0000

bearbeiten : Ich bekomme auch Jahre später noch Stimmen dafür. Bitte gehen Sie nicht auf diese Antwort ein, die Antwort mit iptables hier ist meiner Meinung nach weit überlegen.


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

oder nur tcp-syn oder nur tcp-ack (meine Vermutung wäre diese), je nachdem, was Sie brauchen.

33
33
33
2014-12-05 15:08:24 +0000

Sie können dafür die iptables-Unterstützung im Linux-Kernel verwenden. Der Vorteil ist, dass es keine zusätzliche Software benötigt, um mäßig nützlich zu sein. Die Kehrseite ist, dass es Root-Privilegien erfordert, um es einzurichten (aber da Sie von Port 443 sprechen, der ein privilegierter Port ist, benötigen Sie wahrscheinlich bei den meisten Lösungen Root-Privilegien).

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

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

(Passen Sie den -I INPUT-Teil nach Ihrem Geschmack an.)

Wenn die Regel ausgelöst wird, wird ein Syslog-Eintrag vom Kernel ausgegeben. Bei einer Eingaberegel kann der Protokolleintrag zum Beispiel so aussehen:

Dez 5 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:80:80:80:08:00 SRC=A.B.C.D DST=W.X.Y. Z 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 jedes handelsübliche 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 leiten, wodurch Ihre Anforderung, die Verbindungsdaten ohne zusätzliche Software in eine Datei mit sekundengenauem Zeitstempel zu schreiben, effektiv erfüllt wird.

Beachten Sie, dass das Ziel LOG ein nicht-terminierendes Ziel ist, was bedeutet, dass alle Regeln, die ihm folgen, immer noch ausgewertet werden und das Paket weder zurückgewiesen noch von der LOG-Regel selbst akzeptiert wird. Das macht das Ziel LOG auch für die Fehlersuche bei Firewall-Regeln nützlich.

Um eine Überflutung Ihres Protokolls zu vermeiden, sollten Sie erwägen, das Modul limit in Verbindung damit zu verwenden. Siehe die iptables(8)-Manualseite für Einzelheiten.

26
26
26
2013-06-07 16:13:36 +0000

Mikro-Sekunden-Auflösung

Standardmäßig gibt das Dienstprogramm tcpdump die Zeit mit Mikro-Sekunden-Auflösung an. Beispiel:

$ sudo tcpdump -i any port 443

wird eine Ausgabe ähnlich der folgenden anzeigen:

12:08:14.028945 IP localhost.33255 > localhost.https: Flags [S], seq 1828376761, win 43690, Optionen [mss 65495,sackOK,TS val 108010971 ecr 0,nop,wscale 7], Länge 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
5
5
2013-06-07 16:09:31 +0000

443 ist verschlüsselter Datenverkehr - es ist ohnehin schwierig, dem Datenverkehr auf diesem Port auf den Grund zu gehen:

Sie können

yum ngrep installieren oder apt-get ngrep installieren

dann

ngrep -W byline -d any port 443 -q
``` ausführen
2
2
2
2016-06-02 09:48:03 +0000

Möglicherweise benötigen Sie dies auch, um die ein- und ausgehenden Pakete von anderen Rechnern zu überwachen.

tcpflow -i eth0 -c port 7891

(Option -i für die Erwähnung des Netzwerks, Option -c, um die Pakete in der Konsole zu drucken)

1
1
1
2013-06-07 15:59:57 +0000

Sie können tcpdump oder Wireshark verwenden.

0
0
0
2017-05-26 11:08:35 +0000

Wenn Sie eine permanente Lösung benötigen, die den Datenverkehr auf den interessierenden Ports immer überwacht, schlage ich vor, QoS (den tc-Befehl unter Linux) zu verwenden. tc ist etwas kryptisch und undokumentiert, daher verwende ich FireQoS, um QoS und Netzdaten für die Echtzeitüberwachung einzurichten.

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