Ports Linux : comprendre les services en écoute
Comprenez les ports TCP et UDP, puis utilisez ss pour voir les services en écoute et distinguer un port local d’un port exposé publiquement.
Ce qu’est réellement un port
Un port est un numéro qui permet à un serveur d’exécuter plusieurs services simultanément sans mélanger leur trafic. Votre VPS possède une adresse IP, mais il peut exécuter en même temps un serveur web, un serveur SSH et une base de données. Lorsqu’un paquet arrive, le système d’exploitation doit déterminer à quel service il est destiné. Le numéro de port fournit cette information. Le trafic web arrive sur le port 443 et SSH sur le port 22. L’adresse IP achemine le paquet jusqu’à votre serveur ; le port l’achemine jusqu’au bon programme sur ce serveur.
Un port est un nombre codé sur 16 bits : 16 bits permettent de représenter les valeurs de 0 à 65535, et 0 est réservé. En pratique, les ports vont donc de 1 à 65535. Les ports inférieurs à 1024 sont les ports « bien connus » et leur ouverture nécessite root. C’est pourquoi les services standard les utilisent : 22 pour SSH, 80 pour HTTP, 443 pour HTTPS et 53 pour DNS. Les programmes ordinaires peuvent utiliser librement les ports supérieurs à 1024.
Il existe deux types de ports : TCP et UDP. Un numéro de port TCP est distinct du même numéro en UDP. TCP est le protocole orienté connexion utilisé par la plupart des services, notamment SSH, HTTP et les bases de données. UDP est sans connexion et sert notamment à DNS et à certains VPN. Lorsque vous ouvrez un port dans un pare-feu, vous indiquez généralement le protocole concerné, par exemple 22/tcp.
Écouter signifie qu’un programme attend sur un port
Un programme qui doit recevoir des connexions demande au noyau d’« écouter » sur un port. À partir de ce moment, le port est ouvert sur la machine et le programme répond à tout ce qui y arrive, sous réserve des règles du pare-feu. Un port sur lequel aucun programme n’écoute refuse simplement les connexions. La première question à poser lors de tout contrôle de sécurité est donc la suivante : qu’est-ce qui écoute, et où ?
La commande qui permet de le vérifier est ss :
sudo ss -tlnpLes options indiquent qu’il s’agit de TCP (t), qu’il faut afficher uniquement les sockets en écoute (l), utiliser des ports numériques (n, pour afficher 22 et non ssh), et afficher le processus propriétaire (p). Exemple de résultat :
State Recv-Q Local Address:Port Process
LISTEN 0 0.0.0.0:22 sshd
LISTEN 0 127.0.0.1:5432 postgres
LISTEN 0 [::]:80 nginxLa colonne Process indique quel programme possède chaque port. Elle permet d’identifier un service que vous n’aviez pas prévu de laisser actif.
La colonne Local Address est la partie importante
Lisez attentivement l’adresse indiquée devant chaque port, car elle détermine qui peut atteindre le service. Vous rencontrerez constamment trois cas.
0.0.0.0:22 signifie « écouter sur toutes les adresses IPv4 de cette machine », y compris son adresse publique. Le service est alors accessible depuis Internet en IPv4, si le pare-feu l’autorise.
[::]:80 signifie la même chose pour IPv6 : écouter sur toutes les adresses IPv6, y compris les adresses publiques. De nombreux programmes s’y attachent par défaut et, sous Linux, un socket :: accepte souvent aussi les connexions IPv4.
127.0.0.1:5432 signifie « écouter uniquement sur la boucle locale ». 127.0.0.1 est l’adresse qu’une machine utilise pour communiquer avec elle-même. Elle n’est pas routable depuis un autre emplacement. Un service attaché à cette adresse est accessible uniquement depuis le même serveur, jamais depuis Internet, quelles que soient les règles du pare-feu. La ligne Postgres ci-dessus est sûre par construction.
La règle pratique en découle directement : une base de données, un cache ou un panneau d’administration utilisé uniquement par vos propres applications doit écouter sur 127.0.0.1, et non sur 0.0.0.0. S’il n’écoute jamais sur une adresse publique, un attaquant n’a rien à atteindre.
L’écoute ne signifie pas que le service est accessible
Une dernière distinction évite beaucoup de confusion. Un port ouvert sur la machine, c’est-à-dire lorsqu’un programme est en écoute, n’est pas nécessairement accessible depuis l’extérieur, car le pare-feu peut bloquer ce port. Les deux conditions doivent être réunies pour qu’un client distant puisse se connecter. Les deux échecs se présentent d’ailleurs différemment côté client : une connexion refusée signifie qu’aucun programme n’était en écoute, tandis qu’une connexion qui reste bloquée avant d’expirer indique généralement que le pare-feu a abandonné le paquet. C’est exactement ce que signifient ces deux erreurs SSH.
Il existe donc deux niveaux de contrôle. Vous choisissez les services qui écoutent en configurant l’adresse d’écoute de chacun. Vous choisissez ensuite ce que le réseau extérieur peut atteindre avec un pare-feu. Un serveur correctement administré utilise les deux : les services écoutent uniquement sur les interfaces nécessaires, et le pare-feu refuse tout ce que vous n’avez pas explicitement autorisé. Vérifier les ports en écoute avec ss est la première étape ; déterminer ce que le pare-feu autorise est la deuxième, présentée dans les bases des pare-feu avec UFW.
Un point subtil pose souvent problème. IPv4 et IPv6 sont distincts, et un pare-feu qui ne couvre qu’IPv4 laisse les services [::] ouverts sur IPv6. Ce piège spécifique fait l’objet d’un article dédié : le piège du pare-feu IPv6.
FAQ
Comment voir les ports ouverts sur mon serveur Linux ?
Exécutez sudo ss -tlnp pour TCP ou sudo ss -ulnp pour UDP. Cette commande liste chaque socket en écoute, le port, l’adresse locale à laquelle il est lié et le processus qui l’utilise. Consultez la colonne Local Address : 0.0.0.0 ou [::] signifie que le service est exposé au réseau, tandis que 127.0.0.1 signifie qu’il écoute uniquement sur la machine elle-même.
Quelle est la différence entre 0.0.0.0 et 127.0.0.1 ?
0.0.0.0 signifie « écouter sur toutes les adresses IPv4 », y compris l’adresse publique. Le service peut donc être accessible depuis le réseau. 127.0.0.1 est l’adresse de loopback que la machine utilise pour communiquer avec elle-même. Elle n’est pas routable depuis l’extérieur. Un service lié à cette adresse est donc accessible uniquement en local. Liez les services internes à 127.0.0.1 afin qu’ils ne soient jamais exposés.
Dois-je ouvrir un port dans le pare-feu pour qu’un service fonctionne ?
Uniquement pour les services qui doivent être accessibles depuis d’autres machines. Un service lié à 127.0.0.1 n’a besoin d’aucune règle de pare-feu, car aucun accès externe n’est possible. Un service sur 0.0.0.0 ou [::] nécessite une règle de pare-feu pour autoriser le trafic. Il doit être refusé par défaut jusqu’à l’ajout de cette règle.
Quelle est la différence entre un port TCP et un port UDP ?
TCP est basé sur une connexion et est utilisé par la plupart des services, notamment SSH, les serveurs web et les bases de données. UDP est sans connexion et est utilisé par DNS et certains VPN. Un même numéro en TCP et en UDP correspond à deux ports distincts. Ainsi, 53/tcp et 53/udp sont différents. Lorsque vous écrivez des règles de pare-feu, indiquez le protocole, par exemple 22/tcp.