Offene Ports auf dem Mac prüfen: lsof, netstat und nc
Offene Ports auf dem Mac mit lsof -i :3000, netstat und nc prüfen. Erklärt lokale Port-Überprüfung und Tests auf Remote-Hosts, mit echten Befehlsausgaben.
Sie haben rails server gestartet und nichts lädt. Oder Sie versuchen, sich mit einem Remote-Server zu verbinden und erhalten keine Antwort. Die erste Frage ist immer dieselbe: Ist der Port überhaupt offen?
Den Port-Status auf dem Mac zu prüfen erfordert einen Befehl. Der Trick besteht darin, zu wissen, welchen Befehl man je nach Situation verwendet – ob man den eigenen Mac oder einen Remote-Host prüft.
Offene Ports auf dem eigenen Mac prüfen
Das ist der häufigste Fall für Entwickler. Ihr Entwicklungsserver sollte auf Port 3000 laufen, aber der Browser sagt, dass keine Verbindung möglich ist. Hört der Port überhaupt zu?
lsof -i :port (die schnelle Antwort)
lsof -i :3000
Wenn etwas lauscht, sehen Sie eine Ausgabe wie diese:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 8421 aaron 13u IPv4 0x3f8a2b4c 0t0 TCP *:3000 (LISTEN)
Wenn die Ausgabe leer ist, ist nichts an diesem Port gebunden. Ihr Rails-Server läuft nicht oder wurde auf einem anderen Port gestartet.
Für Port 8080:
lsof -i :8080
Für Port 80 (erfordert sudo, da es ein privilegierter Port ist):
sudo lsof -i :80
lsof -i | grep LISTEN (alles auf einmal sehen)
Um alle Ports zu sehen, auf denen Ihr Mac aktuell lauscht:
lsof -i | grep LISTEN
Die Ausgabe zeigt jeden Prozess mit einem offenen lauschenden Port:
ruby 8421 aaron 13u IPv4 TCP *:3000 (LISTEN)
node 9102 aaron 21u IPv6 TCP *:8080 (LISTEN)
postgres 1234 aaron 5u IPv4 TCP localhost:5432 (LISTEN)
Beachten Sie localhost:5432 gegenüber *:3000. Postgres akzeptiert nur Verbindungen von derselben Maschine. Rails akzeptiert Verbindungen von überall im Netzwerk. Diese Unterscheidung ist wichtig, wenn Sie versuchen, von einem anderen Gerät aus zu verbinden.
Wenn Sie numerische Ports ohne Hostname-Lookups möchten (schneller):
lsof -i -n -P | grep LISTEN
netstat -an | grep LISTEN
netstat gibt Ihnen eine ähnliche Ansicht in einem anderen Format:
netstat -an | grep LISTEN
Die Ausgabe sieht so aus:
tcp4 0 0 *.3000 *.* LISTEN
tcp4 0 0 127.0.0.1.5432 *.* LISTEN
tcp6 0 0 *.8080 *.* LISTEN
Die Adresse vor dem Port gibt Ihnen die Schnittstelle an. *.3000 bedeutet alle Schnittstellen (über das Netzwerk erreichbar). 127.0.0.1.5432 bedeutet nur localhost.
netstat ist nützlich, wenn Sie eine schnelle flache Liste ohne Prozessnamen möchten. lsof ist besser, wenn Sie wissen müssen, welche App welchen Port besitzt.
Was die Ergebnisse bedeuten
Etwas in der LISTEN-Ausgabe: Der Port ist offen und ein Prozess besitzt ihn. Wenn Sie immer noch keine Verbindung herstellen können, liegt das Problem woanders (Firewall, falsche IP, Authentifizierung).
Keine Ausgabe von lsof / nichts in netstat: Nichts lauscht auf diesem Port. Der Dienst läuft entweder nicht oder wurde auf einem anderen Port gestartet.
Ausgabe zeigt 127.0.0.1 oder localhost: Der Dienst akzeptiert nur lokale Verbindungen. Sie können von einem anderen Gerät oder Ihrem Telefon im selben Netzwerk nicht darauf zugreifen.
Den Port eines Remote-Hosts prüfen
Wenn Sie testen müssen, ob ein Port auf einem Server geöffnet ist, den Sie nicht kontrollieren, können Sie lsof nicht verwenden. Stattdessen versuchen Sie tatsächlich eine Verbindung herzustellen und schauen, was passiert.
nc -zv (das richtige Tool)
nc -zv hostname 443
Wenn der Port offen ist:
Connection to hostname port 443 [https] succeeded!
Wenn er geschlossen ist (nichts lauscht):
nc: connectx to hostname port 80 (tcp) failed: Connection refused
Wenn er gefiltert wird (Firewall verwirft Pakete):
nc: connectx to hostname port 25 (tcp) failed: Operation timed out
„Connection refused" bedeutet, dass der Server erreichbar ist, aber nichts auf diesem Port läuft. „Timed out" bedeutet, dass eine Firewall Ihre Pakete wahrscheinlich verwirft, bevor sie ankommen.
Praxisbeispiele:
# Funktioniert HTTPS auf meinem Server?
nc -zv myserver.com 443
# Ist SSH auf diesem Rechner offen?
nc -zv 192.168.1.100 22
# Kann ich den Datenbankport von dieser Maschine aus erreichen?
nc -zv db.internal 5432
Sie können auch mehrere Ports gleichzeitig prüfen:
nc -zv hostname 80 443 8080
Ergebnisse interpretieren
| Ergebnis | Bedeutung |
|---|---|
| Connection succeeded | Port ist offen, etwas lauscht |
| Connection refused | Port ist geschlossen, nichts lauscht |
| Operation timed out | Firewall blockiert die Verbindung |
| Name or service not known | Hostname lässt sich nicht auflösen (DNS-Problem) |
Wenn ein Port erfolgreich ist, Ihr Dienst aber trotzdem nicht funktioniert, liegt das Problem auf der Anwendungsebene: falsche Anmeldedaten, Protokoll-Inkompatibilität, die App lehnt die Verbindung ab.
Häufig zu prüfende Ports
Beim Debuggen sind dies die Ports, die am häufigsten vorkommen:
- 22 (SSH): Kann keine SSH-Verbindung herstellen? Prüfen Sie diesen zuerst.
- 80 (HTTP) und 443 (HTTPS): Webserver antwortet nicht.
- 3000, 3001, 8000, 8080: Häufige Entwicklungsserver-Ports. Rails verwendet standardmäßig 3000, viele Node-Apps verwenden 8080.
- 5432 (PostgreSQL), 3306 (MySQL), 27017 (MongoDB): Datenbankverbindungsprobleme.
- 25 (SMTP): App kann keine E-Mails senden? Oft von Internetanbietern und Cloud-Anbietern blockiert.
Sicherheit: Welche Ports legt Ihr Mac offen?
lsof -i | grep LISTEN gelegentlich aus Sicherheitsgründen auszuführen ist empfehlenswert. Jeder lauschende Port ist ein potenzieller Einstiegspunkt. Auf einem Laptop möchten Sie in der Regel so wenige offene Ports wie möglich sehen.
Häufige Ursachen für unerwartete offene Ports:
- Laufende Entwicklungsserver (Rails, Node, Webpack)
- Docker, das Ports auf den Host mappt
- Aktivierter Remote-Zugriff oder Bildschirmfreigabe
- AirPlay-Empfänger
- Drittanbieter-Apps mit Hintergrunddiensten
Wenn Sie etwas nicht erkennen, nehmen Sie die PID aus der lsof-Ausgabe und schauen Sie nach:
ps aux | grep <PID>
Die macOS-Firewall nutzen
Die macOS-Firewall steuert, was sich von außen mit Ihrem Mac verbinden kann. Prüfen Sie sie unter Systemeinstellungen > Netzwerk > Firewall (oder Systemeinstellungen > Datenschutz & Sicherheit > Firewall in manchen Versionen).
Wenn die Firewall aktiv ist, können andere Maschinen keine lauschenden Dienste auf Ihrem Mac erreichen, es sei denn, Sie haben diese ausdrücklich erlaubt. Ihr Mac kann weiterhin ausgehende Verbindungen herstellen.
Wenn Ihr lokaler Entwicklungsserver in Ihrem Browser gut lädt, aber nicht von Ihrem Telefon im selben Netzwerk, ist die Firewall wahrscheinlich der Grund.
GUI-Option: NetUtils Port-Scanner
Wenn Sie lieber keine Befehle eingeben möchten, enthält NetUtil einen Port-Scanner. Geben Sie einen Hostnamen und einen Port-Bereich ein, und er zeigt an, welche Ports offen sind – in einer übersichtlichen Tabelle. Er ist der direkte Ersatz für den Port-Scanner, der früher in Apples Network Utility enthalten war, bevor er in macOS Monterey entfernt wurde.
Für regelmäßiges Debuggen sind die Terminal-Befehle schneller, wenn man sie einmal kennt. lsof -i :3000 sind vier Tastenanschläge, wenn man es ein paar Mal gemacht hat. Für gelegentliche Prüfungen oder wenn Sie einen Port-Bereich auf einem Remote-Server scannen möchten, spart ein GUI-Tool Zeit.
Kurzreferenz
Prüfen, ob Ihr Mac auf einem bestimmten Port lauscht:
lsof -i :3000
Alle Ports sehen, auf denen Ihr Mac lauscht:
lsof -i | grep LISTEN
Dasselbe mit netstat:
netstat -an | grep LISTEN
Prüfen, ob ein Remote-Port offen ist:
nc -zv hostname 443
Der Port-Status auf Ihrem Mac sagt Ihnen, ob ein Dienst läuft. Der Port-Status auf einem Remote-Host sagt Ihnen, ob dieser Dienst erreichbar ist. Zwei verschiedene Fragen, zwei verschiedene Tools.