Genutzte Ports in Linux anzeigen
Belegte Ports unter Linux anzeigen mit ss, netstat und lsof: die Befehle, um lauschende Ports aufzulisten, den zugehörigen Prozess zu finden und nach TCP oder UDP zu filtern.
Hinter jeder Web-Adresse steckt eine Portnummer. HTTP fragt den Server auf Port 80 an, HTTPS auf Port 443. Beide Nummern sind bei der IANA fest vergeben und bedeuten deshalb auf jedem System dasselbe.
Spannend wird die Frage erst, wenn zwei Dienste denselben Port wollen. Dann startet ein Webserver wie NGINX oder Apache nicht und meldet, die Adresse sei bereits in Benutzung. Wer sie belegt, verrät er nicht.
Ich fahre meine Server mit NGINX, weil er Webserver und Reverse-Proxy in einem ist. Er nimmt die Anfrage auf Port 443 entgegen und reicht sie intern weiter – an einen Apache, an eine andere Domain oder an einen Docker-Container, der auf 8080 oder 8443 lauscht. Bequem ist das. Es sorgt aber auch dafür, dass auf einer einzigen Maschine schnell ein Dutzend Ports belegt sind und niemand mehr weiß, welcher davon zu welchem Dienst gehört.
Drei Werkzeuge beantworten das: lsof, netstat und ss. Sie stammen aus drei verschiedenen Paketen und gehen drei verschiedene Wege zum selben Ergebnis.
Offene Ports mit lsof prüfen
lsof gehört auf Debian und Ubuntu nicht zur Grundausstattung. Auf einer schlanken Server-Installation fehlt es meistens. Nachrüsten:
sudo apt install lsof -y
Der Name steht für list open files, und genau das tut das Werkzeug: Es zeigt, welcher Prozess welche Datei offen hat. Unter Linux ist auch ein Netzwerk-Socket eine Datei. Deshalb findet lsof nebenbei die offenen Ports – mit dieser Kombination aus vier Teilen:
sudo lsof -i -P -n | grep LISTEN
Heraus kommt eine Zeile je Verbindung, die auf dem System auf Anfragen wartet. Die Optionen im Einzelnen:
- -i: beschränkt die Ausgabe auf Netzwerkverbindungen statt aller offenen Dateien.
- -P: lässt Portnummern Zahlen bleiben, statt 22 zu ssh und 443 zu https aufzulösen.
- -n: unterdrückt die Namensauflösung der Adressen. Bei trägem DNS spart das jedes Mal mehrere Sekunden.
- grep LISTEN: wirft die bereits aufgebauten Verbindungen weg und lässt die lauschenden übrig.
Die erste Spalte nennt den Prozessnamen, die zweite seine PID. Damit ist die eigentliche Frage beantwortet: welcher Port belegt ist und von wem. Ein Haken bleibt. Ohne sudo siehst du nur deine eigenen Prozesse, und ausgerechnet die interessanten Dienste laufen als root oder unter einem eigenen Benutzer.
Ports mit netstat anzeigen
netstat steckt im Paket net-tools, und das ist auf neueren Systemen oft gar nicht mehr installiert. Auf einem Ubuntu 22.04 LTS fehlt es; ss liegt dort ohne Zutun unter /usr/bin/ss. Wer netstat trotzdem will, holt es sich so:
sudo apt install net-tools -y
netstat zeigt Routing-Tabellen, Schnittstellen-Statistiken und eben belegte Ports. Es ist das Werkzeug, das in den meisten Anleitungen im Netz steht. Die eigene Handbuchseite sieht das inzwischen anders und beginnt mit dem Satz „This program is mostly obsolete. Replacement for netstat is ss.” Für einen schnellen Blick tut es trotzdem noch seinen Dienst:
netstat -tuln
Die vier Buchstaben hinter dem Befehl stehen für TCP (-t), UDP (-u), nur lauschende Sockets (-l) und numerische Ausgabe ohne Namensauflösung (-n). Hängst du ein -p an, nennt die letzte Spalte zusätzlich PID und Namen des Prozesses. Dafür braucht der Aufruf allerdings sudo.
Ports mit ss anzeigen
ss kommt aus dem Paket iproute2. Das trägt unter Debian und Ubuntu die Paketpriorität important und ist damit praktisch überall vorhanden, auch auf einem minimalen Container-Image. Die folgende Zeile brauchst du deshalb selten – nur, falls das Paket wirklich einmal fehlt:
sudo apt install iproute2 -y
Der Name ist die Abkürzung von socket statistics. Was das Werkzeug leistet, fasst seine Handbuchseite in zwei Sätzen zusammen: Es zeige Informationen ähnlich denen von netstat und könne dabei mehr über TCP und Verbindungszustände ausgeben als andere Werkzeuge. Dass ss außerdem schneller sei, steht in vielen Anleitungen, in der Handbuchseite aber nicht – und auf einem Rechner mit ein paar Dutzend Sockets merkst du davon ohnehin nichts. Der Aufruf ist derselbe wie bei netstat:
ss -tuln
Die Ausgabe listet dieselben TCP- und UDP-Ports, nur etwas anders formatiert. Interessanter ist die Variante mit angehängtem p: ss -tulnp stellt hinter jede Zeile den Prozess, der den Port hält. In der Praxis ist das der Aufruf, den man wirklich braucht. Die Information, dass Port 8080 belegt ist, hilft niemandem weiter; die PID dahinter schon.
Womit du am Ende arbeitest, lässt sich in drei Zeilen sagen. ss -tulnp ist der erste Griff, weil das Paket auf jedem System liegt. lsof nimmst du, wenn die Frage von der Dateiseite kommt – etwa weil ein Prozess ein Verzeichnis blockiert und du wissen willst, was er sonst noch offen hat. Und netstat dann, wenn du auf einem alten System sitzt, auf dem ss tatsächlich fehlt.