Auf einem Server empfängt jeder Netzwerkdienst Verbindungen über einen bestimmten Port: SSH über Port 22, der Webserver über die Ports 80 und 443 und MariaDB über Port 3306. Mit dem Befehl ss können Sie feststellen, welche Ports gerade offen sind und welches Programm sie belegt. Dieser Artikel erläutert zudem, warum es nicht ausreicht, dass ein Port auf dem Server auf Verbindungen wartet: Von außen ist er nur dann erreichbar, wenn die Firewall den Datenverkehr ebenfalls durchlässt.
Wir haben die Befehle im November 2026 auf einem AlmaLinux-10.2-System getestet, auf dem nginx, MariaDB, Valkey, eine Node.js-Anwendung und Docker 29.9 liefen, sowie auf einem Ubuntu-26.04-System mit nginx. Auf einem eigenen KVM-VPS empfiehlt es sich, die Liste von Zeit zu Zeit durchzugehen: Jeder unnötig geöffnete Port stellt eine weitere Angriffsfläche dar.
Lauschende Ports: ss -tulpn
ss ist Teil des iproute-Pakets (iproute2 unter Ubuntu und Debian) und auf allen aktuellen Distributionen vorinstalliert.
sudo ss -tulpn
Die Optionen:
-t: TCP;-u: UDP;-l: nur die Listening-Sockets, ohne die bereits hergestellten Verbindungen;-p: Name und PID (Prozess-ID) des Programms, das den Port belegt;-n: Gibt Nummern aus, keine Dienstnamen (:22, nicht:ssh).
Das -p zeigt nur mit „sudo“ die Prozesse anderer Benutzer (z. B. „root“ oder mysql) an; ohne „sudo“ bleibt die Spalte Process leer. Wenn Sie sich nur für die Ports interessieren, reicht ss -tuln auch ohne sudo aus und passt sogar in ein schmales Fenster:
Die Ausgabe des Befehls sudo ss -tulpn im Test (gekürzt):
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("chronyd",pid=642,fd=4))
tcp LISTEN 0 80 0.0.0.0:3306 0.0.0.0:* users:(("mariadbd",pid=839,fd=20))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1217,fd=6),...)
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1188,fd=7))
tcp LISTEN 0 511 127.0.0.1:6379 0.0.0.0:* users:(("valkey-server",pid=1190,fd=8))
tcp LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=1217,fd=7),...)
Die Spalten der Ausgabe
| Spalte | Bedeutung |
|---|---|
Netid |
Protokoll: tcp oder udp |
State |
Bei TCP steht dort LISTEN (lauscht); bei UDP besteht keine Verbindung, daher steht dort UNCONN |
Recv-Q, Send-Q |
Bei einem Listening-Socket die Anzahl der wartenden Verbindungen bzw. die Größe der Warteschlange; im alltäglichen Gebrauch nicht von Bedeutung |
Local Address:Port |
Die Adresse und der Port, auf denen das Programm lauscht |
Peer Address:Port |
* bei einem Listening-Socket (kann von überall her auf eine Verbindung warten) |
Process |
Name des Programms, dessen PID und der Dateideskriptor (fd) des Sockets; nur mit dem Schalter -p |
Was bedeutet die Angabe vor der Portnummer?
Unter Local Address wird angezeigt, von wo aus der Dienst erreichbar ist:
| Adresse | Bedeutung |
|---|---|
0.0.0.0:80 |
lauscht auf allen IPv4-Adressen, auch von außen erreichbar (sofern die Firewall dies zulässt) |
[::]:80 |
lauscht auf allen IPv6-Adressen |
*:3000 |
auf allen IPv4- und IPv6-Adressen mit einem einzigen Socket (so wurde im Test eine Node.js-Anwendung angezeigt) |
127.0.0.1:6379, [::1]:6379 |
ist nur von innerhalb des Servers aus erreichbar (localhost) |
127.0.0.53%lo:53 |
nur über die Loopback-Schnittstelle; unter Ubuntu lauscht der lokale DNS-Resolver systemd-resolved auf diese Weise |
10.0.2.15:68 |
nur über diese eine IP-Adresse |
Im Test lauschte Valkey standardmäßig nur auf der Adresse 127.0.0.1; von außen ist es daher auch dann nicht erreichbar, wenn die Firewall geöffnet ist. MariaDB hingegen lauschte mit dem AlmaLinux-10-Paket standardmäßig auf der Adresse 0.0.0.0:3306: Wenn die Datenbank ausschließlich von der auf dem Server laufenden Website genutzt wird, können Sie den Zugriff auf lokale Verbindungen beschränken, indem Sie in der Datei /etc/my.cnf.d/mariadb-server.cnf im Abschnitt [mysqld] die Zeile bind-address=127.0.0.1 einfügen und den Dienst neu starten (im Test zeigte ss danach nur noch die Adresse 127.0.0.1:3306 an). Die Installation von MariaDB wird in einem separaten Artikel beschrieben.
Filtern nach einem Port
sudo ss -tlnp 'sport = :80'
sudo ss -tlnp | grep ':3306 '
sport (Quellport) bezeichnet den lokalen Port. Bei grep passt beispielsweise :3306 aufgrund des Leerzeichens nach dem Port nicht zum Port :33060.
Aufgebaute Verbindungen
Ohne das -l und nach Status gefiltert sehen Sie die aktuell aktiven Verbindungen, beispielsweise wer über SSH verbunden ist:
sudo ss -tnp state established
Die ss -s-Zählung liefert eine Gesamtzahl der Sockets pro Protokoll; viele timewait- oder estab-Verbindungen sind auf einem stark ausgelasteten Webserver normal, auf einem wenig ausgelasteten Server hingegen können sie verdächtig sein.
Welches Programm belegt den Port? lsof und fuser
lsof listet die geöffneten Dateien auf, und unter Linux gelten auch Netzwerk-Sockets als Dateien:
sudo lsof -nP -i :80
sudo lsof -nP -i -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mariadbd 839 mysql 20u IPv4 9075 0t0 TCP *:3306 (LISTEN)
mariadbd 839 mysql 21u IPv6 9076 0t0 TCP *:3306 (LISTEN)
-n lässt die Adressen, -P die Ports als Zahlen stehen (ohne diese Option wird *:http angezeigt). Auf dem AlmaLinux-10-Cloud-Image war lsof nicht installiert (sudo dnf install lsof), auf Ubuntu 26.04 hingegen schon.
Der Befehl fuser (aus dem Paket psmisc, das auf beiden Systemen installiert war) gibt lediglich die PIDs aus:
sudo fuser -v 80/tcp
Der Befehl fuser -k 80/tcp beendet ebenfalls die Programme, die den Port belegen. Bei Diensten sollten Sie stattdessen den Dienst beenden (siehe unten), da systemd den beendeten Dienst je nach Konfiguration möglicherweise neu startet.
netstat: der alte Befehl
netstat ist Teil des net-tools-Pakets, das weder auf dem AlmaLinux-10- noch auf dem Ubuntu-26.04-Cloud-Image vorinstalliert war. Falls Sie daran gewöhnt sind, können Sie es installieren (sudo dnf install net-tools oder sudo apt install net-tools) und mit denselben Optionen verwenden:
sudo netstat -tulpn
Die Ausgabe ist ähnlich, wobei die IPv6-Adressen im Format :::80 ausgegeben werden. Ohne sudo steht in der Spalte PID/Program name lediglich -. In den neuen Skripten wird die Verwendung von ss empfohlen, da dieses Programm überall installiert ist.
Beenden des Dienstes, der den Port belegt
Der Befehl ss -tulpn zeigt den Namen und die PID des Programms an. Welcher systemd-Dienst es gestartet hat, erfahren Sie mit den Befehlen ps oder systemctl status:
ps -p 1217 -o pid,comm,unit
systemctl status 1217
Anschließend können Sie den Dienst beenden und den automatischen Start deaktivieren:
sudo systemctl disable --now nginx
Die Verwaltung der Dienste wird im Artikel zum Befehl systemctl ausführlich beschrieben.
Unter Ubuntu 26.04 erscheint neben dem sshd auch systemd (PID 1) auf Port 22: Dort wird SSH durch die Socket-Aktivierung (ssh.socket) gestartet, und der Port wird ebenfalls von systemd offen gehalten. Die SSH-Einstellungen, darunter das Verlegen des Ports, behandelt der Artikel zur sicheren Konfiguration des SSH-Servers.
Address already in use: belegter Port
Wenn ein Programm versucht, einen Port zu öffnen, der bereits von einem anderen Programm belegt ist, wird es nicht gestartet. Im Test startete nginx aus diesem Grund nicht, da ein anderes Programm auf Port 80 lauschte:
$ sudo journalctl -u nginx | grep bind
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Andere Programme formulieren dies in ihren eigenen Begriffen (in Python beispielsweise OSError: [Errno 98] Address already in use). Vorgehensweise:
- Überprüfen Sie, welcher Prozess den Port belegt:
sudo ss -tlnp 'sport = :80'odersudo lsof -nP -i :80. - Sollten Sie einen alten oder nicht mehr benötigten Dienst haben, deaktivieren Sie diesen bitte (
sudo systemctl disable --now apache2). Es kommt häufig vor, dass Apache und nginx gleichzeitig versuchen, auf Port 80 zu starten, oder dass ein Docker-Container den Port belegt. - Falls Sie beide benötigen, stellen Sie einen der beiden auf einen anderen Port um.
Lauscht, aber nicht erreichbar? Die Firewall
Das ss zeigt lediglich an, dass das Programm Verbindungen entgegennehmen würde. Ob es von außen tatsächlich erreichbar ist, entscheidet die Firewall. Im Test lauschte nginx unter der Adresse 0.0.0.0:80, antwortete jedoch von außen nicht, solange firewalld den http-Dienst nicht freigab; danach war es sofort erreichbar.
Überprüfung der Firewall-Regeln:
# AlmaLinux, Rocky Linux (firewalld)
sudo firewall-cmd --list-all
# Ubuntu, Debian (ufw)
sudo ufw status verbose
Auf dem Cloud-Image von AlmaLinux 10 war firewalld nicht installiert, auf Ubuntu 26.04 war ufw zwar installiert, aber deaktiviert (Status: inactive). Bitte überprüfen Sie stets die Grundeinstellungen Ihres Servers. Die Konfiguration der Firewall wird im Artikel Wie richte ich eine Firewall auf meinem VPS ein? erläutert.
Docker umgeht die Firewall
Docker öffnet die veröffentlichten Ports der Container (-p 8081:80) nach eigenen Regeln. Im Test war ein mit dem Schalter -p 8081:80 gestarteter Nginx-Container von außen erreichbar, obwohl die Zone public von firewalld nur SSH zuließ; gleichzeitig war der direkt auf dem Rechner laufende Nginx-Server auf Port 80 nicht erreichbar. In der Ausgabe von ss wird ein solcher Port vom Programm docker-proxy belegt.
Wenn Sie einen Container ausschließlich lokal (beispielsweise hinter einem Reverse-Proxy) erreichen möchten, binden Sie ihn an die lokale Adresse:
docker run -d -p 127.0.0.1:8082:80 nginx:alpine
Dann zeigt ss die Adresse 127.0.0.1:8082 an. Die Installation und die Grundlagen von Docker werden im Artikel zur Docker-Installation beschrieben.
Überprüfung von außen: nc und nmap
Bitte überprüfen Sie von einem anderen Rechner aus (beispielsweise von Ihrem eigenen Computer), ob der Port tatsächlich erreichbar ist. Ein Test, der von innerhalb des Servers durchgeführt wird, testet die Firewall nicht.
nc -zv 203.0.113.10 80
nc -zv -w 3 203.0.113.10 3306
Der Befehl nc unter Ubuntu (netcat-openbsd) gibt bei einer erfolgreichen Verbindung die Meldung Connection to ... 443 port [tcp/https] succeeded! aus, bei einem geschlossenen Port Connection refused und bei durch die Firewall abgewehrten Paketen nach -w 3 Sekunden den Fehler timed out. Unter AlmaLinux ist nc im Paket nmap-ncat enthalten und gibt die Meldungen Ncat: Connected to ... oder Ncat: Connection refused. aus.
nmap überprüft mehrere Ports gleichzeitig:
nmap -Pn -p 22,80,443,3306 203.0.113.10
PORT STATE SERVICE
443/tcp open https
3306/tcp filtered mysql
open(offen): Der Port ist erreichbar, ein Programm nimmt die Verbindung entgegen;closed: Der Rechner antwortet, aber auf dem Port lauscht nichts;filtered: Es ging keine Antwort ein; die Pakete werden wahrscheinlich von der Firewall verworfen.
Bitte überprüfen Sie auf diese Weise nur Ihren eigenen Server: Das Port-Scannen fremder Rechner ohne Genehmigung kann als Missbrauch gewertet werden. Weitere Tools zur Netzwerkfehlerbehebung (ping, traceroute, curl) werden im Artikel zur Netzwerkfehlerbehebung vorgestellt.
Zusammenfassung
| Aufgabe | Befehl |
|---|---|
| Lauschende Ports mit Programmen | sudo ss -tulpn |
| Lauschende Ports ohne sudo | ss -tuln |
| Überprüfung eines Ports | sudo ss -tlnp 'sport = :80' |
| Wer belegt den Port? | sudo lsof -nP -i :80 |
| Live-Verbindungen | sudo ss -tnp state established |
| Alte Form | sudo netstat -tulpn (net-tools) |
| Um welchen Dienst handelt es sich? | systemctl status PID |
| Firewall-Regeln | sudo firewall-cmd --list-all oder sudo ufw status verbose |
| Ist der Zugang von außen möglich? | nc -zv IP PORT oder nmap -Pn -p PORT IP (von einem anderen Rechner aus) |
