Gibt es unter Linux eine Möglichkeit, die Ports aufzuzeichnen, über die ein Programm zu kommunizieren versucht?

Gibt es unter Linux eine Möglichkeit, die Ports aufzuzeichnen, über die ein Programm zu kommunizieren versucht?

Problem: Ich versuche herauszufinden, welche Ports für bestimmte Programme geöffnet werden sollen

Ich habe mehrere Programme, die auf Dienste auf Remote-Hosts zugreifen müssen, aber ich weiß nicht, welche Ports sie zu diesem Zweck verwenden. Anstatt die Firewall bis 0-1024(oder 0-65k) zu öffnen, möchte ich herausfinden, welche Ports ein Programm während der Ausführung verwendet.

Das erste zu überprüfende Programm ist kinit. Von derDokumentation88Ich nehme an, dass ich den Port für eingehenden UDP-Verkehr und den Port für ausgehenden TCP- und UDP-Verkehr öffnen muss 88. Aber das scheint nicht auszureichen, da das Programm mit

kinit: Resource temporarily unavailable while getting initial credentials

Das Öffnen aller Ports führt zu einem korrekten Authentifizierungsablauf für kinit:

Using default cache: /tmp/krb5cc_16381
Using principal: *****@******.******.***
Password for *****@******.******.***:
Authenticated to Kerberos v5

lsofIch weiß , wie man verwendet netstatund sswie man die offenen Ports für Prozesse abruft, die für längere Zeiträume an Ports gebunden sind, aber insbesondere kinitscheint sich diese Auflistung zu entziehen, selbst wenn es zusammen mit einem Tool wie verwendet wird watch.

Bearbeiten: Die akzeptierte Antwort zeigte mir sofort den Schuldigen: DNS;

strace -e trace=connect kinit <user>@<kdc>
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("<kdc_ip>")}, 16) = 0

Durch das Öffnen dieses Ports wurde das Problem mit Kerberos behoben

Antwort1

Du könntest es mit strace versuchen:

strace -e trace=connect your_program with arguments

Hier ist eine Beispielausgabe:

$ strace -e trace=connect ssh somehost -p 8081
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.1.1")}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(8081), sin_addr=inet_addr(<host ip address>)}, 16) = 0
connect(4, {sa_family=AF_LOCAL, sun_path="/run/user/1000/keyring/ssh"}, 110) = 0

Die Zeilen, die Sie benötigen, sind die mit dem sa_family=AF_INET.

Antwort2

Sie können Ihre iptables-Regeln so konfigurieren, dass der Datenverkehr protokolliert wird und Sie genau sehen, welcher Datenverkehr gesendet wurde, als Sie ein bestimmtes Programm ausgeführt haben. Dies funktioniert auf einem ausgelasteten System nicht gut, da Sie nicht erfahren, welches Programm welchen Datenverkehr gesendet hat. Bei geringer Auslastung sollten Sie jedoch in der Lage sein, herauszufinden, was passiert.

Beispiel für Ein- und Ausgabe:

iptables -A INPUT -j LOG --log-prefix "INPUT:DROP:" --log-level 6
iptables -A INPUT -j DROP
iptables -A OUTPUT -j LOG --log-prefix "OUTPUT:DROP:" --log-level 6
iptables -A OUTPUT -j DROP

Wenn Sie es komplexer gestalten möchten, stehen Ihnen noch viele weitere Optionen und Funktionen zur Verfügung.

verwandte Informationen