Comment vérifier les ports ouverts sur Mac : lsof, netstat et nc

Vérifiez les ports ouverts sur Mac avec lsof -i :3000, netstat et nc. Couvre la vérification des ports locaux et le test d'hôtes distants, avec des exemples de sortie de commandes réelles.

Vous avez lancé rails server et rien ne se charge. Ou vous essayez de vous connecter à un serveur distant et n’obtenez aucune réponse. La première question est toujours la même : le port est-il réellement ouvert ?

Vérifier l’état d’un port sur Mac ne nécessite qu’une seule commande. L’astuce est de savoir quelle commande utiliser selon que vous vérifiez votre propre Mac ou un hôte distant.

Vérifier les ports ouverts de votre Mac

C’est le cas le plus courant pour les développeurs. Votre serveur de développement devrait écouter sur le port 3000, mais le navigateur indique qu’il ne peut pas se connecter. Le port est-il seulement en écoute ?

lsof -i :port (la réponse rapide)

lsof -i :3000

Si quelque chose est en écoute, vous verrez une sortie comme celle-ci :

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

Si la sortie est vide, rien n’est lié à ce port. Votre serveur Rails ne fonctionne pas, ou il a démarré sur un port différent.

Pour le port 8080 :

lsof -i :8080

Pour le port 80 (nécessite sudo car c’est un port privilégié) :

sudo lsof -i :80

lsof -i | grep LISTEN (voir tout à la fois)

Pour voir tous les ports sur lesquels votre Mac écoute actuellement :

lsof -i | grep LISTEN

La sortie montre chaque processus avec un port d’écoute ouvert :

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)

Notez localhost:5432 vs *:3000. Postgres n’accepte que les connexions depuis la même machine. Rails accepte depuis n’importe où sur le réseau. Cette distinction est importante lorsque vous essayez de vous connecter depuis un autre appareil.

Si vous voulez des ports numériques sans résolution de noms d’hôtes (plus rapide) :

lsof -i -n -P | grep LISTEN

netstat -an | grep LISTEN

netstat donne une vue similaire dans un format différent :

netstat -an | grep LISTEN

La sortie ressemble à ceci :

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

L’adresse avant le port vous indique l’interface. *.3000 signifie toutes les interfaces (accessible depuis le réseau). 127.0.0.1.5432 signifie localhost uniquement.

netstat est utile quand vous voulez une liste simple sans noms de processus. lsof est préférable quand vous avez besoin de savoir quelle application possède quel port.

Ce que signifient les résultats

Quelque chose dans la sortie LISTEN : Le port est ouvert et un processus en est propriétaire. Si vous ne pouvez toujours pas vous connecter, le problème est ailleurs (pare-feu, mauvaise IP, authentification).

Aucune sortie de lsof / rien dans netstat : Rien n’écoute sur ce port. Le service ne fonctionne pas ou a démarré sur un port différent.

La sortie affiche 127.0.0.1 ou localhost : Le service n’accepte que les connexions locales. Vous ne pourrez pas l’atteindre depuis une autre machine ou votre téléphone sur le même réseau.

Vérifier le port d’un hôte distant

Lorsque vous devez tester si un port est ouvert sur un serveur que vous ne contrôlez pas, vous ne pouvez pas utiliser lsof. À la place, vous essayez réellement de vous connecter et observez ce qui se passe.

nc -zv (le bon outil)

nc -zv hostname 443

Si le port est ouvert :

Connection to hostname port 443 [https] succeeded!

S’il est fermé (rien n’écoute) :

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

S’il est filtré (pare-feu bloquant les paquets) :

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

« Connection refused » signifie que le serveur est joignable mais que rien n’est sur ce port. « Timed out » signifie qu’un pare-feu bloque probablement vos paquets avant qu’ils n’arrivent.

Exemples concrets :

# HTTPS fonctionne-t-il sur mon serveur ?
nc -zv myserver.com 443

# SSH est-il ouvert sur cette machine ?
nc -zv 192.168.1.100 22

# Puis-je atteindre le port de la base de données depuis cette machine ?
nc -zv db.internal 5432

