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.