Analyser les ports et sessions réseau avec netstat sous Linux

CompTIABeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez à utiliser la commande netstat pour analyser l'activité réseau sur un système Linux. Vous explorerez des concepts fondamentaux tels que les ports réseau, les sockets et les connexions actives afin de comprendre comment les services communiquent sur le réseau.

Vous commencerez par lister tous les sockets actifs, puis filtrerez les résultats pour vous concentrer sur les ports TCP et UDP en écoute, en les associant aux services qui les utilisent. Pour voir ces concepts en action, vous générerez une nouvelle connexion en naviguant sur un site web, puis utiliserez netstat pour identifier la session ESTABLISHED nouvellement créée et son port éphémère associé.

Lister tous les sockets actifs et en écoute avec netstat -a

Dans cette étape, vous allez commencer à explorer l'activité réseau de votre système à l'aide de la commande netstat. Cette commande est un outil fondamental pour les administrateurs réseau et les développeurs, fournissant des informations sur les connexions réseau, les tables de routage et les statistiques d'interface. Nous commencerons par l'option -a, qui demande à netstat d'afficher tous les sockets actifs, y compris les connexions aux systèmes distants et les ports qui sont en "écoute" pour de nouvelles connexions entrantes.

Tout d'abord, assurez-vous d'être dans votre répertoire de travail par défaut. Toutes les commandes de ce laboratoire seront exécutées depuis le terminal.

Maintenant, listons tous les sockets. Dans votre terminal, tapez la commande suivante et appuyez sur Entrée :

netstat -a

Vous verrez une grande quantité de sortie. Ne vous inquiétez pas, nous allons la décortiquer. La sortie affiche tous les types de sockets, y compris les sockets de domaine TCP, UDP et UNIX.

Examinons la structure de la sortie. Elle devrait ressembler à ceci (les détails exacts sur votre système varieront) :

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp        0      0 localhost:6010          0.0.0.0:*               LISTEN
tcp        0     52 labex-vm:ssh            192.168.0.10:54321      ESTABLISHED
tcp6       0      0 [::]:http-alt           [::]:*                  LISTEN
udp        0      0 0.0.0.0:bootpc          0.0.0.0:*
...
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    23456    /run/systemd/notify
unix  2      [ ACC ]     STREAM     LISTENING     34567    /tmp/.X11-unix/X0
...

Voici une explication des colonnes les plus importantes pour les connexions Internet :

  • Proto : Le protocole utilisé par le socket, tel que tcp (pour TCPv4), tcp6 (pour TCPv6) ou udp.
  • Local Address : L'adresse IP de votre système et le numéro de port qu'il utilise pour cette connexion. Le port est le numéro après le deux-points (:). Une adresse de 0.0.0.0 ou [::] signifie que le port écoute sur toutes les interfaces réseau disponibles sur votre machine.
  • Foreign Address : L'adresse IP et le numéro de port du système distant. Si l'état est LISTEN, il s'agira généralement de 0.0.0.0:* ou [::]:*, indiquant qu'il attend une connexion de n'importe quelle adresse.
  • State : C'est crucial pour les connexions TCP.
    • LISTEN : L'application attend une connexion entrante sur le port spécifié de Local Address. C'est un état côté serveur.
    • ESTABLISHED : Une connexion est active et des données peuvent être transférées entre les adresses locales et distantes.
    • D'autres états comme TIME_WAIT ou CLOSE_WAIT sont liés au processus de fermeture d'une connexion TCP.

Prenez un moment pour parcourir la sortie et identifier toutes les entrées dans l'état LISTEN. Celles-ci représentent les services sur votre système qui sont prêts à accepter des connexions réseau. C'est un aperçu direct de la couche Transport (Couche 4) en action.

Filtrer les ports TCP/UDP en écoute avec sudo netstat -tulnp

Dans l'étape précédente, la commande netstat -a nous a fourni une liste complète mais longue de tous les sockets. Pour rendre ces informations plus utiles, nous devons les filtrer. Dans cette étape, vous apprendrez à utiliser des options spécifiques avec netstat pour afficher uniquement les ports TCP et UDP en écoute et, surtout, pour identifier les programmes qui les utilisent.

