Come verificare le porte aperte sul Mac: lsof, netstat e nc

Controlla le porte aperte sul Mac con lsof -i :3000, netstat e nc. Copre il controllo delle porte locali e il test degli host remoti, con esempi reali di output dei comandi.

Hai avviato rails server e non si carica nulla. O stai cercando di connetterti a un server remoto e non ricevi nulla in risposta. La prima domanda è sempre la stessa: la porta è effettivamente aperta?

Verificare lo stato delle porte sul Mac richiede un solo comando. Il trucco è sapere quale comando usare a seconda che tu stia controllando il tuo Mac o un host remoto.

Controllare le porte aperte del tuo Mac

Questo è il caso più comune per gli sviluppatori. Il tuo server di sviluppo dovrebbe essere in ascolto sulla porta 3000, ma il browser dice che non riesce a connettersi. La porta è in ascolto?

lsof -i :porta (la risposta rapida)

lsof -i :3000

Se qualcosa è in ascolto, vedrai un output simile a questo:

COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby     8421  aaron  13u  IPv4 0x3f8a2b4c      0t0  TCP *:3000 (LISTEN)

Se l’output è vuoto, nulla è associato a quella porta. Il tuo server Rails non è in esecuzione, o è partito su una porta diversa.

Per la porta 8080:

lsof -i :8080

Per la porta 80 (richiede sudo perché è una porta privilegiata):

sudo lsof -i :80

lsof -i | grep LISTEN (vedere tutto in una volta)

Per vedere tutte le porte su cui il tuo Mac è attualmente in ascolto:

lsof -i | grep LISTEN

L’output mostra ogni processo con una porta di ascolto aperta:

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)

Nota localhost:5432 rispetto a *:3000. Postgres accetta solo connessioni dalla stessa macchina. Rails accetta da qualsiasi punto della rete. Questa distinzione è importante quando provi a connetterti da un altro dispositivo.

Se vuoi porte numeriche senza ricerche dei nomi host (più veloce):

lsof -i -n -P | grep LISTEN

netstat -an | grep LISTEN

netstat fornisce una vista simile in un formato diverso:

netstat -an | grep LISTEN

L’output è simile a questo:

tcp4       0      0  *.3000                 *.*                    LISTEN
tcp4       0      0  127.0.0.1.5432         *.*                    LISTEN
tcp6       0      0  *.8080                 *.*                    LISTEN

L’indirizzo prima della porta indica l’interfaccia. *.3000 significa tutte le interfacce (accessibile dalla rete). 127.0.0.1.5432 significa solo localhost.

netstat è utile quando vuoi un elenco piatto rapido senza nomi dei processi. lsof è meglio quando hai bisogno di sapere quale app possiede quale porta.

Cosa significano i risultati

Qualcosa nell’output LISTEN: la porta è aperta e un processo la possiede. Se non riesci ancora a connetterti, il problema è altrove (firewall, IP errato, autenticazione).

Nessun output da lsof / nulla in netstat: nulla è in ascolto su quella porta. Il servizio non è in esecuzione o è partito su una porta diversa.

L’output mostra 127.0.0.1 o localhost: il servizio accetta solo connessioni locali. Non potrai raggiungerlo da un’altra macchina o dal tuo telefono sulla stessa rete.

Controllare la porta di un host remoto

Quando hai bisogno di verificare se una porta è aperta su un server che non controlli, non puoi usare lsof. Invece, provi effettivamente a connetterti e vedi cosa succede.

nc -zv (lo strumento giusto)

nc -zv hostname 443

Se la porta è aperta:

Connection to hostname port 443 [https] succeeded!

Se è chiusa (nulla in ascolto):

nc: connectx to hostname port 80 (tcp) failed: Connection refused

Se è filtrata (il firewall scarta i pacchetti):

nc: connectx to hostname port 25 (tcp) failed: Operation timed out

“Connection refused” significa che il server è raggiungibile ma nulla è su quella porta. “Timed out” significa che probabilmente un firewall sta scartando i tuoi pacchetti prima che arrivino.

Esempi reali:

# HTTPS funziona sul mio server?
nc -zv myserver.com 443

# SSH è aperto su questa macchina?
nc -zv 192.168.1.100 22

# Posso raggiungere la porta del database da questa macchina?
nc -zv db.internal 5432

Puoi anche controllare più porte contemporaneamente:

nc -zv hostname 80 443 8080

Interpretare i risultati

Risultato Significato
Connection succeeded La porta è aperta, qualcosa è in ascolto
Connection refused La porta è chiusa, nulla in ascolto
Operation timed out Il firewall sta bloccando la connessione
Name or service not known Il nome host non si risolve (problema DNS)

Se una porta riesce ma il tuo servizio non funziona ancora, il problema è a livello applicativo: credenziali errate, mancata corrispondenza del protocollo, l’app che rifiuta la connessione.

Porte comuni da controllare

Quando fai debug, queste sono le porte che compaiono più spesso:

  • 22 (SSH): Non riesci a fare SSH? Controlla questa per prima.
  • 80 (HTTP) e 443 (HTTPS): Il web server non risponde.
  • 3000, 3001, 8000, 8080: Porte comuni dei server di sviluppo. Rails usa 3000 per impostazione predefinita, molte app Node usano 8080.
  • 5432 (PostgreSQL), 3306 (MySQL), 27017 (MongoDB): Problemi di connessione al database.
  • 25 (SMTP): L’app non riesce a inviare email? Spesso bloccata da ISP e provider cloud.

Sicurezza: quali porte sta esponendo il tuo Mac?

Eseguire lsof -i | grep LISTEN vale la pena farlo di tanto in tanto dal punto di vista della sicurezza. Ogni porta in ascolto è un potenziale punto di ingresso. Su un laptop, di solito vuoi vedere il minor numero possibile di porte aperte.

Responsabili comuni di porte aperte inaspettate:

  • Server di sviluppo lasciati in esecuzione (Rails, Node, Webpack)
  • Docker che mappa le porte sull’host
  • Desktop remoto o Condivisione schermo abilitati
  • Ricevitore AirPlay
  • App di terze parti che eseguono servizi in background

Se vedi qualcosa che non riconosci, prendi il PID dall’output di lsof e cercalo:

ps aux | grep <PID>

Usare il firewall di macOS

Il firewall di macOS controlla cosa può connettersi al tuo Mac dall’esterno. Controllalo in Impostazioni di Sistema > Rete > Firewall (o Impostazioni di Sistema > Privacy e sicurezza > Firewall su alcune versioni).

Quando il firewall è attivo, le altre macchine non possono raggiungere i servizi in ascolto sul tuo Mac a meno che tu non li abbia esplicitamente autorizzati. Il tuo Mac può ancora fare connessioni in uscita.

Se il tuo server di sviluppo locale si carica bene nel tuo browser ma non dal tuo telefono sulla stessa rete, il firewall è probabilmente la causa.

Opzione GUI: lo scanner porte di NetUtil

Se preferisci non digitare comandi, NetUtil include uno scanner porte. Inserisci un nome host e un intervallo di porte, e mostra quali porte sono aperte in una tabella. È il sostituto diretto dello scanner porte che era in Network Utility di Apple prima che venisse rimosso in macOS Monterey.

Per il debug regolare, i comandi Terminale sono più veloci una volta che li conosci. lsof -i :3000 sono pochi tasti da premere dopo averlo fatto qualche volta. Per controlli occasionali o quando vuoi scansionare un intervallo di porte su un server remoto, uno strumento GUI fa risparmiare tempo.

Riferimento rapido

Verifica se il tuo Mac è in ascolto su una porta specifica:

lsof -i :3000

Visualizza tutte le porte su cui il tuo Mac è in ascolto:

lsof -i | grep LISTEN

Lo stesso con netstat:

netstat -an | grep LISTEN

Verifica se una porta remota è aperta:

nc -zv hostname 443

Lo stato delle porte sul tuo Mac dice se un servizio è in esecuzione. Lo stato delle porte su un host remoto dice se quel servizio è raggiungibile. Due domande diverse, due strumenti diversi.