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 derDokumentation88
Ich 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
lsof
Ich weiß , wie man verwendet netstat
und ss
wie man die offenen Ports für Prozesse abruft, die für längere Zeiträume an Ports gebunden sind, aber insbesondere kinit
scheint 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.