Pour voir le nom du programme associé à un port, vous avez souvent besoin de privilèges administratifs, car le processus peut appartenir au système ou à un autre utilisateur. C'est pourquoi nous utilisons la commande sudo. Dans l'environnement LabEx, vous pouvez utiliser sudo sans mot de passe.

Exécutons une commande netstat plus ciblée. Dans votre terminal, tapez ceci :

sudo netstat -tulnp

Décomposons ces options, car elles sont couramment combinées :

  • t : Affiche les connexions TCP.
  • u : Affiche les connexions UDP.
  • l : Affiche uniquement les sockets en liste (listening). C'est notre filtre principal pour voir quels services attendent des connexions.
  • n : Affiche les adresses numériques. Cela empêche netstat d'essayer de résoudre les adresses IP et les numéros de port en noms d'hôtes et noms de services (par exemple, il affiche 22 au lieu de ssh), ce qui rend la commande beaucoup plus rapide.
  • p : Affiche l'identifiant du processus (PID) et le nom du programme auquel le socket appartient. Cela nécessite sudo pour voir tous les processus.

Après avoir appuyé sur Entrée, votre sortie sera beaucoup plus courte et plus informative. Elle ressemblera à ceci :

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      779/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3422/sshd
udp        0      0 127.0.0.53:53           0.0.0.0:*                           779/systemd-resolve

Remarquez la nouvelle colonne à la fin : PID/Program name. C'est l'information clé. Vous pouvez maintenant mapper directement un port en écoute à l'application exacte qui l'a ouvert. Par exemple, dans la sortie ci-dessus, vous pouvez voir que le port 22 (le port standard pour SSH) est utilisé par le programme sshd avec un identifiant de processus de 3422.

Cette commande est extrêmement puissante pour les administrateurs système. Elle vous permet de vérifier rapidement quels services sont en cours d'exécution et exposés sur le réseau, ce qui est essentiel à la fois pour le dépannage et pour l'audit de sécurité.

Mapper les ports en écoute aux services en cours d'exécution

Dans cette étape, vous allez consolider votre compréhension du lien entre les applications en cours d'exécution et les ports réseau en écoute. Vous avez vu comment lister les services existants avec netstat. Maintenant, vous allez démarrer votre propre service web simple et le voir apparaître dans la sortie de netstat, démontrant cette relation en temps réel.

Nous utiliserons le module intégré http.server de Python pour lancer rapidement un serveur web. C'est un outil pratique pour le développement et les tests.

  1. Tout d'abord, démarrons le serveur web. Nous lui indiquerons d'écouter sur le port 8080, un port alternatif courant pour les services web. Dans votre terminal, exécutez la commande suivante. Notez que votre terminal semblera "bloqué" car il exécute maintenant activement le serveur.

    python3 -m http.server 8080
    

    Vous devriez voir une sortie indiquant que le serveur a démarré :

    Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
    
  2. Ce terminal est maintenant occupé par le processus du serveur web. Vous avez besoin d'un nouveau terminal pour exécuter d'autres commandes. Dans l'environnement LabEx, vous pouvez ouvrir un nouvel onglet de terminal en cliquant sur l'icône "plus" dans la fenêtre du terminal ou en utilisant le menu (Fichier -> Nouvel onglet).

  3. Dans votre nouveau onglet de terminal, exécutez à nouveau la commande netstat pour voir la liste des ports en écoute.

    sudo netstat -tulnp
    
  4. Examinez attentivement la sortie. Vous verrez maintenant une nouvelle entrée pour le port 8080.

    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      779/systemd-resolve
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3422/sshd
    tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      12345/python3
    udp        0      0 127.0.0.53:53           0.0.0.0:*                           779/systemd-resolve
    ...
    

    Comme vous pouvez le constater, le système indique maintenant que le programme python3 (avec un PID spécifique, comme 12345) est dans l'état LISTEN sur le port 8080. Vous avez lancé avec succès un service et confirmé qu'il est à l'écoute des connexions réseau.

  5. Maintenant, arrêtons le service. Retournez à votre premier onglet de terminal (celui qui exécute le serveur Python) et appuyez sur Ctrl+C. Cela interrompra et terminera le processus du serveur.

  6. Revenez au deuxième onglet de terminal et exécutez la commande netstat une dernière fois.

    sudo netstat -tulnp
    

    La ligne correspondant au port 8080 aura disparu, prouvant qu'une fois qu'une application est terminée, elle n'écoute plus sur le port.

