ss-Befehl: Ports und Prozesse unter Linux prüfen, Vergleich mit netstat

TestumgebungDebian-FamilieDebian 12iproute2 6.1.0normales BenutzerkontoGeprüft am 2026-11-04
NetzwerkbefehlessSpeicherort/usr/bin/ss

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 5
Netid 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              * 46066199

Um 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 -t
State 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:https

Mit zusätzlichem -n bleiben die Portnummern stehen und werden nicht in Dienstnamen umgewandelt.

ss -tn
State 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:443

Recv-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 -tln
State  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 -tl
State  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 -uln
State  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 -tulpn
Netid 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 -tlnp
State  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/fd
ls: cannot open directory '/proc/1/fd': Permission denied

Programme, 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 = :8000
State  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 = :443
State  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.

🧭 ss -p und Konten: wann sich die Spalte Process füllt
Erklär-Diagramm
👤 Konto
$# ss -tlnp
Lauschender SocketProzessinformationenSpalte Process
0.0.0.0:22LISTEN
➜
/proc/812/fdBesitzer: root
➜
Prozesse anderer Konten: nicht lesbarroot: liest alle ProzesseSpalte Process leerusers:(("sshd",pid=812,fd=3))
127.0.0.1:8080LISTEN
➜
/proc/2100/fdBesitzer: root
➜
Prozesse anderer Konten: nicht lesbarroot: liest alle ProzesseSpalte Process leerusers:(("app",pid=2100,fd=3))
127.0.0.1:8000LISTEN
➜
/proc/343015/fdBesitzer: user
➜
Prozesse meines Kontos: lesbarroot: liest alle Prozesseusers:(("python3",pid=343015,fd=3))
Ein normales Konto kann die /proc-Informationen von Prozessen anderer Konten nicht lesen, daher bleibt die Spalte Process in diesen Zeilen leer, und nur die python3-Zeile, die du mit deinem eigenen Konto gestartet hast, ist gefüllt.
root kann die Informationen aller Prozesse lesen, daher stehen für jeden lauschenden Socket Programmname und pid in der Spalte Process.

4️⃣ ss-Filteroptionen für Status und Port

  • ↪️ state, dport, sport

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 established
Recv-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:443

Ports 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 = :443
State 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:443

Zusammen mit -l prüft sport nur, ob dieser Port lauscht.

ss -tln sport = :22
State  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:51114

TIME-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-wait
Recv-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]:80

Vertippst 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 foo
ss: wrong state name: foo

📌 Wichtige Optionen: Ergebnisse aus diesem Artikel

OptionWas es tutErgebnis in diesem Artikel
-tZeigt nur TCP-SocketsUnix-Sockets fallen weg, an der Stelle des Ports stehen Dienstnamen wie ssh und https
-nZeigt Portnummern statt DienstnamenIn ss -tn erscheint ssh als 22 und https als 443
-lZeigt nur lauschende (LISTEN) Socketsss -tln zeigt lauschende Ports wie 22, 80 und 443
-uZeigt nur UDP-SocketsIn der Statusspalte von ss -uln steht überall UNCONN
-pZeigt das Programm hinter jedem Socket in der Spalte ProcessMit einem normalen Konto zeigt nur das von meinem Konto gestartete python3 Name und pid, Programme anderer Konten bleiben leer
-sFasst die Anzahl nach Art zusammen, statt Sockets aufzulistenestab 9 in der TCP-Zeile entspricht den 9 Zeilen der Ausgabe von state established ohne Kopfzeile
-4Zeigt nur IPv4-SocketsIn ss -t4ln fallen die Zeilen weg, die mit [::] beginnen
-6Zeigt nur IPv6-SocketsIn ss -t6ln fallen die Zeilen weg, die mit 0.0.0.0 und 127.0.0.1 beginnen
-HZeigt nur Socket-Zeilen ohne KopfzeileDie Zeilenzahl von ss -H -tln | wc -l enthält die Kopfzeile nicht
state STATUSBehält nur Sockets in diesem StatusDie Ausgabe von state established beginnt ohne Spalte State mit Recv-Q, ein unbekannter Name ergibt [wrong state name: foo]
dport = :PORTFiltert nach dem Port der Gegenstelledport = :443 zeigt zwei Zeilen mit Verbindungen zu externen https-Servern
sport = :PORTFiltert nach dem eigenen Portsport = :22 zusammen mit -l zeigt zwei lauschende Zeilen für Port 22, IPv4 und IPv6
src ADRESSEBehält nur Sockets dieser Adressess -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

