So verwenden Sie den ss-Befehl unter Linux

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.