Créer une nouvelle connexion en naviguant sur un site web

Dans cette étape, vous allez déplacer votre attention des ports d'écoute côté serveur vers les connexions actives côté client. Jusqu'à présent, vous avez observé des services attendant que d'autres se connectent à eux. Maintenant, vous allez initier une connexion depuis votre machine vers un serveur distant et observer la formation de la connexion. Nous utiliserons l'outil en ligne de commande curl pour simuler la visite d'un site web.

Pour observer cet événement fugace, nous utiliserons la commande watch, qui exécute de manière répétée une autre commande, nous permettant de voir les changements dans la sortie de netstat en temps quasi réel.

  1. Tout d'abord, mettons en place notre fenêtre de surveillance. Dans votre terminal, exécutez la commande suivante. Cela exécutera netstat -antp toutes les deux secondes et affichera les résultats, rafraîchissant continuellement l'écran.

    watch netstat -antp
    
    • a : Affiche tous les sockets.
    • n : Affiche les adresses numériques.
    • t : Affiche uniquement les connexions TCP.
    • p : Affiche le PID/Nom du programme.

    Votre terminal sera maintenant rempli par la sortie de netstat, qui se met à jour automatiquement. Gardez ce terminal ouvert et visible.

  2. Maintenant, vous devez ouvrir un nouvel onglet de terminal pour émettre la commande qui créera la connexion. Cliquez sur l'icône "plus" dans la barre d'onglets de votre terminal.

  3. Dans le nouveau onglet de terminal, vous utiliserez curl pour récupérer la page d'accueil du site web LabEx. Le symbole > redirige la sortie HTML vers /dev/null afin qu'elle n'encombre pas votre écran.

    curl https://www.labex.io > /dev/null
    
  4. Dès que vous appuyez sur Entrée, basculez rapidement votre vue vers votre premier onglet de terminal (celui qui exécute watch). Vous verrez une nouvelle connexion apparaître pendant quelques secondes. Elle ressemblera à ceci :

    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    ...
    tcp        0      0 172.17.0.2:45678        104.21.5.141:443        ESTABLISHED 13579/curl
    ...
    
    • Remarquez que l'État (State) est ESTABLISHED, indiquant une connexion active.
    • L'Adresse étrangère (Foreign Address) montre l'adresse IP du serveur labex.io et le port 443 (le standard pour HTTPS).
    • La colonne PID/Nom du programme identifie clairement curl comme le programme qui a initié cette connexion.
    • L'Adresse locale (Local Address) utilise un port aléatoire à numéro élevé (comme 45678 dans l'exemple). Il s'agit d'un port éphémère, dont nous discuterons à l'étape suivante.
  5. Une fois que la commande curl a terminé le téléchargement (ce qui est très rapide), vous verrez l'état de la connexion passer à TIME_WAIT ou FIN_WAIT avant de disparaître complètement de la liste.

  6. Vous pouvez maintenant arrêter la commande watch. Allez dans le premier onglet de terminal et appuyez sur Ctrl+C. Vous pouvez également fermer le deuxième onglet de terminal.

Identifier une session ÉTABLIE et les ports éphémères

Dans cette dernière étape, vous allez consolider votre compréhension en examinant une connexion persistante et active. Cela vous permettra d'identifier clairement une "session" réseau et de voir comment votre système utilise des ports temporaires, ou "éphémères", pour la communication côté client.

Une connexion ESTABLISHED dans la sortie de netstat représente une session active (couche 5 du modèle OSI), où deux applications sont prêtes à échanger des données. Dans l'étape précédente, la session curl était très brève. Pour étudier une session plus facilement, nous allons en créer une qui reste ouverte en utilisant SSH.

