09/01/2025

Astuces

Réseau : lister les ports en écoute sous Linux avec lsof, netstat et ss

I. Présentation

Comment identifier les ports ouverts sur une machine Linux ? Voici la question à laquelle nous allons répondre ! Pour atteindre cet objectif, nous allons utiliser trois commandes différentes : lsof, netstat et ss.

Voici deux scénarios qui peuvent nous amener à effectuer cette vérification :

  • Vous venez d'installer un nouveau service sur un serveur Linux et vous souhaitez vérifier s'il est bien en écoute sur un port spécifique. Par exemple, vous venez d'installer un serveur Web Apache2 et vous souhaitez voir s'il est bien en écoute sur le port 80.
  • Vous souhaitez identifier les ports ouverts pour connaître les services actifs, mais aussi les portes d'entrées potentielles pour un attaquant. En effet, chaque port ouvert augmente la surface d'attaque de la machine, ce qui peut intéresser un potentiel attaquant.

Dans la suite de cet article, nous verrons comment les commandes lsof, netstat et ss peuvent vous aider pour lister et de surveiller les ports ouverts sur Linux, avec différents exemples. En ce qui me concerne, j'utilise une machine Debian, mais cela fonctionne sur les autres distributions.

Remarque : vous devez disposer d'un accès root ou d'un accès délégué via sudo sur votre machine, pour suivre ce tutoriel.

II. Utiliser lsof pour lister les ports en écoute

La commande lsof, qui signifie "list open files", alors, vous allez me dire quel est le rapport avec ce que l'on cherche à faire... Sachez que cette commande permet de visualiser les fichiers ouverts par les processus en cours. Comme les sockets réseau sont traités comme des fichiers sous Linux, la commande lsof peut être utilisée pour identifier les ports ouverts et les programmes qui les utilisent.

Ouvrez un terminal et exécutez la commande suivante :

sudo lsof -nP -iTCP -sTCP:LISTEN

Quelques explications quant à la syntaxe de cette commande :

  • -nP : désactive la résolution des noms d’hôte et la traduction des noms de ports (affiche 22 au lieu de SSH)
  • -iTCP -sTCP:LISTEN : filtre les connexions réseau pour n’afficher que celles utilisant le protocole TCP, avec un état de connexion "LISTEN. Cela évite d'afficher les connexions actives, afin de voir uniquement les ports en écoute.

Le résultat contient plusieurs lignes. La première colonne nommée "COMMAND" indique le nom du service associé, "USER" indique le nom du compte associé. Tandis qu'à la fin de la ligne, nous avons l'adresse IP sur laquelle l'hôte est en écoute et le numéro de port. Par exemple, nous pouvons voir que cette machine écoute sur le port 22 (SSH) en IPv4 et IPv6. Elle écoute également sur le port 8080, pour le service Stork Server.

Elle est aussi en écoute pour le service de base de données PostgreSQL, sur le port 5432, mais uniquement pour les connexions locales puisqu'il est précisé "127.0.0.1:5432" (ainsi que "::1" pour IPv6). Quand il y a un astérisque "*", cela veut dire que la machine écoute sur toutes ses adresses IP pour le port spécifié : le service est donc accessible à distance, via le réseau.

Si vous souhaitez effectuer cette action pour vérifier si un port spécifique est en écoute, sans être pollué par le reste, utilisez cette syntaxe :

sudo lsof -nP -i:<numéro de port>
# Exemple pour le port 8080
sudo lsof -nP -i:8080

Dans ce cas, nous obtenons une seule ligne correspondante à notre recherche :

COMMAND   PID         USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
stork-ser 870 stork-server    6u  IPv6  24237      0t0  TCP *:8080 (LISTEN)

Enfin, pour les connexions en UDP, vous pouvez utiliser :

sudo lsof -iUDP

III. Utiliser netstat pour lister les ports en écoute

Netstat, qui signifie "network statistics", est un outil populaire et très intéressant pour obtenir des informations sur les connexions réseau. Grâce à sa multitude d'options, nous pouvons l'utiliser pour identifier les ports TCP et UDP sur lesquels notre machine Linux est en écoute. Il indiquera aussi les services associés.

Si votre distribution n'a pas netstat, ce qui est le cas de Debian 12, vous devez installer le paquet "net-tools" pour en bénéficier. S'il n'est pas installé, c'est parce qu'il est considéré comme obsolète, malgré sa forte popularité.

sudo apt update
sudo apt install net-tools -y

Pour afficher tous les ports ouverts, vous pouvez exécuter :

sudo netstat -tulnp

