ss und netstat zeigen Netzwerkverbindungen, offene Ports und Statistiken eines Systems. ss ist der moderne Nachfolger von netstat und deutlich schneller, weil es den Kernel direkt abfragt statt /proc zu durchsuchen. Dieser Artikel zeigt beide und die typischen Fragestellungen.

Grundaufruf

# Alle TCP-Verbindungen mit Prozessangabe
sudo ss -tlnp                # lauschend (listening)
sudo ss -tunap               # alle, TCP und UDP

# Optionen im Detail
#   -t  TCP          -u  UDP          -x  Unix-Sockets
#   -l  nur lauschende Sockets
#   -a  alle (lauschend und verbunden)
#   -n  keine Namensauflösung (schnell und eindeutig!)
#   -p  Prozess anzeigen (braucht erhoehte Rechte)
#   -s  Statistik
#   -4  nur IPv4     -6  nur IPv6

sudo ss -tlnp
# Ausgabe
# State  Recv-Q Send-Q Local Address:Port  Peer Address:Port  Process
# LISTEN 0      511    0.0.0.0:80           0.0.0.0:*          users:(("nginx",pid=812,fd=6))
# LISTEN 0      128    0.0.0.0:22           0.0.0.0:*          users:(("sshd",pid=640,fd=3))
# LISTEN 0      100    127.0.0.1:5432       0.0.0.0:*          users:(("postgres",pid=1103))

Die Spalte Local Address verdient besondere Aufmerksamkeit: 0.0.0.0:80 heißt „lauscht auf allen Adressen“ – der Dienst ist von außen erreichbar. 127.0.0.1:5432 heißt „nur lokal erreichbar“ – das ist der richtige Zustand für eine Datenbank, die nur von der eigenen Anwendung genutzt wird.

Die wichtigsten Fragestellungen

# 1. Welche Ports sind von aussen offen? (die wichtigste Frage)
sudo ss -tlnp | grep -v '127.0.0.1\|::1'

# 2. Wer belegt einen bestimmten Port?
sudo ss -tlnp 'sport = :8080'
sudo ss -tlnp | grep :8080
sudo lsof -i :8080

# 3. Bestehende Verbindungen zu einem Dienst
sudo ss -tnp dst :443
sudo ss -tnp 'dport = :443'

# 4. Verbindungen einer bestimmten Adresse (wer klopft an?)
sudo ss -tn 'src 203.0.113.50'
sudo ss -tn state established | head -30

# 5. Zustandsverteilung - zeigt Probleme auf einen Blick
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn
#   Sinnvolle Verteilung: viele ESTAB, wenige TIME-WAIT
#   Hunderte SYN-RECV  -> eingehende Verbindungen werden nicht beantwortet
#   Sehr viel TIME-WAIT -> viele kurzlebige Verbindungen

# 6. Anzahl gleichzeitiger Verbindungen je Adresse
ss -tn state established | awk 'NR>1 {print $5}' | \
  sed 's/:[0-9]*$//' | sort | uniq -c | sort -rn | head -10

# 7. Statistiken
ss -s
#   Total: 412   TCP: 89 (estab 42, closed 21, orphaned 0, timewait 20)

# 8. Unix-Sockets (Container, Datenbanken, Anwendungen)
sudo ss -xlnp

Zustände verstehen

Die Zustandsspalte erklärt, was mit einer Verbindung gerade passiert:

  • LISTEN: Der Dienst wartet auf eingehende Verbindungen. Das ist der Sollzustand für Server.
  • ESTAB: Eine offene, laufende Verbindung.
  • SYN-SENT: Der eigene Rechner hat einen Verbindungsaufbau begonnen und wartet auf Antwort. Bleibt dieser Zustand, antwortet die Gegenseite nicht.
  • SYN-RECV: Eine Anfrage ist eingegangen, die Gegenstelle hat den dritten Schritt des Handschlags nicht abgeschlossen. Viele solcher Einträge sind ein Zeichen für einen SYN-Flood oder eine unterbrochene Verbindung.
  • TIME-WAIT: Die Verbindung wurde ordentlich beendet; der Eintrag bleibt kurze Zeit bestehen, damit verspätete Pakete nicht als neue Verbindung interpretiert werden. Normal und begrenzt.
  • CLOSE-WAIT: Die Gegenseite hat beendet, die Anwendung hat nicht geschlossen. Sehr viele CLOSE-WAIT sind ein Programmierfehler – die Anwendung gibt Sockets nicht frei.
  • FIN-WAIT-1/2: Das Beenden läuft. Dauerhaft FIN-WAIT-2 deutet auf ein Problem bei der Gegenseite hin.

Grenzen erkennen

# Kernel-Grenzen pruefen
sysctl net.core.somaxconn                       # max. wartende Verbindungen
sysctl net.ipv4.ip_local_port_range             # Bereich ausgehender Ports
sysctl net.ipv4.tcp_max_syn_backlog
sysctl net.ipv4.tcp_fin_timeout
ss -s

# Warteschlange eines Lausch-Sockets (zweite Spalte Recv-Q bei -l)
ss -tln
#   Recv-Q bei LISTEN = Anzahl wartender Verbindungen
#   Steigt der Wert dauerhaft, ist die Anwendung zu langsam beim Annehmen
#   -> somaxconn und Anwendungs-Backlog erhoehen

# Ist der Port bereits vergeben? (haeufiger Startfehler)
ss -tlnp | grep :8080
#   Bei "Address already in use" hier nachsehen, wer den Port haelt.

netstat: das klassische Werkzeug

netstat liefert dieselben Informationen, braucht aber länger und ist in vielen modernen Distributionen nicht mehr vorinstalliert. Die Entsprechungen:

netstat -tlnp          # entspricht ss -tlnp
netstat -tunap         # alle TCP/UDP mit Prozess
netstat -rn            # Routing-Tabelle (heute: ip route show)
netstat -i             # Schnittstellenstatistik (heute: ip -s link)
netstat -s             # Protokollstatistiken

In Skripten und auf älteren Systemen begegnet man netstat weiterhin. Für neue Automatisierung ist ss die richtige Wahl – die Ausgabe ist stabiler und die Zuordnung von Prozessen funktioniert zuverlässiger.

Praktische Anwendungsfälle

  • Nach einem Neustart prüfen, ob Dienste lauschen: ss -tlnp zeigt sofort, was läuft und auf welcher Adresse.
  • Sicherheitsprüfung: Regelmäßig nachsehen, welche Ports von außen erreichbar sind. Ein Dienst, der versehentlich auf 0.0.0.0 lauscht statt auf 127.0.0.1, ist ein häufiger und ernster Fehler.
  • Verbindungsanzahl eines Dienstes beobachten: Für Monitoring und Kapazitätsplanung liefert ss -tan state established | wc -l eine Zahl für die Zeitreihe.
  • Verdächtige Verbindungen finden: Nach außen offene Verbindungen zu unbekannten Adressen sind ein Warnsignal. ss -tnp state established zeigt sie mit Prozessangabe.

Verwandte Grundlagen: tcpdump, TCP, iperf und mtr, Firewall.