Wie kann ich herausfinden, welcher Prozess Daten an einen bestimmten Port sendet?

21

Ich habe einen Dienst, der einen bestimmten Hafen offen hält.

Ich erhalte Daten, die ich weder erwarten noch erhalten möchte, und ich versuche, die Quelle dieser Daten genau zu bestimmen. Wie kann ich also herausfinden, welcher Prozess Daten an einen bestimmten Port sendet und welcher nicht.

user50849
quelle

Antworten:

23

Für TCP (obwohl der gleiche Ansatz für SCTP 1 oder ein anderes verbindungsorientiertes Transportprotokoll funktionieren würde ), wie für die Suche nach empfangsbereiten Protokollen:

lsof -nPi tcp:the-port

Meldet die Prozesse, bei denen ein TCP-Socket an diesem Port geöffnet ist. Wenn Sie den Quellport kennen (Ihre Serveranwendung kann ihn kennen und protokollieren), können Sie ihn stattdessen verwenden, um den nicht autorisierten Client zu lokalisieren.

Für UDP- oder RAW-Sockets wäre es schwieriger, obwohl ich annehme, dass hier etwas wie systemtap oder dtrace nützlich sein kann. Möglicherweise auch auditiert.


1 Obwohl die SCTP-Unterstützung (nur unter Linux) lsofin Version 4.86 hinzugefügt wurde , können Sie -iSCTP-Sockets nicht explizit anfordern. Hier kann lsof -nP | grep -w 'SCTP.*:the-port'stattdessen eine Heuristik verwendet werden.

Stéphane Chazelas
quelle
Das funktioniert bei mir nicht mit SCTP.
Sudo
1
@sudo, siehe Bearbeiten
Stéphane Chazelas
3

Versuchen Sie Folgendes:

$sudo ss -tp

Oder:

$sudo netstat -A inet -p

So vermeiden Sie localhost-Ergebnisse:

$sudo netstat -A inet -p | grep -v localhost

So listen Sie nur HERGESTELLTE Verbindungen auf:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED
Amol
quelle
2

Abhängig von der Art der Verbindung, die zum Senden von Daten hergestellt wird, bringt Sie einer dieser Ansätze an einen bestimmten Ort.

  • Hiermit tcpdump port 1234erfassen Sie die Daten, die an diesen Port gesendet werden. Sie können ein Programm wie Wireshark verwenden, um es auf einem anderen Computer zu analysieren (mit der -wOption in einer Datei erfasst ). Alternativ können Sie Wireshark auch direkt verwenden.

  • Falls eine TCP / UDP-Verbindung hergestellt und geöffnet bleibt netstat, können Sie die Remote-IP- Adresse der Verbindung ermitteln.

  • Listen Sie die offenen Sockets eines Prozesses wie in der Antwort von @StephaneChazelas angegeben auf.

gertvdijk
quelle
1

Sie können den sockstatBefehl verwenden, um den Prozess zu finden, der die Verbindung zu Ihrem Dienst auf dem lokalen Host initiiert hat.

DESCRIPTION
     The sockstat command lists open Internet or UNIX domain sockets.

Ordnen Sie einfach alle Quellverbindungen Ihrem Ziel zu. Dies funktioniert gut für TCP / UDP / UNIX-Sockets.

Andrey Voitenkov
quelle
0

Unter Solaris sollte durch Ausführen von pfiles auf allen Prozessen angezeigt werden, welche Prozesse welche Verbindungen geöffnet haben. Es erfordert einige sorgfältige Bearbeitung, wahrscheinlich unter Verwendung der Optionen -A, -B von ggrep ...

Unter Linux netstat -anp --inetfunktioniert es auch ohne lsof. (Lassen Sie das fallen --inet, um auch Unix-Domain-Sockets zu erhalten.)

Gert van den Berg
quelle