OptionWas es tut
-a, --allZeigt lauschende und verbundene Sockets zusammen
-r, --resolveLöst Adressen und Portnummern in Namen auf
-e, --extendedZeigt für jeden Socket ausführliche Angaben wie uid und inode
-o, --optionsZeigt Timer-Informationen wie TCP-Neuübertragung und keepalive
-m, --memoryZeigt den Speicher, den jeder Socket belegt
-i, --infoZeigt interne TCP-Informationen (rtt, cwnd usw.)
-x, --unixZeigt nur Unix-Domain-Sockets
-w, --rawZeigt nur RAW-Sockets
-f FAMILIEWählt nach Socket-Familie aus, etwa unix, inet, inet6, link oder netlink
-Q, --no-queuesGibt ohne die Spalten Recv-Q und Send-Q aus
-K, --killSchließt passende Sockets zwangsweise, Sockets ohne Kernel-Unterstützung werden übersprungen
-E, --eventsZeigt laufend Sockets, die geschlossen werden
-V, --versionGibt 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.

ss-Befehl-Simulatoriproute2 6.1.0
[root@server work]#
Dies ist ein Bildschirm mit normalem Konto (user), der nur im Browser läuft; mit ↑↓ holst du früher eingegebene Befehle zurück.

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 -s
Total: 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         0

estab 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 -l
10

Zieht 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 -tln
Active 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                  :::*                    LISTEN

Bei ss steht der Status ganz vorne, und IPv6-Adressen werden in eckige Klammern gesetzt, etwa [::]:22.

ss -tln
State  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.

netstatErsatzbefehl / was er zeigt
netstat -tlnss -tlnLauschende TCP-Ports als Nummern
netstat -tulpnss -tulpnLauschende TCP- und UDP-Ports mit Programmen
netstat -tanss -tanAlle TCP-Sockets als Nummern
netstat -rip routeRoutingtabelle
netstat -iip -s linkStatistik der Netzwerkschnittstellen
Die ip-Befehle, die netstat -r und netstat -i ersetzen, stehen im Abschnitt NOTES der man-Seite netstat(8) von net-tools.

🔢 FAQ & empfohlene Inhalte

Mit -4 bleiben nur IPv4-Sockets übrig, mit -6 nur IPv6-Sockets. Bei [ss -t4ln] fielen die Zeilen weg, die mit [::] beginnen, bei [ss -t6ln] die Zeilen, die mit 0.0.0.0 und 127.0.0.1 beginnen.

Schreibst du nach src eine Adresse, bleiben nur die lauschenden Sockets dieser Adresse übrig. [ss -tln src 127.0.0.1] zeigte nur die Ports auf 127.0.0.1, die von außerhalb des Servers nicht erreichbar sind.

Mit -H erscheinen nur die Socket-Zeilen ohne Kopfzeile. Wenn du Zeilen zählst, etwa mit [ss -H -tln | wc -l], wird die Kopfzeile nicht mitgezählt.

🧭 Empfohlene Artikel zu Netzwerkbefehlen 13 Artikel · 3 Quellen
🗂️ Netzwerkbefehle
📄 ip-Befehl 📄 netstat- und ifconfig-Befehle 📄 nmtui-Befehl 📄 ss-Befehl
📄 SSH-Befehl 📄 rsync-Befehl 📄 wget-Befehl 📄 rz- und sz-Befehle
📄 host-Befehl 📄 nslookup-Befehl
📄 iptables-Befehl 📄 firewall-cmd-Befehl 📄 certbot-Befehl

ℹ️ 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Beweisen Sie, dass Sie ein Mensch sind: 3   +   7   =