Si nous décortiquons cette commande, nous obtenons :

  • -t : affiche les connexions TCP.
  • -u : affiche les connexions UDP.
  • -l : liste les ports en écoute (état listening).
  • -n : force l’affichage des adresses et des ports en format numérique (pas de traduction)
  • -p : affiche le PID et le nom du processus.

Le résultat retourné contient plusieurs colonnes, notamment celle nommée "Adresse locale". Elle contient le numéro de port sur lequel la machine écoute, ainsi que l'adresse IP associée. Il peut s'agir d'une écoute en local uniquement (127.0.0.1), sur toutes les adresses IPv6 de l'hôte (::), sur toutes les adresses IPv4 de l'hôte (0.0.0.0) ou sur une adresse IP spécifique.

La colonne "Proto" indique s'il s'agit de TCP ou de l'UDP, en IPv4 ou IPv6 (via l'ajout du "6" dans le nom du protocole), tandis que la colonne "PID/Program name" indique le PID du processus et le nom associé. Ici, nous pouvons identifier plusieurs services en écoute, dont SSH, Stork Server et PostgreSQL (uniquement en local).

Afficher les ports en écoute avec netstat - Linux

À l'aide de "grep", nous pouvons filtrer les résultats, par exemple, sur un numéro de port, comme ici avec le port "8080" :

sudo netstat -tulnp | grep :8080

Une seule ligne est alors retournée :

tcp6       0      0 :::8080                 :::*                    LISTEN      870/stork-server

IV. Lister les ports en écoute avec ss

La commande ss, dont le nom signifie "socket statistics", est une version plus moderne et plus rapide de l'outil netstat. Elle va donc nous permettre d'obtenir des informations sur les connexions réseau. La transition de netstat à ss est facile puisqu'il y a les mêmes options.

Ainsi, nous pouvons reprendre l'exemple précédent, en modifiant simplement le nom de la commande :

sudo ss -tulnp

La sortie est légèrement différente, mais on s'y retrouve assez facilement ! Ici, nous devons particulièrement regarder la colonne "Local Address : Port" puisqu'elle contient les informations recherchées.

V. Surveiller les ports en écoute avec un script Bash

Le script Bash ci-dessous permet de surveiller les ports en écoute à partir de la commande ss. À chaque exécution, il stocke le résultat dans un fichier et compare par rapport à l'exécution précédente. Ceci permet de voir s'il y a des ports en écoute en plus ou en moins. Vous pouvez le faire évoluer à votre guise, pourquoi pas pour ajouter l'envoi d'un e-mail ou d'une notification s'il y a un changement détecté.

#!/bin/bash

# Fichier pour stocker l'état de référence des ports
REFERENCE_FILE="/tmp/ports_reference.txt"
# Fichier pour stocker l'état actuel des ports
CURRENT_FILE="/tmp/ports_current.txt"

# Fonction pour obtenir les ports en écoute
get_listening_ports() {
    # Utiliser 'ss' pour obtenir les ports en écoute
    sudo ss -tulnp | awk 'NR>1 {print $5}' | sort
}

# Fonction pour comparer les fichiers
compare_ports() {
    echo "--- Changements détectés ---"

    # Ports ajoutés
    echo "Ports ajoutés :"
    comm -13 "$REFERENCE_FILE" "$CURRENT_FILE"

    # Ports supprimés
    echo "Ports supprimés :"
    comm -23 "$REFERENCE_FILE" "$CURRENT_FILE"

    echo "----------------------------"
}

# Générer l'état actuel des ports
get_listening_ports > "$CURRENT_FILE"

# Si le fichier de référence n'existe pas, créez-le
if [ ! -f "$REFERENCE_FILE" ]; then
    echo "Fichier de référence non trouvé. Création d'une référence initiale."
    mv "$CURRENT_FILE" "$REFERENCE_FILE"
    echo "Initialisation terminée. Aucun changement détecté pour le moment."
    exit 0
fi

# Comparer l'état actuel avec l'état de référence
compare_ports

# Mettre à jour le fichier de référence avec l'état actuel
mv "$CURRENT_FILE" "$REFERENCE_FILE"

exit 0

Voici quelques tests de détection effectués avec ce script :

Script Bash pour surveiller les ports en écoute sur Linux

VI. Conclusion

Nous venons de voir trois commandes différentes pour obtenir la liste des ports sur laquelle écoute une machine Linux : lsof, netstat et ss. Vous devez utiliser en priorité lsof et ss puisque netstat est considéré comme obsolète : il reste à connaître malgré tout et vous risquez de le rencontrer sur certaines machines.

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.