ss-Befehl: Ports und Prozesse unter Linux prüfen, Vergleich mit netstat
Welche Ports auf einem Linux-Server offen sind und wer verbunden ist, prüfst du mit dem ss-Befehl. ss ist das Socket-Abfragewerkzeug von iproute2, das netstat ablöst. Bei der Abfrage lauschender (LISTEN) Ports und Verbindungen mit ss auf einem Debian-12-Server zeigte sich: Mit einem normalen Konto erscheinen die Namen von Programmen, die andere Konten gestartet haben, auch mit -p nicht in der Spalte Process.
Die Ausgaben unten stammen aus einem Lauf mit englischer locale. Die Adressen des Servers und der Gegenstellen sind als Beispieladressen angegeben.
1️⃣ Grundlegende Verwendung des ss-Befehls und Spalten der Ausgabe
Wenn du ss ohne Optionen ausführst, fehlen die lauschenden Ports, und es erscheinen nur Sockets mit aufgebauter Verbindung. Auf dem Testserver waren die ersten Zeilen alle Unix-Sockets (u_str, u_dgr), über die Programme innerhalb des Servers miteinander sprechen.
ss | head -n 5Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str ESTAB 0 0 * 1013903 * 1013904
u_dgr ESTAB 0 0 * 1013960 * 13394
u_str ESTAB 0 0 * 1013907 * 1013908
u_str ESTAB 0 0 * 46066198 * 46066199Um nur TCP-Verbindungen zu sehen, hängst du deshalb -t an. Die Unix-Sockets fallen weg, und an der Stelle des Ports stehen statt Nummern Dienstnamen wie ssh und https.
ss -tState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:ssh 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:https
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:httpsMit zusätzlichem -n bleiben die Portnummern stehen und werden nicht in Dienstnamen umgewandelt.
ss -tnState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:22 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Recv-Q und Send-Q bedeuten je nach Socket-Status etwas anderes. Bei einem verbundenen Socket ist Recv-Q die Zahl der empfangenen Bytes, die das Programm noch nicht gelesen hat, und Send-Q die Zahl der gesendeten Bytes, deren Empfang die Gegenstelle noch nicht bestätigt hat.
Bei einem lauschenden Socket ist Recv-Q die Zahl der Verbindungen in der Warteschlange und Send-Q die maximale Größe der Warteschlange. Diese Bedeutungen stammen aus der man-Seite netstat(8) von net-tools.
2️⃣ Ports unter Linux prüfen (-tln, -uln, -tulpn)
Die Ausgabe ohne Optionen zeigt keine Ports, die auf Verbindungen warten. Um offene Ports zu prüfen, hängst du daher -l an, das nur lauschende Sockets auswählt. [ss -tln] gibt die lauschenden TCP-Ports als Nummern aus.
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Steht bei Local Address 0.0.0.0, nimmt der Socket Verbindungen an allen IPv4-Adressen des Servers an; bei 127.0.0.1 ist er nur von innerhalb des Servers erreichbar. [::] steht für alle IPv6-Adressen, die Ports 22, 80 und 443 sind also sowohl über IPv4 als auch über IPv6 offen.
Ohne -n werden die Portnummern zu Dienstnamen. Port 8080 erscheint als http-alt.
ss -tlState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
LISTEN 0 511 0.0.0.0:http 0.0.0.0:*
LISTEN 0 511 0.0.0.0:https 0.0.0.0:*
LISTEN 0 511 127.0.0.1:http-alt 0.0.0.0:*
LISTEN 0 128 [::]:ssh [::]:*
LISTEN 0 511 [::]:http [::]:*
LISTEN 0 511 [::]:https [::]:*UDP baut keine Verbindungen auf, daher haben auch lauschende Sockets keinen LISTEN-Status. In der Statusspalte der Ausgabe von [ss -uln] stand überall UNCONN. Port 68 (bootpc) ist der DHCP-Client, Port 123 (ntp) der Port für die Zeitsynchronisation.
ss -ulnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
UNCONN 0 0 [::1]:123 [::]:*
UNCONN 0 0 [::]:123 [::]:*Um TCP und UDP auf einmal zu sehen, fasst du die Optionen zusammen, etwa als [ss -tulpn]. Sobald mehr als eine Art angezeigt wird, kommt vorne die Spalte Netid hinzu.
ss -tulpnNetid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
udp UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
udp UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
udp UNCONN 0 0 [::1]:123 [::]:*
udp UNCONN 0 0 [::]:123 [::]:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
tcp LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
tcp LISTEN 0 511 [::]:80 [::]:*
tcp LISTEN 0 511 [::]:443 [::]:*3️⃣ Prozesse mit dem ss-Befehl prüfen (-p)
-p ist die Option, die das Programm, das einen Socket nutzt, in der Spalte Process ausgibt. Als [ss -tlnp] jedoch mit einem normalen Konto auf dem Testserver lief, blieb die Spalte Process wie unten leer, als hätte die Option nicht gewirkt.
ss -tlnpState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*ss findet den Prozess hinter einem Socket, indem es für jeden Prozess den Ordner fd unter /proc liest. Den fd-Ordner eines Prozesses, den ein anderes Konto gestartet hat, kann ein normales Konto nicht öffnen, deshalb landet der Name dieses Programms nicht in der Spalte. Öffnest du mit einem normalen Konto den Ordner von Prozess 1, den root gestartet hat, kommt ein Berechtigungsfehler.
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedProgramme, die du mit deinem eigenen Konto gestartet hast, erscheinen auch bei einem normalen Konto in der Spalte Process. Geprüft wurde das mit dem einfachen Webserver von python3 auf Port 8000 von 127.0.0.1.
python3 -m http.server 8000 --bind 127.0.0.1 &Nach dem Start hängst du [sport = :8000] an und lässt dir nur die Zeile für Port 8000 anzeigen.
ss -tlnp sport = :8000State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 127.0.0.1:8000 0.0.0.0:* users:(("python3",pid=343015,fd=3))In der Klammer nach users stehen nacheinander der Programmname, die pid und die Nummer des Dateideskriptors (fd).
Wenn die Prüfung fertig ist, beendest du den einfachen Webserver mit [kill %1]. Führst du danach [ss -tln sport = :8000] noch einmal aus, bleibt nur die Kopfzeile, und die Zeile für Port 8000 erscheint nicht mehr.
Mit dem root-Konto kann ss die Informationen aller Prozesse lesen, daher ist die Spalte Process gefüllt. Lauschen mehrere Prozesse gemeinsam auf einem Port, folgen in der Klammer von users entsprechend viele Einträge. Die Programmnamen und pids in der root-Ausgabe unten sind Beispielwerte.
ss -tlnp sport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("app",pid=2101,fd=6),("app",pid=2100,fd=6))
LISTEN 0 511 [::]:443 [::]:* users:(("app",pid=2101,fd=7),("app",pid=2100,fd=7))Um ein Programm über die Portnummer zu finden, kannst du auch den lsof-Befehl in der Form [lsof -i :443] verwenden.
Wie sich die Spalte Process je nach Konto ändert, kannst du im Diagramm unten vergleichen, indem du das Konto wechselst.
4️⃣ ss-Filteroptionen für Status und Port
Auch nachdem du die offenen Ports geprüft hast, musst du gesondert herausfiltern, wer gerade mit diesen Ports verbunden ist. ss behält nur die gewünschten Zeilen, wenn du nach den Optionen Filterbedingungen anhängst.
Schreibst du nach state einen Statusnamen, bleiben nur die Sockets in diesem Status übrig. Die Ausgabe von [ss -tn state established] hat keine Spalte State und beginnt mit der Spalte Recv-Q.
ss -tn state establishedRecv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114
0 0 203.0.113.10:26676 192.0.2.15:443
0 0 203.0.113.10:29714 192.0.2.16:443Ports filterst du mit dport (Port der Gegenstelle) und sport (eigener Port). Verbindungen, die vom Server zu externen https-Servern gehen, wählst du mit [dport = :443] aus.
ss -tn dport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Zusammen mit -l prüft sport nur, ob dieser Port lauscht.
ss -tln sport = :22State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*Mehrere Bedingungen fasst du mit Klammern und or zusammen und setzt sie in einfache Anführungszeichen, damit die Shell die Klammern nicht vorher auswertet. Unten siehst du das Ergebnis, bei dem nach dem Beispiel der man-Seite nur ssh-Verbindungen ausgewählt wurden.
ss -tn state established '( dport = :ssh or sport = :ssh )'Recv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114TIME-WAIT ist der Status, in dem eine Verbindung nach dem Trennen noch kurz bleibt. In der Standardausgabe erscheint er nicht, du siehst ihn nur, wenn du ihn mit [state time-wait] gesondert auswählst.
ss -tn state time-waitRecv-Q Send-Q Local Address:Port Peer Address:PortProcess
0 0 127.0.0.1:28750 127.0.0.1:80
0 0 127.0.0.1:57698 127.0.0.1:8080
0 0 [::1]:31936 [::1]:80Vertippst du dich beim Statusnamen, endet der Befehl sofort mit einer einzigen Fehlerzeile [wrong state name]. Unten siehst du das Ergebnis mit absichtlich eingegebenem foo. Die möglichen Namen findest du in der Zeile TCP-STATES der Ausgabe von [ss -h].
ss -tn state fooss: wrong state name: foo📌 Wichtige Optionen: Ergebnisse aus diesem Artikel
| Option | Was es tut | Ergebnis in diesem Artikel | |
|---|---|---|---|
| -t | Zeigt nur TCP-Sockets | Unix-Sockets fallen weg, an der Stelle des Ports stehen Dienstnamen wie ssh und https | |
| -n | Zeigt Portnummern statt Dienstnamen | In ss -tn erscheint ssh als 22 und https als 443 | |
| -l | Zeigt nur lauschende (LISTEN) Sockets | ss -tln zeigt lauschende Ports wie 22, 80 und 443 | |
| -u | Zeigt nur UDP-Sockets | In der Statusspalte von ss -uln steht überall UNCONN | |
| -p | Zeigt das Programm hinter jedem Socket in der Spalte Process | Mit einem normalen Konto zeigt nur das von meinem Konto gestartete python3 Name und pid, Programme anderer Konten bleiben leer | |
| -s | Fasst die Anzahl nach Art zusammen, statt Sockets aufzulisten | estab 9 in der TCP-Zeile entspricht den 9 Zeilen der Ausgabe von state established ohne Kopfzeile | |
| -4 | Zeigt nur IPv4-Sockets | In ss -t4ln fallen die Zeilen weg, die mit [::] beginnen | |
| -6 | Zeigt nur IPv6-Sockets | In ss -t6ln fallen die Zeilen weg, die mit 0.0.0.0 und 127.0.0.1 beginnen | |
| -H | Zeigt nur Socket-Zeilen ohne Kopfzeile | Die Zeilenzahl von ss -H -tln | wc -l enthält die Kopfzeile nicht | |
| state STATUS | Behält nur Sockets in diesem Status | Die Ausgabe von state established beginnt ohne Spalte State mit Recv-Q, ein unbekannter Name ergibt [wrong state name: foo] | |
| dport = :PORT | Filtert nach dem Port der Gegenstelle | dport = :443 zeigt zwei Zeilen mit Verbindungen zu externen https-Servern | |
| sport = :PORT | Filtert nach dem eigenen Port | sport = :22 zusammen mit -l zeigt zwei lauschende Zeilen für Port 22, IPv4 und IPv6 | |
| src ADRESSE | Behält nur Sockets dieser Adresse | ss -tln src 127.0.0.1 zeigt nur die Ports auf 127.0.0.1, die Verbindungen nur von innerhalb des Servers annehmen |
📎 Weitere Optionen: laut offiziellem Handbuch
| Option | Was es tut | |
|---|---|---|
| -a, --all | Zeigt lauschende und verbundene Sockets zusammen | |
| -r, --resolve | Löst Adressen und Portnummern in Namen auf | |
| -e, --extended | Zeigt für jeden Socket ausführliche Angaben wie uid und inode | |
| -o, --options | Zeigt Timer-Informationen wie TCP-Neuübertragung und keepalive | |
| -m, --memory | Zeigt den Speicher, den jeder Socket belegt | |
| -i, --info | Zeigt interne TCP-Informationen (rtt, cwnd usw.) | |
| -x, --unix | Zeigt nur Unix-Domain-Sockets | |
| -w, --raw | Zeigt nur RAW-Sockets | |
| -f FAMILIE | Wählt nach Socket-Familie aus, etwa unix, inet, inet6, link oder netlink | |
| -Q, --no-queues | Gibt ohne die Spalten Recv-Q und Send-Q aus | |
| -K, --kill | Schließt passende Sockets zwangsweise, Sockets ohne Kernel-Unterstützung werden übersprungen | |
| -E, --events | Zeigt laufend Sockets, die geschlossen werden | |
| -V, --version | Gibt Versionsinformationen aus |
🔲 ss-Befehl-Simulator
Im Simulator unten kannst du die bisher gezeigten Optionen und Filter selbst eingeben und die Ausgabe mit [netstat -tln] vergleichen.
5️⃣ ss-Socket-Übersicht (-s)
-s gibt statt der Socket-Liste eine Übersicht der Anzahl nach Art aus. Laut man-Seite zählt es die Liste nicht einzeln ab, sondern sammelt die Zahlen aus verschiedenen Statistiken.
ss -sTotal: 340
TCP: 48 (estab 9, closed 15, orphaned 0, timewait 13)
Transport Total IP IPv6
RAW 0 0 0
UDP 8 4 4
TCP 33 25 8
INET 41 29 12
FRAG 0 0 0estab in der TCP-Zeile ist die Zahl der gerade aufgebauten Verbindungen. Deshalb kannst du sie mit der Zeilenzahl vergleichen, die [state established] zum selben Zeitpunkt ausgibt.
ss -tn state established | wc -l10Zieht man von den 10 Ausgabezeilen die eine Kopfzeile ab, bleiben 9, genau wie estab 9 bei -s. timewait 13 ist die Zahl der TIME-WAIT-Sockets, die nur mit [state time-wait] sichtbar wurden.
6️⃣ ss-Befehl im Vergleich mit netstat
netstat steckt im Paket net-tools, dessen man-Seite netstat als kaum noch genutztes Programm (mostly obsolete) bezeichnet und stattdessen ss empfiehlt. Skripte, die auf das Ausgabeformat von netstat zugeschnitten sind, können die Ausgabe von ss allerdings nicht unverändert lesen, weil sich Spaltenreihenfolge und Adressschreibweise unterscheiden.
Als die lauschenden TCP-Ports desselben Servers mit beiden Befehlen ausgegeben wurden, stand bei netstat der Status ganz am Ende, und IPv6-Adressen wurden als :::22 geschrieben.
netstat -tlnActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::443 :::* LISTENBei ss steht der Status ganz vorne, und IPv6-Adressen werden in eckige Klammern gesetzt, etwa [::]:22.
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Häufig genutzte netstat-Optionen entsprechen den folgenden ss- und ip-Befehlen.
| netstat | Ersatzbefehl / was er zeigt |
|---|---|
| netstat -tln | ss -tlnLauschende TCP-Ports als Nummern |
| netstat -tulpn | ss -tulpnLauschende TCP- und UDP-Ports mit Programmen |
| netstat -tan | ss -tanAlle TCP-Sockets als Nummern |
| netstat -r | ip routeRoutingtabelle |
| netstat -i | ip -s linkStatistik der Netzwerkschnittstellen |
🔢 FAQ & empfohlene Inhalte











ℹ️ Affiliate-Hinweis
Die Inhalte dieser Website enthalten Affiliate-Links. Kauft ein Besucher über einen dieser Links ein Produkt oder eine Dienstleistung, erhält die Website vom Verkäufer eine Provision. Der Betrag, den der Käufer zahlt(bei Aktionsrabatten sinkt er ↓), steigt dadurch nicht. Angegebene Preise, Rabatte und Lagerbestände entsprechen dem Stand bei Erstellung und können abweichen; prüfe sie daher vor dem Kauf beim Verkäufer. Produkte werden nach eigenen Kriterien ausgewählt und bewertet, und Provisionen beeinflussen weder die Reihenfolge noch den Inhalt der Bewertungen.