9.1 Ports, Sockets, Listener und gebundene Adressen
Ziel dieser Seite
Diese Seite beschreibt die systematische Diagnose von Ports, Sockets, Listenern und gebundenen IP-Adressen unter Windows, Linux, macOS sowie in Container- und Kubernetes-Umgebungen.
Nach der Bearbeitung muss nachvollziehbar geprüft werden können:
- welches Transportprotokoll verwendet wird;
- auf welchem Port ein Dienst lauschen soll;
- an welche lokale Adresse der Socket gebunden ist;
- welcher Prozess den Socket besitzt;
- ob der Socket im richtigen Netzwerk-Namespace existiert;
- ob ein lokaler Listener tatsächlich erreichbar ist;
- ob Firewall, NAT, Portweiterleitung oder Proxy beteiligt sind;
- ob ein Portkonflikt vorliegt;
- ob TCP- und UDP-Verhalten richtig unterschieden werden;
- ob die Anwendung auf Protokollebene korrekt antwortet.
Ein sichtbarer Listener beweist nur, dass im untersuchten Netzwerk-Namespace ein Socket gebunden wurde. Er beweist nicht, dass der Dienst von einem entfernten Client erreichbar ist oder auf Anwendungsebene korrekt funktioniert.
Sicherheits- und Wirkungsklassen
| Kennzeichnung | Bedeutung |
|---|---|
| LESEND | Erfasst ausschließlich vorhandene Zustände. |
| NETZAKTIV | Erzeugt Netzwerkverkehr zum geprüften Ziel. |
| SENSITIV | Kann interne Adressen, Prozesse, Verbindungen oder Nutzdaten sichtbar machen. |
| ÄNDERND | Verändert Konfiguration oder Laufzeitzustand. |
| AUSFALLRISIKO | Kann bestehende Verbindungen oder Dienste beeinträchtigen. |
Socket- und Prozesslisten können interne Dienstnamen, Benutzerkonten, Zieladressen und aktive Kommunikationsbeziehungen enthalten. Ausgaben und Netzwerkaufzeichnungen müssen entsprechend geschützt werden.
Grundbegriffe
| Begriff | Bedeutung |
|---|---|
| Port | Numerische Kennzeichnung eines Dienstendpunkts innerhalb eines Transportprotokolls. |
| Socket | Vom Betriebssystem verwalteter Kommunikationsendpunkt. |
| Listener | TCP-Socket, der auf neue eingehende Verbindungen wartet. |
| Bind | Zuordnung eines Sockets zu einer lokalen IP-Adresse und einem lokalen Port. |
| Local Address | Lokale IP-Adresse, an die der Socket gebunden ist. |
| Local Port | Lokaler TCP- oder UDP-Port des Sockets. |
| Remote Address | Adresse der Gegenstelle einer bestehenden Verbindung. |
| Remote Port | Port der Gegenstelle einer bestehenden Verbindung. |
| Wildcard-Bindung | Bindung an alle geeigneten lokalen Adressen, beispielsweise 0.0.0.0. |
| Loopback-Bindung | Bindung ausschließlich an die lokale Rückschleifenschnittstelle. |
| Netzwerk-Namespace | Isolierte Netzwerksicht eines Systems oder Containers mit eigenen Schnittstellen, Routen und Sockets. |
Ein Port ist nicht unabhängig vom Transportprotokoll zu betrachten. TCP-Port 53 und UDP-Port 53 sind unterschiedliche Endpunkte und können von unterschiedlichen Sockets verwendet werden.
Portnummern und Portbereiche
TCP- und UDP-Portnummern besitzen einen Wertebereich von 0 bis 65535.
| Bereich | IANA-Bezeichnung | Typische Verwendung |
|---|---|---|
0–1023 |
System Ports | Standardisierte oder systemnahe Dienste |
1024–49151 |
User Ports | Registrierte Anwendungsdienste |
49152–65535 |
Dynamic and/or Private Ports | Dynamische Clientports und private Verwendung |
Port 0 besitzt eine besondere Bedeutung und wird nicht wie ein normaler Dienstport verwendet. Eine Anwendung kann beim Binden an Port 0 das Betriebssystem einen freien lokalen Port auswählen lassen.
Auf Unix-artigen Systemen erfordert das Binden niedriger Ports häufig erhöhte Berechtigungen oder eine Fähigkeit wie CAP_NET_BIND_SERVICE. Das genaue Verhalten ist jedoch vom Betriebssystem und dessen Konfiguration abhängig.
Eine Eintragung im IANA-Verzeichnis bedeutet nicht, dass ein Port ausschließlich von dem dort genannten Dienst verwendet werden darf. Für die Diagnose ist die tatsächlich wirksame Konfiguration entscheidend.
Socket- und Verbindungsmodell
Ein TCP-Listener wird im Wesentlichen durch folgende Angaben beschrieben:
Transportprotokoll + lokale IP-Adresse + lokaler Port
Beispiel:
TCP 192.0.2.25:443
Eine aufgebaute TCP-Verbindung wird durch beide Endpunkte unterschieden:
Transportprotokoll
lokale IP-Adresse
lokaler Port
entfernte IP-Adresse
entfernter Port
Beispiel:
TCP
lokal: 192.0.2.25:443
remote: 198.51.100.40:53124
Ein einzelner TCP-Listener auf Port 443 kann deshalb viele gleichzeitige Verbindungen bedienen. Die einzelnen Verbindungen unterscheiden sich mindestens durch die entfernte Adresse oder den entfernten Port.
UDP besitzt keinen TCP-Verbindungsaufbau und keinen TCP-Zustand LISTEN. Ein UDP-Endpunkt kann dennoch an eine lokale Adresse und einen lokalen Port gebunden sein und Datagramme empfangen.
Gebundene Adressen richtig interpretieren
| Bindung | Bedeutung |
|---|---|
127.0.0.1:8080 |
Nur über IPv4-Loopback des eigenen Systems erreichbar |
192.0.2.25:8080 |
Nur über diese konkrete IPv4-Adresse erreichbar |
0.0.0.0:8080 |
IPv4-Wildcard; Bindung an alle geeigneten lokalen IPv4-Adressen |
[::1]:8080 |
Nur über IPv6-Loopback erreichbar |
[::]:8080 |
IPv6-Wildcard; Bindung an alle geeigneten lokalen IPv6-Adressen |
<Container-IP>:8080 |
Innerhalb des betreffenden Container-Netzwerks gebunden |
<Pod-IP>:8080 |
Innerhalb des Kubernetes-Pod-Netzwerks gebunden |
Eine Bindung an 0.0.0.0 bedeutet nicht, dass ein Client die Zieladresse 0.0.0.0 verwenden soll. Der Client verwendet eine konkrete erreichbare Adresse des Servers.
Bei einer Bindung an [::] darf nicht ungeprüft angenommen werden, dass derselbe Socket auch IPv4-Verbindungen akzeptiert. Das Verhalten hängt unter anderem vom Betriebssystem, der Socketoption IPV6_V6ONLY und der Anwendung ab. IPv4 und IPv6 müssen getrennt geprüft werden.
Loopback-, Wildcard- und spezifische Bindung
Loopback-Bindung
127.0.0.1:8080
[::1]:8080
Der Dienst ist grundsätzlich nur vom eigenen Netzwerk-Namespace erreichbar. Das ist beispielsweise für lokale Backends hinter einem Reverse Proxy sinnvoll.
Ein entfernter Client kann diesen Listener nicht direkt erreichen.
Wildcard-Bindung
0.0.0.0:8080
[::]:8080
Der Dienst lauscht grundsätzlich auf allen dafür geeigneten Adressen der entsprechenden Protokollfamilie. Dazu können gehören:
- LAN-Schnittstellen;
- WLAN-Schnittstellen;
- VPN-Schnittstellen;
- öffentliche Schnittstellen;
- virtuelle Switches;
- Container-Bridges.
Ob der Dienst tatsächlich von jedem Netz erreichbar ist, wird zusätzlich durch Routing, Firewall, NAT, Sicherheitsgruppen und vorgelagerte Systeme bestimmt.
Bindung an eine konkrete Adresse
192.0.2.25:8080
Der Dienst nimmt Verbindungen nur über diese lokale Adresse an.
Die Bindung kann beim Dienststart fehlschlagen, wenn:
- die Adresse nicht mehr am System vorhanden ist;
- die Schnittstelle noch nicht verfügbar ist;
- DHCP eine andere Adresse vergeben hat;
- die Adresse erst durch einen später gestarteten VPN-Tunnel entsteht;
- die Anwendung vor der Netzwerkkonfiguration gestartet wird;
- sich der Dienst in einem anderen Netzwerk-Namespace befindet.
TCP-Zustände
| Zustand | Einordnung |
|---|---|
LISTEN |
Lokaler Socket wartet auf neue TCP-Verbindungen. |
SYN-SENT |
Verbindungsaufbau wurde begonnen; Antwort steht noch aus. |
SYN-RECEIVED |
Ein SYN wurde empfangen und der Aufbau ist noch nicht abgeschlossen. |
ESTABLISHED |
TCP-Verbindung ist aufgebaut. |
FIN-WAIT-1 |
Lokale Seite hat das Schließen begonnen. |
FIN-WAIT-2 |
Lokale Seite wartet nach eigenem FIN auf das FIN der Gegenstelle. |
CLOSE-WAIT |
Gegenstelle hat geschlossen; lokale Anwendung muss noch schließen. |
LAST-ACK |
Lokale Seite wartet auf die Bestätigung ihres abschließenden FIN. |
TIME-WAIT |
Geschlossene Verbindung wird vorübergehend zur sicheren Protokollabwicklung vorgehalten. |
CLOSED |
Keine aktive TCP-Verbindung. |
Viele Einträge in TIME-WAIT sind nicht automatisch ein Fehler. Sie können bei kurzlebigen Verbindungen normal sein.
Dauerhaft viele CLOSE-WAIT-Sockets können darauf hindeuten, dass die lokale Anwendung geschlossene Verbindungen nicht ordnungsgemäß freigibt. Dieser Befund muss über Zeitverlauf, Prozesszustand und Anwendungstelemetrie bestätigt werden.
Was ein Listener beweist – und was nicht
Ein Listener beweist:
- ein Socket wurde im untersuchten Netzwerk-Namespace angelegt;
- der Socket ist an einen lokalen Port gebunden;
- das Betriebssystem führt ihn als empfangsbereiten TCP-Socket;
- ein Prozess oder Kernelbestandteil besitzt den Socket.
Ein Listener beweist nicht:
- dass die Firewall eingehende Verbindungen erlaubt;
- dass Routing zum Server funktioniert;
- dass NAT oder Portweiterleitung korrekt sind;
- dass ein Load Balancer das richtige Ziel verwendet;
- dass die Anwendung nach dem Verbindungsaufbau korrekt antwortet;
- dass TLS, HTTP, DNS oder ein anderes Anwendungsprotokoll funktioniert;
- dass der Dienst unter dem erwarteten Namen erreichbar ist;
- dass IPv4 und IPv6 gleichermaßen funktionieren;
- dass der Listener im richtigen Container oder Netzwerk-Namespace existiert.
Erwarteten Endpunkt festlegen
Vor der Diagnose müssen mindestens folgende Sollangaben dokumentiert werden:
Dienst:
<Anwendung oder Dienstname>
Transportprotokoll:
<TCP oder UDP>
Erwartete lokale Adresse:
<Loopback, konkrete Adresse oder Wildcard>
Erwarteter lokaler Port:
<Portnummer>
Erwarteter Netzwerk-Namespace:
<Host, Container, Pod oder anderer Namespace>
Erwartete Erreichbarkeit:
<nur lokal, internes Netz, VPN oder öffentlich>
Vorgelagerte Komponenten:
<Firewall, NAT, Reverse Proxy, Load Balancer oder Service>
Ohne diese Sollangaben kann ein sichtbarer Socket nicht zuverlässig als richtig oder falsch bewertet werden.
Windows: TCP-Listener erfassen
LESEND
Alle TCP-Verbindungen und Listener:
Get-NetTCPConnection
Nur TCP-Listener:
Get-NetTCPConnection `
-State Listen |
Sort-Object LocalPort, LocalAddress
Bestimmten lokalen Port prüfen:
Get-NetTCPConnection `
-State Listen `
-LocalPort 443
Ausgabe auf wesentliche Felder begrenzen:
Get-NetTCPConnection `
-State Listen |
Select-Object `
LocalAddress,
LocalPort,
State,
OwningProcess |
Sort-Object LocalPort, LocalAddress
Zu prüfen sind:
-
LocalAddress; -
LocalPort; -
State; -
OwningProcess; - mehrere Listener auf demselben Port;
- getrennte IPv4- und IPv6-Einträge;
- unerwartete Loopback-Bindung;
- unerwartete Wildcard-Bindung.
Windows: Prozess eines TCP-Listeners bestimmen
LESEND
Beispiel für Port 443:
Get-NetTCPConnection `
-State Listen `
-LocalPort 443 |
ForEach-Object {
$connection = $_
$process = Get-Process `
-Id $connection.OwningProcess `
-ErrorAction SilentlyContinue
[pscustomobject]@{
LocalAddress = $connection.LocalAddress
LocalPort = $connection.LocalPort
ProcessId = $connection.OwningProcess
ProcessName = $process.ProcessName
ProcessPath = $process.Path
}
}
Einen bekannten Prozess prüfen:
Get-Process `
-Id 1234
Die ausführbare Datei kann abhängig von Prozessschutz und Berechtigungen nicht immer angezeigt werden.
Windows: Prozess einem Dienst zuordnen
LESEND
$processId = 1234
Get-CimInstance `
-ClassName Win32_Service `
-Filter "ProcessId = $processId" |
Select-Object `
Name,
DisplayName,
State,
StartMode,
ProcessId,
PathName
Wenn kein Dienst zurückgegeben wird, kann der Prozess beispielsweise:
- interaktiv gestartet worden sein;
- durch einen Task gestartet worden sein;
- zu einer Desktopanwendung gehören;
- Teil einer Container- oder Virtualisierungsumgebung sein;
- durch einen anderen Dienstprozess verwaltet werden.
Windows: UDP-Endpunkte erfassen
LESEND
Alle UDP-Endpunkte:
Get-NetUDPEndpoint |
Sort-Object LocalPort, LocalAddress
Bestimmten UDP-Port prüfen:
Get-NetUDPEndpoint `
-LocalPort 53
UDP-Endpunkt mit Prozessinformationen anzeigen:
Get-NetUDPEndpoint `
-LocalPort 53 |
ForEach-Object {
$endpoint = $_
$process = Get-Process `
-Id $endpoint.OwningProcess `
-ErrorAction SilentlyContinue
[pscustomobject]@{
LocalAddress = $endpoint.LocalAddress
LocalPort = $endpoint.LocalPort
ProcessId = $endpoint.OwningProcess
ProcessName = $process.ProcessName
}
}
Das Vorhandensein eines UDP-Endpunkts beweist noch nicht, dass eine gesendete Anfrage verarbeitet oder beantwortet wird.
Windows: netstat als ergänzende Sicht
LESEND
netstat -ano
Nur TCP-Listener:
netstat -ano -p tcp
UDP-Endpunkte:
netstat -ano -p udp
Wiederholte Aktualisierung alle fünf Sekunden:
netstat -ano 5
Beenden mit Strg+C.
Wichtige Optionen:
| Option | Bedeutung |
|---|---|
-a |
Zeigt aktive Verbindungen und Listener. |
-n |
Zeigt numerische Adressen und Ports. |
-o |
Zeigt die zugehörige Prozess-ID. |
-p tcp |
Begrenzt die Anzeige auf TCP. |
-p udp |
Begrenzt die Anzeige auf UDP. |
Namensauflösung sollte für die erste Diagnose mit -n vermieden werden. Anderenfalls können DNS-Verzögerungen die Ausgabe verlangsamen oder Adressen durch Namen verdecken.
Windows: lokale IP-Adressen bestätigen
LESEND
Get-NetIPConfiguration
Alle verwendbaren IP-Adressen:
Get-NetIPAddress |
Where-Object AddressState -eq "Preferred" |
Sort-Object InterfaceIndex, AddressFamily
Eine Bindung an eine konkrete Adresse ist nur sinnvoll, wenn diese Adresse tatsächlich im richtigen Netzwerk-Compartment und auf der vorgesehenen Schnittstelle vorhanden ist.
Windows: Kernel- und HTTP.sys-Zuordnungen prüfen
Ein Port kann durch einen Kernelbestandteil oder eine gemeinsame HTTP-Infrastruktur verwaltet werden. Der sichtbare Besitzer muss daher nicht unmittelbar der erwartete Anwendungsprozess sein.
Bei HTTP- oder HTTPS-Diensten unter Windows:
LESEND
netsh http show servicestate
Registrierte URL-Zuordnungen:
netsh http show urlacl
Registrierte TLS-Zertifikatbindungen:
netsh http show sslcert
Portproxy-Konfiguration:
netsh interface portproxy show all
Zu prüfen sind:
- welcher Dienst die URL registriert hat;
- welcher Prozess eine HTTP.sys-Anforderungswarteschlange verwendet;
- ob eine Portproxy-Regel besteht;
- ob der sichtbare Hostport an ein anderes Ziel weiterleitet;
- ob der Prozessbesitzer nur als
Systemerscheint.
Eine URL-Reservierung allein beweist keinen aktiven Listener.
Linux: TCP- und UDP-Sockets mit ss prüfen
ss ist unter Linux das bevorzugte Werkzeug zur Anzeige von Socketinformationen.
LESEND
TCP-Listener:
ss -lnt
TCP-Listener einschließlich Prozessinformationen:
sudo ss -lntp
UDP-Endpunkte:
sudo ss -lnup
TCP- und UDP-Endpunkte gemeinsam:
sudo ss -lntup
Bestimmten TCP-Port prüfen:
sudo ss -lntp 'sport = :443'
Bestimmten UDP-Port prüfen:
sudo ss -lnup 'sport = :53'
Alle TCP-Verbindungen und Zustände:
ss -tan
Zusammenfassung:
ss -s
Wichtige Optionen:
| Option | Bedeutung |
|---|---|
-l |
Nur lauschende beziehungsweise unverbundene Endpunkte |
-n |
Numerische Adressen und Ports |
-t |
TCP |
-u |
UDP |
-p |
Prozessinformationen |
-a |
Alle Sockets |
-x |
Unix-Domain-Sockets |
Prozessinformationen können erhöhte Berechtigungen erfordern.
Linux: Prozess mit lsof bestimmen
LESEND
Alle lauschenden TCP-Sockets:
sudo lsof -nP -iTCP -sTCP:LISTEN
Bestimmten TCP-Port prüfen:
sudo lsof -nP -iTCP:443 -sTCP:LISTEN
Bestimmten UDP-Port prüfen:
sudo lsof -nP -iUDP:53
Wichtige Optionen:
| Option | Bedeutung |
|---|---|
-n |
Keine Namensauflösung der IP-Adressen |
-P |
Keine Umwandlung von Ports in Dienstnamen |
-iTCP |
TCP-Sockets |
-iUDP |
UDP-Sockets |
-sTCP:LISTEN |
Nur TCP-Listener |
Danach können Prozess und Dienst untersucht werden:
ps -fp <PID>
Bei einem systemd-Dienst:
systemctl status <Dienstname>
Prozessbaum:
pstree -p <PID>
Falls pstree nicht installiert ist:
ps -ef --forest
Linux: Netzwerkadressen und Namespace prüfen
LESEND
ip address show
Kompakte Ansicht:
ip -brief address
Netzwerk-Namespaces anzeigen:
ip netns list
Socketansicht eines bekannten Prozess-Namespace:
sudo nsenter \
-t <PID> \
-n \
ss -lntup
Dieser Test ist besonders wichtig, wenn ein Prozess in einem Container oder separaten Netzwerk-Namespace läuft.
Ein Listener innerhalb eines Container-Namespace muss nicht als normaler Listener in der Sockettabelle des Hosts erscheinen.
macOS: TCP- und UDP-Sockets prüfen
Linux-ss ist unter macOS standardmäßig nicht verfügbar. Für die Prozesszuordnung ist lsof besonders geeignet.
LESEND
Alle TCP-Listener:
sudo lsof -nP -iTCP -sTCP:LISTEN
Bestimmten TCP-Port prüfen:
sudo lsof -nP -iTCP:443 -sTCP:LISTEN
UDP-Endpunkte:
sudo lsof -nP -iUDP
Bestimmten UDP-Port prüfen:
sudo lsof -nP -iUDP:53
TCP-Socketzustände mit netstat:
netstat -anv -p tcp
UDP-Sockets:
netstat -anv -p udp
Lokale Netzwerkschnittstellen:
ifconfig
Routing- und Schnittstelleninformationen:
route -n get default
Für die Zuordnung eines Ports zu einem Prozess sollte unter macOS nicht allein auf netstat vertraut werden. lsof liefert dafür normalerweise die geeignetere Sicht.
Unix-Domain-Sockets und andere lokale IPC-Endpunkte
Nicht jede lokale Dienstkommunikation verwendet einen TCP- oder UDP-Port.
Typische Alternativen sind:
- Unix-Domain-Sockets;
- Windows Named Pipes;
- Shared Memory;
- lokale Message Queues;
- anwendungsspezifische IPC-Mechanismen.
Linux:
sudo ss -lxnp
Linux und macOS:
sudo lsof -U
Ein Reverse Proxy kann beispielsweise über einen Unix-Domain-Socket mit seinem Backend kommunizieren. In diesem Fall ist für die Backendverbindung kein TCP-Listener sichtbar.
Die Diagnose muss dann zusätzlich prüfen:
- Pfad des Sockets;
- Dateiberechtigungen;
- Besitzer und Gruppe;
- Existenz nach dem Dienststart;
- Namespace oder Container;
- SELinux- beziehungsweise AppArmor-Richtlinien;
- Konfiguration von Proxy und Backend.
Portkonflikte erkennen
Typische Meldungen eines Bindungsfehlers sind:
Address already in use
EADDRINUSE
WSAEADDRINUSE
Only one usage of each socket address is normally permitted
Mögliche Ursachen:
- ein anderer Prozess besitzt bereits denselben Endpunkt;
- eine alte Instanz der Anwendung läuft noch;
- zwei Dienste verwenden dieselbe konfigurierte Adresse und denselben Port;
- ein Wildcard-Listener kollidiert mit einer spezifischen Bindung;
- IPv4- und IPv6-Verhalten wurde falsch eingeschätzt;
- ein Dienst wird doppelt durch Service Manager und manuellen Start gestartet;
- ein Container veröffentlicht bereits denselben Hostport;
- eine Portproxy- oder Kernelkomponente ist beteiligt.
Windows:
Get-NetTCPConnection `
-State Listen `
-LocalPort 8080
Get-NetUDPEndpoint `
-LocalPort 8080
Linux:
sudo ss -lntup 'sport = :8080'
macOS:
sudo lsof -nP -iTCP:8080 -sTCP:LISTEN
Ein Port kann unter bestimmten Bedingungen absichtlich durch mehrere Prozesse oder Sockets gemeinsam verwendet werden. Beispiele sind Socketaktivierung, SO_REUSEPORT, gemeinsam verwaltete Kernel-Listener oder Clustermechanismen. Deshalb darf ein ungewöhnlicher Mehrfachbefund nicht ohne Prüfung als Fehler bewertet werden.
Weitere typische Bindungsfehler
| Meldung oder Fehler | Mögliche Einordnung |
|---|---|
Address already in use |
Endpunkt wird bereits verwendet. |
Permission denied |
Fehlende Berechtigung, Sicherheitsrichtlinie oder geschützter Port. |
EACCES |
Zugriff auf Adresse oder Port verweigert. |
Cannot assign requested address |
Konfigurierte lokale Adresse ist nicht vorhanden. |
EADDRNOTAVAIL |
Lokale Bindungsadresse steht nicht zur Verfügung. |
Connection refused |
Zielsystem lehnt aktiv ab; häufig kein passender Listener. |
| Timeout | Keine verwertbare Antwort; Paketverlust, Filterung, Routing oder Überlastung möglich. |
| Verbindung erfolgreich, Protokollfehler | Transport funktioniert; Anwendung oder Protokollkonfiguration fehlerhaft. |
Die Zuordnung ist eine erste Einordnung und kein alleiniger Ursachennachweis.
Lokalen TCP-Endpunkt testen
Ein lokaler Test muss zur tatsächlichen Bindung passen.
Windows:
NETZAKTIV
Test-NetConnection `
-ComputerName "127.0.0.1" `
-Port 8080 `
-InformationLevel Detailed
Test gegen die konkrete Schnittstellenadresse:
Test-NetConnection `
-ComputerName "192.0.2.25" `
-Port 8080 `
-InformationLevel Detailed
Linux und macOS:
nc -vz 127.0.0.1 8080
nc -vz 192.0.2.25 8080
Ein erfolgreicher TCP-Test beweist nur, dass der TCP-Verbindungsaufbau funktioniert hat. Er beweist nicht, dass die Anwendung ein gültiges Ergebnis liefert.
Test-NetConnection -Port prüft TCP. Es ist kein allgemeiner UDP-Test.
Loopback und Schnittstellenadresse getrennt testen
Die folgenden Befunde müssen unterschieden werden:
| Loopback-Test | Test gegen Serveradresse | Mögliche Einordnung |
|---|---|---|
| erfolgreich | erfolgreich | Listener ist lokal über beide Pfade erreichbar |
| erfolgreich | fehlgeschlagen | falsche Bindung, lokale Firewall oder Adressproblem |
| fehlgeschlagen | erfolgreich | Dienst lauscht nur auf konkreter Adresse |
| fehlgeschlagen | fehlgeschlagen | kein Listener, falscher Port, falsches Protokoll oder Dienstfehler |
Ein Test gegen localhost kann je nach Namensauflösung zuerst ::1 oder 127.0.0.1 verwenden. Für eine eindeutige Diagnose müssen IPv4- und IPv6-Adressen ausdrücklich getestet werden.
Windows:
Test-NetConnection `
-ComputerName "127.0.0.1" `
-Port 8080
Test-NetConnection `
-ComputerName "::1" `
-Port 8080
Linux und macOS:
nc -4 -vz 127.0.0.1 8080
nc -6 -vz ::1 8080
Test von einem entfernten Client
Der Test muss von einem System erfolgen, das den realen Zugriffspfad möglichst genau abbildet.
Windows:
NETZAKTIV
Test-NetConnection `
-ComputerName "app.example.test" `
-Port 443 `
-InformationLevel Detailed
Linux und macOS:
nc -vz app.example.test 443
Getrennte Prüfung einer bekannten IP-Adresse:
nc -vz 192.0.2.25 443
Zu dokumentieren sind:
- verwendeter Zielname;
- aufgelöste Zieladresse;
- Quelladresse;
- Zielport;
- TCP-Ergebnis;
- Zeitpunkt;
- Teststandort;
- VPN-Zustand;
- IPv4 oder IPv6;
- direkter oder weitergeleiteter Pfad.
Nur autorisierte Ziele und Ports dürfen geprüft werden. Breite Portscans sind für die Diagnose eines bekannten Dienstendpunkts normalerweise nicht erforderlich.
Anwendungsprotokoll statt nur Port prüfen
Nach erfolgreichem TCP-Verbindungsaufbau muss das erwartete Anwendungsprotokoll getestet werden.
HTTP:
curl -v http://127.0.0.1:8080/
HTTPS mit korrektem Hostnamen und festgelegter Zieladresse:
curl -v \
--resolve app.example.test:443:192.0.2.25 \
https://app.example.test/
TLS mit Server Name Indication:
openssl s_client \
-connect 192.0.2.25:443 \
-servername app.example.test
DNS über UDP:
dig @192.0.2.53 example.test A
DNS über TCP:
dig @192.0.2.53 example.test A +tcp
Ein erfolgreicher TCP-Test auf Port 443 beweist beispielsweise nicht:
- dass der TLS-Handshake funktioniert;
- dass das richtige Zertifikat geliefert wird;
- dass SNI korrekt verarbeitet wird;
- dass HTTP eine gültige Antwort liefert;
- dass der erwartete virtuelle Host ausgewählt wird.
UDP richtig prüfen
UDP besitzt keinen TCP-Handshake. Deshalb kann ein allgemeiner UDP-Porttest kein gleichwertiges Ergebnis wie ein erfolgreicher TCP-Verbindungsaufbau liefern.
Zu prüfen sind:
- existiert ein lokaler UDP-Endpunkt?
- verlässt die Anfrage den Client?
- erreicht sie den Server?
- antwortet die Anwendung?
- erreicht die Antwort den Client?
- wird ein ICMP-Fehler zurückgegeben?
- wird ICMP unterwegs gefiltert?
- wird das richtige Anwendungsprotokoll verwendet?
Ein Aufruf wie:
nc -vzu 192.0.2.53 53
kann Datagramme erzeugen, liefert aber ohne geeignete Anwendungsantwort keinen belastbaren Nachweis für einen funktionsfähigen UDP-Dienst.
Für UDP ist ein protokollspezifischer Test vorzuziehen, beispielsweise:
-
digfür DNS; -
ntpq,chronycoder ein geeigneter NTP-Test für NTP; - ein herstellerspezifischer Testclient;
- eine begrenzte Netzwerkaufzeichnung.
Firewall und Listener getrennt betrachten
Die Diagnoseebenen sind voneinander zu trennen:
Anwendungsprozess
→ lokaler Socket
→ lokale Firewall
→ Routing und Netzwerk
→ externe Firewall oder NAT
→ Client
Mögliche Befunde:
- Dienst läuft, aber kein Socket wurde gebunden;
- Socket existiert, lokale Firewall blockiert;
- lokale Prüfung funktioniert, entfernte Prüfung schlägt fehl;
- entfernte Verbindung erreicht den Server, Antwortweg fehlt;
- NAT leitet auf einen falschen Hostport weiter;
- Load Balancer verwendet den falschen Backendport;
- Reverse Proxy erreicht sein lokales Backend nicht.
Ein laufender Dienststatus beweist keinen Listener. Ein Listener beweist keine Firewallfreigabe.
Windows-Firewallbezug lesend prüfen
Aktive eingehende Regeln anzeigen:
LESEND
Get-NetFirewallRule `
-Enabled True `
-Direction Inbound |
Select-Object `
DisplayName,
Action,
Profile,
Direction
Portfilter zu einer bekannten Regel:
Get-NetFirewallRule `
-DisplayName "<Regelname>" |
Get-NetFirewallPortFilter
Adressfilter:
Get-NetFirewallRule `
-DisplayName "<Regelname>" |
Get-NetFirewallAddressFilter
Anwendungsfilter:
Get-NetFirewallRule `
-DisplayName "<Regelname>" |
Get-NetFirewallApplicationFilter
Zu prüfen sind:
- TCP oder UDP;
- lokaler Port;
- lokales Programm;
- lokales und entferntes Adressnetz;
- aktives Firewallprofil;
- eingehende oder ausgehende Richtung;
- Block- und Zulassungsregeln;
- durch Gruppenrichtlinie gelieferte Regeln.
Die Firewall darf nicht vorsorglich vollständig deaktiviert werden. Eine Änderung muss auf den nachgewiesenen Dienst, Port, Pfad und Zeitraum begrenzt werden.
Reverse Proxy und Backendlistener
Ein typischer Aufbau ist:
Client
→ Reverse Proxy auf 0.0.0.0:443
→ Backend auf 127.0.0.1:8080
In diesem Fall müssen zwei getrennte Endpunkte geprüft werden:
- externer Listener des Reverse Proxys;
- interner Listener des Backends.
Mögliche Fehler:
- Proxy lauscht nicht auf Port
443; - Backend lauscht nicht auf Port
8080; - Backend ist nur über IPv6 erreichbar, Proxy verwendet IPv4;
- Proxy verwendet den falschen Backendport;
- Backend befindet sich in einem Container und
127.0.0.1bezeichnet dort einen anderen Namespace; - Proxy erwartet einen Unix-Domain-Socket;
- TLS endet am Proxy, während das Backend fälschlich ebenfalls TLS erwartet;
- Health Check und produktiver Zielport unterscheiden sich.
Ein erfolgreicher externer TCP-Verbindungsaufbau beweist nicht, dass das Backend erreichbar ist.
Container und Netzwerk-Namespaces
Container besitzen häufig eine eigene Netzwerksicht. Dabei sind mindestens drei Endpunkte zu unterscheiden:
Anwendungsport im Container
veröffentlichter Port auf dem Host
Port des zugreifenden Clients
Beispiel:
Container: 172.18.0.5:80
Host: 192.0.2.25:8080
Client: verbindet zu 192.0.2.25:8080
Ein Dienst, der innerhalb des Containers nur an 127.0.0.1:80 gebunden ist, ist über eine normale Portveröffentlichung häufig nicht erreichbar. Für den Zugriff über das Container-Netz muss er üblicherweise an der Containeradresse oder an einer geeigneten Wildcard-Adresse lauschen.
Docker: Portzuordnung prüfen
LESEND
Laufende Container und veröffentlichte Ports:
docker ps \
--format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
Portzuordnungen eines Containers:
docker port <Containername>
Ausführliche Portkonfiguration:
docker inspect \
<Containername> \
--format '{{json .NetworkSettings.Ports}}'
Netzwerkmodus:
docker inspect \
<Containername> \
--format '{{.HostConfig.NetworkMode}}'
Containeradresse:
docker inspect \
<Containername> \
--format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
Listener innerhalb des Containers, falls ss vorhanden ist:
docker exec \
<Containername> \
ss -lntup
Alternativ, falls lsof vorhanden ist:
docker exec \
<Containername> \
lsof -nP -i
Fehlende Diagnosewerkzeuge im Container sind kein Nachweis für einen fehlenden Listener. Minimal gehaltene Images enthalten häufig weder ss noch lsof.
Docker-Portveröffentlichung interpretieren
Beispiele für Veröffentlichungen:
127.0.0.1:8080:80
Bedeutung:
Host 127.0.0.1:8080
→ Containerport 80
Dieser Hostport soll nur lokal erreichbar sein.
8080:80
Bedeutung:
Hostport 8080
→ Containerport 80
Ohne ausdrücklich angegebene Hostadresse veröffentlicht Docker den Port standardmäßig auf den Hostadressen. Die genaue Erreichbarkeit hängt zusätzlich von Docker-, Firewall- und IPv4-/IPv6-Konfiguration ab.
Wichtige Unterscheidungen:
-
EXPOSEim Image veröffentlicht keinen Hostport; -
-pbeziehungsweise--publisherstellt eine Portveröffentlichung; -
-Pveröffentlicht dafür vorgesehene Ports automatisch auf Hostports; - Hostport und Containerport können unterschiedlich sein;
- Container-IP und Host-IP sind unterschiedliche Adressen;
- der Listener im Container muss zum Containerport passen;
- im Host-Netzwerkmodus teilt der Container den Netzwerk-Namespace des Hosts;
- im Host-Netzwerkmodus werden normale Publish-Optionen nicht wie bei einem Bridge-Netzwerk verwendet.
Ein veröffentlichter Docker-Port muss nicht immer als gewöhnlicher Benutzerprozess-Listener in der erwarteten Host-Socketliste erscheinen. Weiterleitung kann abhängig von Plattform und Konfiguration über Firewall-, NAT- oder Proxymechanismen erfolgen.
Kubernetes: Portebenen unterscheiden
Bei Kubernetes sind mehrere Portangaben auseinanderzuhalten:
| Feld | Bedeutung |
|---|---|
containerPort |
Deklarative Portangabe am Container; erzwingt keinen Listener. |
targetPort |
Port, zu dem ein Service im ausgewählten Pod weiterleitet. |
port |
Port des Kubernetes-Service. |
nodePort |
Optionaler Port auf den Clusterknoten. |
| Pod-Port | Tatsächlicher Socket des Prozesses im Pod. |
| Ingress-/Gateway-Port | Extern bereitgestellter Listener eines Proxys oder Gateways. |
Beispiel:
ports:
- name: https
port: 443
targetPort: 8443
Der Service nimmt Verkehr auf Port 443 an und leitet ihn zum Zielport 8443 weiter.
Wenn targetPort nicht angegeben wird, entspricht er standardmäßig dem Wert von port.
Ein eingetragener containerPort erzeugt keinen Socket und startet keinen Dienst.
Kubernetes-Service und Endpunkte prüfen
LESEND
Services:
kubectl get service \
--all-namespaces
Bestimmten Service beschreiben:
kubectl describe service \
<Servicename> \
-n <Namespace>
Service als YAML anzeigen:
kubectl get service \
<Servicename> \
-n <Namespace> \
-o yaml
EndpointSlices anzeigen:
kubectl get endpointslice \
-n <Namespace> \
-l kubernetes.io/service-name=<Servicename> \
-o wide
Pods und Pod-Adressen:
kubectl get pods \
-n <Namespace> \
-o wide
Pod beschreiben:
kubectl describe pod \
<Podname> \
-n <Namespace>
Listener im Pod, falls das Werkzeug vorhanden ist:
kubectl exec \
-n <Namespace> \
<Podname> \
-- ss -lntup
Bei mehreren Containern im Pod:
kubectl exec \
-n <Namespace> \
<Podname> \
-c <Containername> \
-- ss -lntup
Zu prüfen sind:
- Service-Port;
-
targetPort; - benannter oder numerischer Zielport;
- Selektor des Service;
- passende Pods;
- Ready-Zustand der Pods;
- vorhandene EndpointSlices;
- tatsächlicher Listener im Pod;
- Bindung an Pod-IP oder Wildcard;
- NetworkPolicy;
- Sidecar- oder Service-Mesh-Proxy;
- Ingress- oder Gateway-Konfiguration.
Ein Service ohne passende Endpunkte kann existieren, obwohl kein Backend erreichbar ist.
Besonderheiten von NodePort, Service und Ingress
Ein Kubernetes-NodePort oder ein durch Regeln weitergeleiteter Service-Port muss nicht als klassischer Anwendungsprozess im Zustand LISTEN erscheinen. Je nach Plattform wird der Verkehr beispielsweise durch:
- kube-proxy;
- nftables;
- iptables;
- IPVS;
- eBPF;
- einen Cloud Load Balancer;
- ein Ingress-Gateway
weitergeleitet.
Deshalb sind für Kubernetes mehrere Ebenen zu prüfen:
externer Listener oder Load Balancer
→ NodePort beziehungsweise Service
→ EndpointSlice
→ Pod-IP und targetPort
→ Prozess im Pod
Die alleinige Suche nach einem Hostprozess mit dem externen Port kann zu einer falschen Schlussfolgerung führen.
IPv4 und IPv6 getrennt prüfen
Zu prüfen sind:
- existiert ein IPv4-Listener?
- existiert ein IPv6-Listener?
- welche Adresse liefert DNS?
- welche Adresse wählt der Client zuerst?
- ist die Firewall für beide Protokollfamilien passend konfiguriert?
- existiert für beide Adressfamilien eine Route?
- liefert die Anwendung auf beiden Pfaden dieselbe Antwort?
Windows:
Get-NetTCPConnection `
-State Listen `
-LocalPort 443 |
Select-Object LocalAddress, LocalPort, OwningProcess
Linux:
sudo ss -lntp 'sport = :443'
Gezielter IPv4-Test:
curl -4 -v https://app.example.test/
Gezielter IPv6-Test:
curl -6 -v https://app.example.test/
Wenn IPv6 fehlschlägt und IPv4 funktioniert, darf der Fehler nicht durch dauerhaftes Abschalten von IPv6 verdeckt werden. Bindung, Routing, DNS und Firewall müssen getrennt untersucht werden.
Temporäre und dynamische Clientports
Beim Aufbau einer ausgehenden Verbindung verwendet der Client normalerweise einen lokalen Quellport aus einem dynamischen Bereich.
Beispiel:
Client: 192.0.2.100:53124
Server: 192.0.2.25:443
Der Serverdienst lauscht auf Port 443. Der Clientport 53124 wurde für diese Verbindung lokal ausgewählt.
Typische Diagnosefehler:
- den dynamischen Clientport mit dem Serverport verwechseln;
- eine eingehende Firewallregel für den Clientquellport erwarten;
- einen
TIME-WAIT-Eintrag als Serverlistener interpretieren; - nur nach dem Zielport suchen und die Verbindungsrichtung ignorieren.
Die ausführliche Diagnose dynamischer Ports und Porterschöpfung erfolgt in der dafür vorgesehenen Folgeseite.
Dienststatus und Socketstatus vergleichen
| Dienststatus | Socketstatus | Einordnung |
|---|---|---|
| läuft | Listener vorhanden | Dienst hat mindestens einen erwarteten Socket angelegt |
| läuft | Listener fehlt | Start teilweise fehlgeschlagen, falsche Konfiguration oder falscher Namespace |
| beendet | Listener vorhanden | anderer Prozess, Kernelkomponente oder alte Instanz besitzt den Port |
| startet wiederholt | Listener erscheint kurz | Absturz, Health-Check-Fehler oder Portkonflikt möglich |
| läuft | falsche Adresse | Bindung oder Schnittstellenkonfiguration fehlerhaft |
| läuft | falscher Port | Konfigurationsquelle oder Startparameter prüfen |
Ein grüner Dienststatus ist kein ausreichender Funktionsnachweis.
Konfigurationsquelle des Listeners bestimmen
Mögliche Quellen der Bindung:
- Anwendungskonfigurationsdatei;
- Kommandozeilenparameter;
- Umgebungsvariable;
- Windows-Registry;
- systemd-Unit;
- Socketaktivierung;
- Docker-Compose-Datei;
- Kubernetes-Manifest;
- Helm-Werte;
- Reverse-Proxy-Konfiguration;
- Orchestrator oder Service Discovery;
- durch Gruppenrichtlinie oder zentrale Verwaltung gelieferte Einstellung.
Zu dokumentieren sind:
wirksamer Port:
<Port>
wirksame Bindungsadresse:
<Adresse>
Quelle:
<Datei, Parameter, Variable oder zentrale Richtlinie>
geladene Version:
<Version oder Prüfsumme>
Zeitpunkt der letzten Änderung:
<Zeitpunkt>
Neustart erforderlich:
<ja oder nein>
Die Änderung einer nicht wirksamen Konfigurationsdatei führt zu keinem belastbaren Ergebnis. Zuerst muss bestimmt werden, welche Konfiguration der laufende Prozess tatsächlich verwendet.
Netzwerkaufzeichnung gezielt einsetzen
Eine Netzwerkaufzeichnung ist sinnvoll, wenn unklar bleibt:
- ob der Client ein SYN sendet;
- ob das SYN den Server erreicht;
- ob der Server mit SYN/ACK oder RST antwortet;
- ob die Antwort den Client erreicht;
- ob UDP-Anfragen und Antworten übertragen werden;
- ob ein Proxy oder Load Balancer beteiligt ist;
- ob IPv4 oder IPv6 verwendet wird;
- ob Verbindungen wiederholt aufgebaut werden;
- ob der Server die Verbindung nach dem Aufbau beendet.
Linux:
SENSITIV · LESEND
sudo tcpdump \
-ni any \
'tcp port 443' \
-c 100
Auf eine Gegenstelle begrenzen:
sudo tcpdump \
-ni any \
'host 198.51.100.40 and tcp port 443' \
-c 100
UDP-Beispiel:
sudo tcpdump \
-ni any \
'udp port 53' \
-c 100
macOS mit konkreter Schnittstelle:
sudo tcpdump \
-ni en0 \
'tcp port 443' \
-c 100
Lokalen macOS-Verkehr auf Loopback:
sudo tcpdump \
-ni lo0 \
'tcp port 8080' \
-c 100
Aufzeichnungen müssen auf den benötigten Port, Host und Zeitraum begrenzt werden. Sie können sensible Adressen und Nutzdaten enthalten.
TCP-Paketbefunde einordnen
| Beobachtung | Mögliche Einordnung |
|---|---|
| SYN verlässt Client, erreicht Server nicht | Routing, Firewall, NAT oder falsche Zieladresse |
| SYN erreicht Server, keine Antwort | Filterung, Überlastung oder falscher Netzwerk-Namespace |
| SYN erreicht Server, RST folgt | häufig kein passender Listener oder aktive Ablehnung |
| SYN, SYN/ACK, ACK sichtbar | TCP-Verbindungsaufbau erfolgreich |
| Aufbau erfolgreich, sofortiges FIN | Anwendung beendet Verbindung kontrolliert |
| Aufbau erfolgreich, sofortiges RST | Anwendung, Proxy oder Protokollfehler möglich |
| Server antwortet, Antwort erreicht Client nicht | Rückweg, Firewall, asymmetrisches Routing |
| wiederholte SYN-Pakete | Client erhält keine verwertbare Antwort |
Die Paketaufzeichnung muss möglichst auf beiden Seiten oder an einem geeigneten Zwischenpunkt korreliert werden. Eine Aufzeichnung nur am Client zeigt nicht sicher, ob das Paket den Server erreicht hat.
Systematischer Diagnoseablauf
- Exakte Fehlermeldung, Zeitpunkt und betroffene Anwendung dokumentieren.
- Erwartetes Transportprotokoll bestimmen.
- Erwarteten lokalen und entfernten Port bestimmen.
- Erwartete Bindungsadresse festlegen.
- Erforderliche Erreichbarkeit bestimmen: lokal, LAN, VPN oder öffentlich.
- Host, Container, Pod und Netzwerk-Namespace unterscheiden.
- Tatsächliche IP-Adressen des Systems erfassen.
- DNS-Auflösung des Zielnamens dokumentieren.
- TCP-Listener oder UDP-Endpunkt erfassen.
- IPv4- und IPv6-Bindung getrennt auswerten.
- Besitzenden Prozess bestimmen.
- Prozess einem Dienst, Container oder Pod zuordnen.
- Wirksame Konfigurationsquelle bestimmen.
- Dienstprotokolle zum Startzeitpunkt prüfen.
- Auf Portkonflikte oder Bindungsfehler prüfen.
- Loopback-Endpunkt testen.
- Konkrete lokale Schnittstellenadresse testen.
- Test von einem repräsentativen entfernten Client durchführen.
- Firewall, NAT und Portweiterleitung prüfen.
- Reverse Proxy, Load Balancer oder Kubernetes-Service berücksichtigen.
- Nach erfolgreichem Transport das Anwendungsprotokoll testen.
- Bei Bedarf eine begrenzte Netzwerkaufzeichnung durchführen.
- Hypothese, erwarteten Befund und Gegenbeweis formulieren.
- Genau eine kontrollierte Maßnahme durchführen.
- Identische Tests wiederholen.
- Anwendung und weitere repräsentative Clients verifizieren.
- Temporäre Diagnoseänderungen zurücknehmen.
- Ursache und Prävention dokumentieren.
Hypothese und Gegenbeweis
Beispiel:
Hypothese:
Der Webdienst ist ausschließlich an 127.0.0.1:8080 gebunden und deshalb
von entfernten Clients nicht direkt erreichbar.
Erwarteter Befund:
Der lokale Test gegen 127.0.0.1:8080 funktioniert.
Die Socketliste zeigt keinen Listener auf 192.0.2.25:8080 oder
0.0.0.0:8080.
Der Test eines entfernten Clients schlägt fehl.
Gegenbeweis:
Die Socketliste zeigt einen Listener auf 0.0.0.0:8080 und eine
Netzwerkaufzeichnung bestätigt, dass der Server eingehende SYN-Pakete
mit SYN/ACK beantwortet.
Testmethode:
Socketliste, lokaler Test, entfernter Test und begrenzte Aufzeichnung.
Risiko:
Die lesenden Socketprüfungen sind risikoarm. Aktive Tests erzeugen
Netzwerkverkehr, verändern aber nicht die Dienstkonfiguration.
Eine Änderung darf erst erfolgen, wenn die vermutete Ursache einen messbaren Befund besitzt.
Kontrollierte Maßnahmen
| Maßnahme | Voraussetzung | Risiko |
|---|---|---|
| Bindungsadresse korrigieren | falsche Adresse nachgewiesen | Dienst kann auf weiteren Netzen erreichbar werden |
| Port korrigieren | Soll- und Ist-Port unterscheiden sich nachweislich | Clients oder Überwachung verwenden eventuell alten Port |
| kollidierenden Prozess beenden | falscher Prozessbesitz eindeutig bestätigt | Prozess oder abhängiger Dienst fällt aus |
| Dienst geordnet neu starten | Konfigurationsänderung erfordert Neustart | bestehende Verbindungen werden unterbrochen |
| Firewallregel anpassen | Listener funktioniert lokal und Filterung ist bestätigt | unbeabsichtigte Freigabe |
| Docker-Portzuordnung korrigieren | falscher Host- oder Containerport bestätigt | Container muss eventuell neu erstellt werden |
Kubernetes-targetPort korrigieren |
Service und Pod-Listener stimmen nicht überein | laufender Dienstverkehr wird umgeleitet |
| Reverse-Proxy-Ziel korrigieren | falscher Backendendpunkt nachgewiesen | alle über den Proxy laufenden Anfragen betroffen |
| IPv4-/IPv6-Bindung korrigieren | Protokollfamilienfehler bestätigt | zusätzliche Angriffsfläche oder geänderte Erreichbarkeit |
| Socketdateiberechtigung korrigieren | Unix-Socket und Zugriffsfehler bestätigt | weitere lokale Prozesse können Zugriff erhalten |
Vor der Maßnahme sind zu dokumentieren:
- Ausgangszustand;
- betroffener Endpunkt;
- Prozess und Dienst;
- Konfigurationsquelle;
- erwartete Wirkung;
- Sicherheitsauswirkung;
- Wartungsfenster;
- Rückweg;
- Erfolgskriterium.
Befundmatrix
| Befund | Mögliche Einordnung | Nächster Nachweis |
|---|---|---|
| Dienst läuft, Port fehlt | Bindung fehlgeschlagen oder falsche Konfiguration | Startprotokoll und wirksame Konfiguration |
| Port vorhanden, falscher Prozess | Portkonflikt oder unerwarteter Dienst | Prozesspfad und Dienstzuordnung |
Listener nur auf 127.0.0.1 |
nur lokale Erreichbarkeit vorgesehen oder Fehlkonfiguration | Sollbindung und Proxyaufbau prüfen |
Listener auf 0.0.0.0 |
alle geeigneten IPv4-Adressen | Firewall und tatsächliche Erreichbarkeit prüfen |
Listener nur auf [::] |
IPv6-Wildcard | IPv4 und IPv6 ausdrücklich getrennt testen |
| lokaler Test funktioniert, remote nicht | Firewall, Routing, NAT oder Bindungsumfang | entfernte Aufzeichnung und Firewallzustand |
| TCP-Verbindung funktioniert, Anwendung nicht | Anwendungs- oder Protokollfehler | HTTP-, TLS- oder Diensttest |
Connection refused |
häufig kein passender Listener | Server-Socketliste und Paketaufzeichnung |
| Timeout | keine verwertbare Antwort | Routing, Filterung und Aufzeichnung |
| UDP-Endpunkt sichtbar, keine Antwort | Anwendung, Firewall oder Rückweg | protokollspezifischer Test und Aufzeichnung |
| Port erscheint kurz und verschwindet | Prozess beendet sich oder startet neu | Prozess- und Dienstprotokolle |
Bindung meldet Address already in use |
Endpunkt bereits belegt | Besitzer des vorhandenen Sockets bestimmen |
Bindung meldet Address not available |
konfigurierte lokale IP fehlt | Schnittstellen und Startreihenfolge |
| Docker-Port veröffentlicht, Anwendung nicht erreichbar | falscher Containerport oder Loopback-Bindung im Container | Listener innerhalb des Containers |
| Kubernetes-Service ohne Endpunkte | Selektor oder Readiness fehlerhaft | Pods und EndpointSlices |
Service-Port stimmt, targetPort falsch |
Weiterleitung auf falschen Pod-Port | Service-YAML und Pod-Listener |
| Host zeigt keinen Listener, NodePort funktioniert | regelbasierte Weiterleitung | Kubernetes- und Host-Netzwerkregeln |
nur localhost schlägt fehl |
IPv4-/IPv6-Auswahl oder Hosts-Auflösung | 127.0.0.1 und ::1 einzeln testen |
| nur einige Clients scheitern | Netzpfad, Adressfamilie oder Richtlinie | erfolgreiche und fehlerhafte Pfade vergleichen |
Typische Diagnosefehler
- TCP und UDP nicht unterscheiden.
- Einen UDP-Endpunkt als TCP-Listener interpretieren.
- Nur nach der Portnummer suchen und das Protokoll ignorieren.
-
0.0.0.0als verwendbare Zieladresse eines Clients behandeln. - Loopback-Bindung und Wildcard-Bindung gleichsetzen.
- Einen Listener als vollständigen Funktionsnachweis bewerten.
- Nur den Dienststatus prüfen.
- Den besitzenden Prozess nicht bestimmen.
- Prozess-ID aus einer alten Aufnahme verwenden.
- IPv4 und IPv6 nicht getrennt prüfen.
-
localhostals eindeutigen IPv4-Test behandeln. - Wildcard-Bindung automatisch als öffentliche Erreichbarkeit interpretieren.
- Öffentliche Erreichbarkeit allein durch lokale Socketlisten bewerten.
-
Test-NetConnection -Portals UDP-Test verwenden. - Einen offenen TCP-Port mit funktionierendem TLS oder HTTP gleichsetzen.
- Host- und Containerport verwechseln.
- Container-IP und Host-IP verwechseln.
- Den falschen Netzwerk-Namespace untersuchen.
-
EXPOSEmit einer Docker-Portveröffentlichung gleichsetzen. - Kubernetes-
containerPortals echten Listener interpretieren. -
port,targetPortundnodePortverwechseln. - Bei NodePort nur nach einem Benutzerprozess-Listener suchen.
- Einen Reverse Proxy und sein Backend als einen einzigen Endpunkt behandeln.
- Einen Portkonflikt durch wiederholte Neustarts verdecken.
- Einen Prozess beenden, bevor seine Funktion und Abhängigkeiten geklärt sind.
- Die Firewall vollständig deaktivieren.
- Breite Portscans ohne technische Notwendigkeit durchführen.
- Netzwerkaufzeichnungen unbegrenzt laufen lassen.
- Sensible Socket- oder Paketdaten ungeschützt speichern.
- Mehrere Konfigurationsvariablen gleichzeitig verändern.
- Nach der Maßnahme nur lokal testen.
- Temporäre Regeln und Diagnosewerkzeuge aktiv lassen.
Verifikation
Nach einer Maßnahme müssen mindestens folgende Punkte geprüft werden:
- der erwartete Prozess läuft;
- der Prozess besitzt den vorgesehenen Socket;
- das richtige Transportprotokoll wird verwendet;
- der richtige lokale Port ist gebunden;
- die richtige lokale Adresse ist gebunden;
- die Bindung existiert im richtigen Netzwerk-Namespace;
- keine unerwartete zusätzliche Bindung besteht;
- IPv4 funktioniert, sofern vorgesehen;
- IPv6 funktioniert, sofern vorgesehen;
- Loopback-Verhalten entspricht der Planung;
- konkrete Schnittstellenadressen funktionieren;
- lokale Firewallregeln entsprechen dem Sollzustand;
- NAT oder Portweiterleitung verwendet den richtigen Zielport;
- Docker-Host- und Containerport stimmen überein;
- Kubernetes-
portundtargetPortstimmen mit dem Pod-Listener überein; - EndpointSlices enthalten die vorgesehenen Backends;
- Reverse Proxy oder Load Balancer erreicht das Backend;
- ein repräsentativer entfernter Client kann den Endpunkt erreichen;
- das Anwendungsprotokoll liefert die erwartete Antwort;
- keine neuen Bindungs-, Prozess- oder Dienstfehler entstehen;
- temporäre Diagnoseänderungen wurden zurückgenommen;
- Sicherheitsauswirkungen der Bindung wurden geprüft;
- Ursache, Maßnahme und Prävention wurden dokumentiert.
Eine einzelne erfolgreiche lokale TCP-Verbindung ist keine ausreichende Gesamtverifikation.
Dokumentationsvorlage
Störung:
<exakte Beschreibung>
Zeitpunkt:
<Datum und Uhrzeit>
Betroffener Dienst:
<Dienst oder Anwendung>
Betroffener Host:
<Hostname und IP-Adresse>
Netzwerk-Namespace:
<Host, Container, Pod oder anderer Namespace>
Transportprotokoll:
<TCP oder UDP>
Erwartete Bindung:
<Adresse und Port>
Tatsächliche Bindung:
<Adresse und Port>
Prozess:
<Name, PID und Pfad>
Dienstzuordnung:
<Service, Container oder Pod>
Konfigurationsquelle:
<Datei, Startparameter, Variable oder Manifest>
Lokaler Test:
<Zieladresse, Port und Ergebnis>
Entfernter Test:
<Client, Zieladresse, Port und Ergebnis>
Anwendungsprotokolltest:
<Test und Ergebnis>
Firewall-, NAT- oder Proxyweg:
<Befund>
IPv4-Befund:
<Ergebnis>
IPv6-Befund:
<Ergebnis>
Nachgewiesene Ursache:
<technischer Befund>
Gegenbeweis ausgeschlossen durch:
<Test und Ergebnis>
Durchgeführte Maßnahme:
<genau beschriebene Änderung>
Risiko und Rückweg:
<Beschreibung>
Verifikation:
<identische Tests und Anwendungstest>
Prävention:
<Monitoring oder Konfigurationsverbesserung>
Checkliste
- exakte Fehlermeldung dokumentiert
- Zeitpunkt dokumentiert
- Anwendung oder Dienst bestimmt
- TCP und UDP unterschieden
- erwarteten Port bestimmt
- erwartete Bindungsadresse bestimmt
- erforderliche Erreichbarkeit bestimmt
- Host, Container und Pod unterschieden
- Netzwerk-Namespace bestimmt
- lokale IP-Adressen erfasst
- DNS-Zieladressen dokumentiert
- TCP-Listener geprüft
- UDP-Endpunkte bei Bedarf geprüft
- IPv4-Bindung geprüft
- IPv6-Bindung geprüft
- Loopback-Bindung geprüft
- Wildcard-Bindung geprüft
- Bindung an konkrete Adresse geprüft
- Prozess-ID bestimmt
- Prozessname und Pfad geprüft
- Dienstzuordnung geprüft
- Konfigurationsquelle bestimmt
- Startparameter und Umgebungsvariablen berücksichtigt
- Dienstprotokolle ausgewertet
- Portkonflikt ausgeschlossen
- Kernel- oder HTTP.sys-Zuordnung bei Bedarf geprüft
- Portproxy bei Bedarf geprüft
- lokalen Loopback-Test durchgeführt
- konkrete lokale Serveradresse getestet
- entfernten Clienttest durchgeführt
- Quell- und Zieladresse dokumentiert
- Firewallzustand berücksichtigt
- NAT und Portweiterleitung berücksichtigt
- Reverse Proxy berücksichtigt
- Load Balancer berücksichtigt
- Docker-Portzuordnung bei Bedarf geprüft
- Listener innerhalb des Containers geprüft
- Kubernetes-Service bei Bedarf geprüft
-
portundtargetPortverglichen - EndpointSlices geprüft
- tatsächlichen Pod-Listener geprüft
- Anwendungsprotokoll getestet
- UDP mit protokollspezifischem Werkzeug geprüft
- bei Bedarf Netzwerkaufzeichnung durchgeführt
- Aufzeichnung technisch und zeitlich begrenzt
- Hypothese formuliert
- Gegenbeweis festgelegt
- Risiko und Rückweg dokumentiert
- nur eine kontrollierte Änderung durchgeführt
- identische Tests wiederholt
- ursprüngliche Anwendung getestet
- repräsentative entfernte Clients geprüft
- temporäre Änderungen zurückgenommen
- Ursache und Prävention dokumentiert
Schnellreferenz
| Aufgabe | Befehl |
|---|---|
| Windows-TCP-Verbindungen | Get-NetTCPConnection |
| Windows-TCP-Listener | Get-NetTCPConnection -State Listen |
| Windows-Port prüfen | Get-NetTCPConnection -State Listen -LocalPort <Port> |
| Windows-UDP-Endpunkte | Get-NetUDPEndpoint |
| Windows-UDP-Port prüfen | Get-NetUDPEndpoint -LocalPort <Port> |
| Windows-Prozess prüfen | Get-Process -Id <PID> |
| Windows-Dienst zu PID | Get-CimInstance Win32_Service -Filter "ProcessId = <PID>" |
| Windows-netstat | netstat -ano |
| Windows-IP-Adressen | Get-NetIPAddress |
| Windows-TCP-Test | Test-NetConnection -ComputerName <Ziel> -Port <Port> |
| Windows-HTTP.sys-Zustand | netsh http show servicestate |
| Windows-URL-Reservierungen | netsh http show urlacl |
| Windows-Portproxy | netsh interface portproxy show all |
| Linux-TCP-Listener | sudo ss -lntp |
| Linux-UDP-Endpunkte | sudo ss -lnup |
| Linux-TCP-Port prüfen | sudo ss -lntp 'sport = :<Port>' |
| Linux-Socketübersicht | ss -s |
| Linux-Prozess zu TCP-Port | sudo lsof -nP -iTCP:<Port> -sTCP:LISTEN |
| Linux-Prozess zu UDP-Port | sudo lsof -nP -iUDP:<Port> |
| Linux-IP-Adressen | ip -brief address |
| Linux-Netzwerk-Namespaces | ip netns list |
| macOS-TCP-Listener | sudo lsof -nP -iTCP -sTCP:LISTEN |
| macOS-UDP-Endpunkte | sudo lsof -nP -iUDP |
| macOS-TCP-Sockets | netstat -anv -p tcp |
| Unix-Domain-Sockets Linux | sudo ss -lxnp |
| Unix-Domain-Sockets mit lsof | sudo lsof -U |
| TCP-Test Linux/macOS | nc -vz <Ziel> <Port> |
| HTTP-Test | curl -v http://<Ziel>:<Port>/ |
| HTTPS-Test mit Zieladresse | curl -v --resolve <Name>:<Port>:<IP> https://<Name>/ |
| TLS-Test mit SNI | openssl s_client -connect <IP>:<Port> -servername <Name> |
| Docker-Portübersicht | docker ps --format 'table {{.Names}}\t{{.Ports}}' |
| Docker-Portzuordnung | docker port <Container> |
| Docker-Netzwerkmodus | docker inspect <Container> --format '{{.HostConfig.NetworkMode}}' |
| Listener im Container | docker exec <Container> ss -lntup |
| Kubernetes-Services | kubectl get service --all-namespaces |
| Kubernetes-Service prüfen | kubectl describe service <Service> -n <Namespace> |
| Kubernetes-EndpointSlices | kubectl get endpointslice -n <Namespace> -l kubernetes.io/service-name=<Service> |
| Listener im Pod | kubectl exec -n <Namespace> <Pod> -- ss -lntup |
| begrenzte Linux-Aufzeichnung | sudo tcpdump -ni any 'tcp port <Port>' -c 100 |
Befehle und Maßnahmen, die nicht unkontrolliert als erste Diagnose verwendet werden dürfen
Stop-Process
taskkill
Stop-Service
Restart-Service
Set-NetFirewallRule
New-NetFirewallRule
Remove-NetFirewallRule
netsh advfirewall set allprofiles state off
kill
kill -9
systemctl stop
systemctl restart
iptables
nft
ufw disable
firewall-cmd --permanent
docker stop
docker restart
docker rm
kubectl delete
kubectl rollout restart
Änderung einer Wildcard- oder öffentlichen Bindung
Entfernen einer Portweiterleitung
vollständiges Deaktivieren einer Hostfirewall
Das Beenden eines Prozesses oder Neustarten eines Dienstes kann den aktuellen Portbesitz zwar verändern, vernichtet aber möglicherweise den für die Ursachenanalyse wichtigen Ausgangszustand.
Quellen
Offizielle Microsoft-Dokumentation
- Microsoft Learn – Get-NetTCPConnection
- Microsoft Learn – Get-NetUDPEndpoint
- Microsoft Learn – Test-NetConnection
- Microsoft Learn – netstat
- Microsoft Learn – Get-NetIPAddress
- Microsoft Learn – Get-NetFirewallRule
- Microsoft Learn – netsh http
- Microsoft Learn – netsh interface portproxy
Offizielle Linux- und Unix-Dokumentation
- Linux man-pages – ss(8)
- Linux man-pages – lsof(8)
- Linux man-pages – tcpdump(8)
- Linux man-pages – ip-netns(8)
- Linux man-pages – socket(7)
- Linux man-pages – tcp(7)
- Linux man-pages – udp(7)
Offizielle Docker-Dokumentation
- Docker Docs – Port publishing and mapping
- Docker Docs – Networking overview
- Docker Docs – docker container port
- Docker Docs – Bridge network driver
- Docker Docs – Host network driver
Offizielle Kubernetes-Dokumentation
- Kubernetes – Services, Load Balancing, and Networking
- Kubernetes – EndpointSlices
- Kubernetes API – Service
- Kubernetes – Network Policies
Standards und Register
- IANA – Service Name and Transport Protocol Port Number Registry
- RFC 6335 – Service Name and Transport Protocol Port Number Registry
- RFC 9293 – Transmission Control Protocol
- RFC 768 – User Datagram Protocol
- RFC 3493 – Basic Socket Interface Extensions for IPv6
Für diese Seite wurden keine Community-Berichte oder Social-Media-Aussagen als technische Nachweise verwendet.