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.