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 quetcp(pour TCPv4),tcp6(pour TCPv6) ouudp.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 de0.0.0.0ou[::]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 estLISTEN, il s'agira généralement de0.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é deLocal 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_WAITouCLOSE_WAITsont 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êchenetstatd'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 affiche22au lieu dessh), 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écessitesudopour 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.
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 8080Vous 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/) ...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).Dans votre nouveau onglet de terminal, exécutez à nouveau la commande
netstatpour voir la liste des ports en écoute.sudo netstat -tulnpExaminez 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, comme12345) est dans l'étatLISTENsur le port8080. Vous avez lancé avec succès un service et confirmé qu'il est à l'écoute des connexions réseau.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.Revenez au deuxième onglet de terminal et exécutez la commande
netstatune dernière fois.sudo netstat -tulnpLa ligne correspondant au port
8080aura 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.
Tout d'abord, mettons en place notre fenêtre de surveillance. Dans votre terminal, exécutez la commande suivante. Cela exécutera
netstat -antptoutes les deux secondes et affichera les résultats, rafraîchissant continuellement l'écran.watch netstat -antpa: 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.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.
Dans le nouveau onglet de terminal, vous utiliserez
curlpour récupérer la page d'accueil du site web LabEx. Le symbole>redirige la sortie HTML vers/dev/nullafin qu'elle n'encombre pas votre écran.curl https://www.labex.io > /dev/nullDès que vous appuyez sur
Entrée, basculez rapidement votre vue vers votre premier onglet de terminal (celui qui exécutewatch). 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) estESTABLISHED, indiquant une connexion active. - L'
Adresse étrangère(Foreign Address) montre l'adresse IP du serveurlabex.ioet le port443(le standard pour HTTPS). - La colonne
PID/Nom du programmeidentifie clairementcurlcomme le programme qui a initié cette connexion. - L'
Adresse locale(Local Address) utilise un port aléatoire à numéro élevé (comme45678dans l'exemple). Il s'agit d'un port éphémère, dont nous discuterons à l'étape suivante.
- Remarquez que l'
Une fois que la commande
curla terminé le téléchargement (ce qui est très rapide), vous verrez l'état de la connexion passer àTIME_WAITouFIN_WAITavant de disparaître complètement de la liste.Vous pouvez maintenant arrêter la commande
watch. Allez dans le premier onglet de terminal et appuyez surCtrl+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.
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 localhostLa 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
yeset appuyez surEntréepour continuer.Il vous demandera le mot de passe. Vous n'avez pas besoin de saisir le mot de passe, restez simplement là.
Ouvrez un nouvel onglet de terminal en cliquant sur l'icône "plus". Nous avons besoin de ce nouveau terminal pour exécuter
netstatsans perturber notre session SSH active.Dans le nouveau terminal, exécutez à nouveau
netstat, mais cette fois, nous utiliserons la commandegreppour filtrer la sortie et n'afficher que les lignes contenantESTABLISHED. Cela rend beaucoup plus facile la recherche de sessions actives.netstat -antp | grep ESTABLISHEDLa 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 verslocalhost.(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'adresse127.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 depuis127.0.0.1:46280. Les informations sur le programme sont-car le processussshdappartient à l'utilisateur root, et nous n'avons pas utilisésudo. - Le côté client est
127.0.0.1:46280connecté à127.0.0.1:22. Le programme est clairement identifié comme5449/ssh. - Le port
46280est 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 connexionssh localhost, elle utiliserait un port éphémère différent.
- Le côté serveur de la connexion est
Pour terminer, fermez la session. Revenez à l'onglet du terminal où vous avez exécuté
ssh localhostet tapezexit, puis appuyez surEntrée.exitCela terminera la connexion. Si vous exécutez à nouveau
netstat -antp | grep ESTABLISHEDdans l'autre terminal, vous verrez que la sessionlocalhosta 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.



