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 -tlnpzeigt 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.0lauscht statt auf127.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 -leine Zahl für die Zeitreihe. - Verdächtige Verbindungen finden: Nach außen offene Verbindungen zu unbekannten Adressen sind ein Warnsignal.
ss -tnp state establishedzeigt sie mit Prozessangabe.
Verwandte Grundlagen: tcpdump, TCP, iperf und mtr, Firewall.