Vous pouvez également vérifier plusieurs ports à la fois :

nc -zv hostname 80 443 8080

Interpréter les résultats

Résultat Signification
Connection succeeded Le port est ouvert, quelque chose écoute
Connection refused Le port est fermé, rien n’écoute
Operation timed out Un pare-feu bloque la connexion
Name or service not known Le nom d’hôte ne se résout pas (problème DNS)

Si un port réussit mais votre service ne fonctionne toujours pas, le problème se situe au niveau de la couche application : mauvaises informations d’identification, incompatibilité de protocole, application qui rejette la connexion.

Ports courants à vérifier

Lors du débogage, ces ports reviennent le plus souvent :

  • 22 (SSH) : Impossible de se connecter en SSH ? Vérifiez ceci en premier.
  • 80 (HTTP) et 443 (HTTPS) : Le serveur web ne répond pas.
  • 3000, 3001, 8000, 8080 : Ports de serveur de développement courants. Rails utilise 3000 par défaut, de nombreuses applications Node utilisent 8080.
  • 5432 (PostgreSQL), 3306 (MySQL), 27017 (MongoDB) : Problèmes de connexion à la base de données.
  • 25 (SMTP) : L’application ne peut pas envoyer d’e-mails ? Souvent bloqué par les FAI et les fournisseurs cloud.

Sécurité : quels ports votre Mac expose-t-il ?

Exécuter lsof -i | grep LISTEN vaut la peine d’être fait occasionnellement d’un point de vue sécurité. Chaque port en écoute est un point d’entrée potentiel. Sur un ordinateur portable, vous souhaitez généralement voir aussi peu de ports ouverts que possible.

Causes courantes de ports ouverts inattendus :

  • Serveurs de développement laissés en cours d’exécution (Rails, Node, Webpack)
  • Docker mappant des ports vers l’hôte
  • Bureau à distance ou Partage d’écran activé
  • Récepteur AirPlay
  • Applications tierces exécutant des services en arrière-plan

Si vous voyez quelque chose que vous ne reconnaissez pas, récupérez le PID dans la sortie de lsof et recherchez-le :

ps aux | grep <PID>

Utiliser le pare-feu macOS

Le pare-feu macOS contrôle ce qui peut se connecter à votre Mac depuis l’extérieur. Vérifiez-le dans Réglages Système > Réseau > Pare-feu (ou Réglages Système > Confidentialité et sécurité > Pare-feu sur certaines versions).

Lorsque le pare-feu est activé, les autres machines ne peuvent pas atteindre les services en écoute sur votre Mac, sauf si vous les avez explicitement autorisés. Votre Mac peut toujours établir des connexions sortantes.

Si votre serveur de développement local se charge correctement dans votre navigateur mais pas depuis votre téléphone sur le même réseau, le pare-feu en est probablement la cause.

Option graphique : le scanner de ports de NetUtil

Si vous préférez ne pas saisir de commandes, NetUtil inclut un scanner de ports. Entrez un nom d’hôte et une plage de ports, et il affiche les ports ouverts dans un tableau. C’est le remplacement direct du scanner de ports qui se trouvait dans le Network Utility d’Apple avant qu’il ne soit supprimé dans macOS Monterey.

Pour le débogage régulier, les commandes Terminal sont plus rapides une fois que vous les connaissez. lsof -i :3000 s’écrit en quatre frappes une fois que vous l’avez fait plusieurs fois. Pour les vérifications occasionnelles ou lorsque vous souhaitez scanner une plage de ports sur un serveur distant, un outil graphique fait gagner du temps.

Référence rapide

Vérifier si votre Mac écoute sur un port spécifique :

lsof -i :3000

Voir tous les ports sur lesquels votre Mac écoute :

lsof -i | grep LISTEN

Idem avec netstat :

netstat -an | grep LISTEN

Vérifier si un port distant est ouvert :

nc -zv hostname 443

L’état d’un port sur votre Mac vous indique si un service fonctionne. L’état d’un port sur un hôte distant vous indique si ce service est joignable. Deux questions différentes, deux outils différents.