Tout d'abord, définissons un concept important : les ports éphémères. Lorsque votre ordinateur (le client) se connecte à un serveur sur un port bien connu (comme le port 22 pour SSH ou 443 pour HTTPS), votre système d'exploitation doit attribuer un port pour son côté de la conversation. Il choisit un port temporaire inutilisé dans une plage de numéros élevés (généralement au-dessus de 32768). C'est ce qu'on appelle un port éphémère. Ce mécanisme permet à votre machine unique d'avoir de nombreuses connexions distinctes au même port serveur, par exemple, en ayant plusieurs onglets de navigateur ouverts sur le même site web.

  1. Pour créer une session stable et observable, vous allez vous connecter via SSH depuis votre machine de laboratoire vers elle-même. Dans votre terminal, exécutez la commande suivante :

    ssh localhost
    

    La première fois que vous ferez cela, vous pourriez voir un message concernant l'authenticité de l'hôte. C'est normal.

    The authenticity of host 'localhost (127.0.0.1)' can't be established.
    ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
    Are you sure you want to continue connecting (yes/no/[fingerprint])?
    

    Tapez yes et appuyez sur Entrée pour continuer.

    Il vous demandera le mot de passe. Vous n'avez pas besoin de saisir le mot de passe, restez simplement là.

  2. Ouvrez un nouvel onglet de terminal en cliquant sur l'icône "plus". Nous avons besoin de ce nouveau terminal pour exécuter netstat sans perturber notre session SSH active.

  3. Dans le nouveau terminal, exécutez à nouveau netstat, mais cette fois, nous utiliserons la commande grep pour filtrer la sortie et n'afficher que les lignes contenant ESTABLISHED. Cela rend beaucoup plus facile la recherche de sessions actives.

    netstat -antp | grep ESTABLISHED
    
  4. La sortie affichera toutes les connexions TCP actives actuellement. Vous pourriez voir un avertissement indiquant que tous les processus n'ont pas pu être identifiés, ce qui est attendu puisque nous n'utilisons pas sudo. Vous devriez voir votre connexion SSH d'origine à l'environnement de laboratoire et la nouvelle que vous venez de créer vers localhost.

    (Not all processes could be identified, non-owned process info
     will not be shown, you would have to be root to see it all.)
    tcp        0      0 172.16.50.192:22        47.251.66.143:36882     ESTABLISHED -
    tcp        0      0 127.0.0.1:46280         127.0.0.1:22            ESTABLISHED 5449/ssh
    tcp        0      0 127.0.0.1:22            127.0.0.1:46280         ESTABLISHED -
    

    Analysons la nouvelle connexion localhost, identifiée par l'adresse 127.0.0.1 :

    • Le côté serveur de la connexion est 127.0.0.1:22, qui est le serveur SSH (sshd) écoutant sur le port 22. Il a une connexion établie depuis 127.0.0.1:46280. Les informations sur le programme sont - car le processus sshd appartient à l'utilisateur root, et nous n'avons pas utilisé sudo.
    • Le côté client est 127.0.0.1:46280 connecté à 127.0.0.1:22. Le programme est clairement identifié comme 5449/ssh.
    • Le port 46280 est le port éphémère. Votre système l'a choisi aléatoirement pour l'extrémité client de cette session SSH spécifique. Si vous ouvriez une autre connexion ssh localhost, elle utiliserait un port éphémère différent.
  5. Pour terminer, fermez la session. Revenez à l'onglet du terminal où vous avez exécuté ssh localhost et tapez exit, puis appuyez sur Entrée.

    exit
    

    Cela terminera la connexion. Si vous exécutez à nouveau netstat -antp | grep ESTABLISHED dans l'autre terminal, vous verrez que la session localhost a disparu.

Résumé

Dans ce laboratoire, vous avez appris à utiliser la commande netstat pour analyser l'activité réseau sur un système Linux. Vous avez commencé par utiliser netstat -a pour lister tous les sockets actifs et en écoute, y compris les sockets TCP, UDP et UNIX domain. Vous avez ensuite affiné cette sortie en appliquant des indicateurs tels que -t, -u, -l, -n et -p pour filtrer spécifiquement les ports TCP et UDP en écoute, afficher les adresses numériques et identifier l'ID de processus et le nom associés à chaque port.

En vous basant sur cela, vous avez pratiqué l'interprétation de la sortie de la commande pour mapper les ports en écoute à leurs services correspondants. Pour observer une connexion en action, vous avez initié une nouvelle session réseau en vous connectant à un site web. Cela vous a permis d'identifier une connexion dans l'état ESTABLISHED et de comprendre le rôle des ports éphémères, qui sont des ports temporaires attribués au côté client d'une communication réseau.