Das Kommando `ss` dient als moderne Alternative zum traditionellen `netstat`. Unter Linux ermöglicht es die detaillierte Analyse von Netzwerkverbindungsstatistiken. Hier erfahren Sie, wie Sie dieses praktische Werkzeug effizient nutzen können.
Der `ss`-Befehl im Vergleich zu `netstat`
Als Ersatz für den etwas in die Jahre gekommenen `netstat`-Befehl, liefert `ss` präzise Informationen darüber, wie Ihr Computer mit anderen Rechnern, Netzwerken und Diensten kommuniziert.
`ss` präsentiert Statistiken für Transmission Control Protocol (TCP), User Datagram Protocol (UDP), Unix-Sockets (Interprozesskommunikation) und Raw-Sockets. Raw-Sockets operieren auf der Netzwerk-OSI-Ebene, was bedeutet, dass TCP- und UDP-Header von der Anwendungssoftware und nicht von der Transportschicht verarbeitet werden müssen. Internet Control Message Protocol (ICMP)-Nachrichten und das `ping`-Tool nutzen beide Raw-Sockets.
Grundlegende Nutzung von `ss`
Die Installation von `ss` ist nicht erforderlich, da es bereits in aktuellen Linux-Distributionen enthalten ist. Die Ausgabe kann jedoch sehr umfangreich sein, manchmal sogar über 630 Zeilen. Zudem sind die Informationen sehr breit gefächert.
Daher präsentieren wir die Ergebnisse in Textform, da sie nicht in einen Screenshot passen würden. Wir haben diese Ausgaben zudem gekürzt, um sie übersichtlicher zu gestalten.
Anzeigen von Netzwerkverbindungen
Ohne zusätzliche Befehlszeilenoptionen listet `ss` Sockets auf, die nicht in den „Listening“-Zustand versetzt wurden, also solche, die nicht auf eingehende Verbindungsanfragen warten.
Geben Sie Folgendes ein, um die nicht-lauschenden Sockets anzuzeigen:
ss
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process u_str ESTAB 0 0 * 41826 * 41827 u_str ESTAB 0 0 /run/systemd/journal/stdout 35689 * 35688 u_str ESTAB 0 0 * 35550 * 35551 ... u_str ESTAB 0 0 * 38127 * 38128 u_str ESTAB 0 0 /run/dbus/system_bus_socket 21243 * 21242 u_str ESTAB 0 0 * 19039 * 19040 u_str ESTAB 0 0 /run/systemd/journal/stdout 18887 * 18885 u_str ESTAB 0 0 /run/dbus/system_bus_socket 19273 * 17306 icmp6 UNCONN 0 0 *:ipv6-icmp *:* udp ESTAB 0 0 192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps
Die Spalten haben folgende Bedeutung:
Netid: Der Typ des Sockets. Im Beispiel sehen wir „u_str“ für Unix-Streams, „udp“ und „icmp6“ für einen ICMP-Socket der IP-Version 6. Detaillierte Beschreibungen der Linux-Socket-Typen finden Sie in den Linux-Manpages.
State: Der aktuelle Zustand des Sockets.
Recv-Q: Die Anzahl der empfangenen Pakete.
Send-Q: Die Anzahl der gesendeten Pakete.
Lokale Adresse:Port: Die lokale Adresse und der Port (oder ähnliche Werte für Unix-Sockets).
Peer-Adresse:Port: Die Remote-Adresse und der Port (oder entsprechende Werte für Unix-Sockets).
Bei UDP-Sockets ist die Spalte „State“ in der Regel leer. Für TCP-Sockets kann sie folgende Zustände annehmen:
LISTEN: Nur serverseitig. Der Socket wartet auf eine Verbindungsanfrage.
SYN-SENT: Nur clientseitig. Der Socket hat eine Verbindungsanfrage gesendet und wartet auf Bestätigung.
SYN-RECEIVED: Nur serverseitig. Der Socket wartet nach einer akzeptierten Verbindungsanfrage auf eine Bestätigung.
ESTABLISHED: Sowohl Server als auch Clients. Eine funktionierende Verbindung ist hergestellt und Daten können übertragen werden.
FIN-WAIT-1: Sowohl Server als auch Clients. Der Socket erwartet eine Verbindungsbeendigungsanfrage oder die Bestätigung einer gesendeten Beendigungsanfrage.
FIN-WAIT-2: Sowohl Server als auch Clients. Der Socket wartet auf eine Verbindungsbeendigungsanfrage vom Remote-Socket.
CLOSE-WAIT: Sowohl Server als auch Clients. Der Socket wartet auf eine Anfrage zur Beendigung der Verbindung vom lokalen Benutzer.
CLOSING: Sowohl Server als auch Clients. Der Socket wartet auf eine Bestätigung der Beendigungsanfrage vom Remote-Socket.
LAST-ACK: Sowohl Server als auch Clients. Der Socket wartet auf die Bestätigung der gesendeten Beendigungsanfrage.
TIME-WAIT: Sowohl Server als auch Clients. Der Socket hat die Bestätigung erhalten und wartet nun, dass die Bestätigung auch wirklich angekommen ist.
CLOSED: Keine Verbindung besteht; der Socket ist geschlossen.
Anzeigen von Listening-Sockets
Um nur die Listening-Sockets anzuzeigen, verwenden wir die Option `-l` (listening):
ss -l
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process nl UNCONN 0 0 rtnl:NetworkManager/535 * nl UNCONN 0 0 rtnl:evolution-addre/2987 * ... u_str LISTEN 0 4096 /run/systemd/private 13349 * 0 u_seq LISTEN 0 4096 /run/udev/control 13376 * 0 u_str LISTEN 0 4096 /tmp/.X11-unix/X0 33071 * 0 u_dgr UNCONN 0 0 /run/systemd/journal/syslog 13360 * 0 u_str LISTEN 0 4096 /run/systemd/fsck.progress 13362 * 0 u_dgr UNCONN 0 0 /run/user/1000/systemd/notify 32303 * 0
Diese Sockets sind alle nicht verbunden und lauschen auf Verbindungen. `rtnl` steht für Routing Netlink, eine Methode zur Kommunikation zwischen Kernel- und Userspace-Prozessen.
Anzeigen aller Sockets
Mit der Option `-a` (all) können alle Sockets angezeigt werden:
ss -a
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process nl UNCONN 0 0 rtnl:NetworkManager/535 * nl UNCONN 0 0 rtnl:evolution-addre/2987 * ... u_str LISTEN 0 100 public/showq 23222 * 0 u_str LISTEN 0 100 private/error 23225 * 0 u_str LISTEN 0 100 private/retry 23228 * 0 ... udp UNCONN 0 0 0.0.0.0:631 0.0.0.0:* udp UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:* ... tcp LISTEN 0 128 [::]:ssh [::]:* tcp LISTEN 0 5 [::1]:ipp [::]:* tcp LISTEN 0 100 [::1]:smtp [::]:*
Die Ausgabe umfasst alle Sockets, unabhängig von ihrem Zustand.
Filtern nach TCP-Sockets
Sie können Filter anwenden, um nur relevante Sockets anzuzeigen. Mit der Option `-t` (TCP) werden nur TCP-Sockets angezeigt:
ss -a -t
Filtern nach UDP-Sockets
Die Option `-u` (UDP) führt die gleiche Filteraktion durch, diesmal für UDP-Sockets:
ss -a -u
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process UNCONN 0 0 0.0.0.0:631 0.0.0.0:* UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:* UNCONN 0 0 0.0.0.0:60734 0.0.0.0:* UNCONN 0 0 127.0.0.53%lo:domain 0.0.0.0:* ESTAB 0 0 192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps UNCONN 0 0 [::]:mdns [::]:* UNCONN 0 0 [::]:51193 [::]:*
Filtern nach Unix-Sockets
Um nur Unix-Sockets anzuzeigen, verwenden Sie die Option `-x` (Unix):
ss -a -x
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process u_str ESTAB 0 0 * 41826 * 41827 u_str ESTAB 0 0 * 23183 * 23184 u_str ESTAB 28 0 @/tmp/.X11-unix/X0 52640 * 52639 ... u_str ESTAB 0 0 /run/systemd/journal/stdout 18887 * 18885 u_str ESTAB 0 0 /run/dbus/system_bus_socket 19273 * 17306
Filtern nach Raw Sockets
Der Filter für Raw-Sockets ist die Option `-w` (raw):
ss -a -w
Anzeigen von IP-Version 4 Sockets
Sockets, die das TCP/IP-Protokoll der Version 4 verwenden, können mit der Option `-4` (IPV4) aufgelistet werden:
ss -a -4
Anzeigen von IP-Version 6 Sockets
Der entsprechende Filter für IP-Version 6 wird mit der Option `-6` (IPV6) aktiviert:
ss -a -6
Filtern von Sockets nach Status
Mit der Option `state` können Sockets nach ihrem Status gefiltert werden, z.B. nach `established`, `listening` oder `closed`. Die Option `-r` (resolve) versucht, Netzwerkadressen in Namen und Ports in Protokolle aufzulösen.
Der folgende Befehl sucht nach bestehenden TCP-Verbindungen und versucht, Namen aufzulösen:
ss -t -r state established
Es werden vier Verbindungen im etablierten Zustand aufgelistet. Der Hostname `ubuntu20-04` wurde aufgelöst und „ssh“ anstelle von Port 22 für die SSH-Verbindung in der zweiten Zeile angezeigt.
Um nach Sockets im Listening-Zustand zu suchen, verwenden wir:
ss -t -r state listening
Recv-Q Send-Q Local Address:Port Peer Address:Port Process 0 128 localhost:5939 0.0.0.0:* 0 4096 localhost%lo:domain 0.0.0.0:* 0 128 0.0.0.0:ssh 0.0.0.0:* 0 5 localhost:ipp 0.0.0.0:* 0 100 localhost:smtp 0.0.0.0:* 0 128 [::]:ssh [::]:* 0 5 ip6-localhost:ipp [::]:* 0 100 ip6-localhost:smtp [::]:*
Filtern nach Protokoll
Mit den Optionen `dport` (Zielport) und `sport` (Quellport) können Sockets nach einem bestimmten Protokoll gefiltert werden.
Der folgende Befehl listet Sockets auf, die das HTTPS-Protokoll für eine etablierte Verbindung nutzen (beachten Sie das Leerzeichen nach der öffnenden und vor der schließenden Klammer):
ss -a state established ‘( dport = :https or sport = :https )’
Es kann der Protokollname oder der dazugehörige Port verwendet werden. Der Standardport für Secure Shell (SSH) ist Port 22.
Hier wird der Protokollname im ersten Befehl und die Portnummer im zweiten Befehl verwendet:
ss -a ‘( dport = :ssh or sport = :ssh )’
ss -a ‘( dport = :22 or sport = :22 )’
Wie erwartet, erhalten wir die gleichen Ergebnisse.
Anzeigen von Verbindungen zu einer bestimmten IP-Adresse
Mit der Option `dst` (Ziel) können Verbindungen zu einer bestimmten Ziel-IP-Adresse aufgelistet werden.
Geben Sie Folgendes ein:
ss -a dst 192.168.4.25
Identifizieren von Prozessen
Um anzuzeigen, welche Prozesse Sockets verwenden, nutzen Sie die Option `-p` (process) (beachten Sie, dass Sie `sudo` verwenden müssen):
sudo ss -t -p
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.168.4.28:57650 54.218.19.119:https users:(("firefox",pid=3378,fd=151)) ESTAB 0 0 192.168.4.28:ssh 192.168.4.25:43946 users:(("sshd",pid=4086,fd=4),("sshd",pid=3985,fd=4))
Dies zeigt, dass die beiden etablierten TCP-Verbindungen vom SSH-Daemon und Firefox genutzt werden.
Ein würdiger Nachfolger
Der Befehl `ss` stellt die gleichen Informationen wie `netstat` zur Verfügung, allerdings auf eine einfachere und zugänglichere Weise. Auf der Manpage finden Sie weitere Optionen und Tipps.