Toutes les façons de vérifier si un port est ouvert dans Linux

Votre serveur Linux est en cours d’exécution, et vous souhaitez maintenant vérifier si un port spécifique est ouvert afin d’y accéder à distance. Vérifier les ports ouverts est une tâche assez courante pour les administrateurs système, et il existe quelques façons différentes de le faire sous Linux.

Dans cet article, vous apprendrez plusieurs façons de vérifier si un port est ouvert sous Linux afin que vous puissiez choisir celles qui fonctionnent le mieux pour vous. Prêt ? Lisez la suite !

Prérequis

Ce tutoriel sera une démonstration pratique. Si vous souhaitez suivre, assurez-vous d’avoir ce qui suit.

  • A Linux computer. This guide uses Ubuntu 20.04, but any recent Linux distribution should work.
  • Accès à un terminal. Si vous utilisez un environnement de bureau graphique, recherchez un programme émulateur de terminal dans votre menu d’applications. Ou, si vous vous êtes connecté à un serveur distant via SSH,
  • A user account with sudo privileges. For simplicity, this tutorial uses the root user.

Vérifiez si un port est ouvert sous Linux en utilisant netstat

La première méthode pour vérifier si un port est ouvert sous Linux consiste à exécuter la commande netstat. Cette commande affiche les connexions réseau, les tables de routage et de nombreuses statistiques d’interface réseau.

La commande netstat fait partie du package net-tools, et ce package peut ne pas être installé par défaut sur votre distribution Linux. Sur Ubuntu, installez netstat en exécutant les commandes suivantes dans le terminal.

apt update -y && apt install net-tools -y

Supposons que vous ayez un serveur web NGINX en cours d’exécution et que vous souhaitiez vérifier si le port 80 est ouvert. Vous pouvez le faire en exécutant la commande suivante. Remplacez 80 par le numéro de port que vous souhaitez vérifier.

Les drapeaux -tulpn indiquent à netstat d’afficher tous les ports en écoute. Le premier grep trouve et filtre la ligne contenant le mot LISTEN dans le résultat. Le deuxième grep filtre les résultats pour afficher uniquement ceux correspondant à :80.

netstat -tulpn | grep LISTEN | grep :80

Pour en savoir plus sur les drapeaux netstat, exécutez la commande netstat –help.

Si le port est ouvert, vous verrez la sortie suivante. Comme vous pouvez le constater, la sortie montre que le port 80 est ouvert sur le système. tcp est le type de protocole, et :::80 indique qu’il s’agit d’un port TCPv6. 0.0.0.0:80 signifie que le port est ouvert pour toutes les adresses IPv4. 80 est le port HTTP par défaut offrant l’accès au site web.

Checking If a Port is Open with netstat

Vérification de l’ouverture d’un port à l’aide de ss

Le ss commande est une autre utilité en ligne de commande pour vérifier les ports ouverts. Cette commande affiche des statistiques de socket, que vous pouvez utiliser pour confirmer si un port est ouvert ou non. La commande ss affiche plus d’informations sur les ports ouverts que les autres outils.

Comme la commande netstat, le drapeau -t indique à ss d’afficher uniquement les sockets TCP, -u pour afficher uniquement les sockets UDP et -l pour montrer uniquement les sockets d’écoute. Le drapeau -p indique le nom du processus ou le PID utilisant le port.

ss -tulpn | grep LISTEN | grep :80

Vous verrez la sortie suivante si le port est ouvert. Comme vous pouvez le voir, la sortie contient le nom du processus et le PID pour chaque port en écoute. Dans ce cas, le port 80 est ouvert, et le serveur web NGINX l’utilise.

Checking If a Port is Open Using ss

Vérification de l’ouverture d’un port avec lsof

La commande lsof est un autre outil pratique pour vérifier les ports ouverts. Le nom lsof signifie list open files, qui affiche des informations sur les fichiers ouverts sur le système. Ces informations comprennent les descripteurs de fichiers, les identifiants de processus, les identifiants d’utilisateur, etc.

Comment la liste des fichiers ouverts vous aide-t-elle à déterminer si un port est ouvert ? Vous avez probablement déjà entendu l’expression « everything in Linux is a file, »— et cette phrase signifie ce qu’elle dit.

Par exemple, supposez que vous souhaitiez vérifier si le port 22 est ouvert et si vos utilisateurs peuvent se connecter en SSH à votre serveur. Exécutez la commande suivante pour répertorier les fichiers ouverts avec des connexions actives sur le port 22.

Le drapeau -i indique à lsof d’afficher tous les sockets Internet ouverts. Le drapeau -P affiche les numéros de port au lieu des noms de service. Et le drapeau -n supprime les recherches DNS et les noms de service, vous verrez donc les adresses IP à la place des noms d’hôtes distants.

lsof -i -P -n | grep LISTEN | grep :22

Si le port est ouvert, vous verrez la sortie suivante. Comme vous pouvez le voir, la sortie contient des informations sur:

  • 1027 est l'identifiant du processus du service sshd.
  • root est l'identifiant de l'utilisateur qui utilise le port.
  • 3u et 4u sont les descripteurs de fichiers pour IPv4 et IPv6, respectivement.
  • 31035 et 31037 sont les ports réseau pour IPv4 et IPv6, respectivement.
  • :22 indique que le port 22 est ouvert pour toutes les adresses IPv4 et IPv6.
  • (LISTEN) montre que le port écoute les connexions entrantes.
  • 0t0 est l'état du socket, ce qui signifie que le socket est dans l'état LISTEN.
Checking If a Port is Open Using lsof

Vérification de l’ouverture d’un port à l’aide de nmap

Jusqu’à présent, vous avez vu comment vérifier si un port est ouvert sur Linux en utilisant la ligne de commande. Mais que faire si vous voulez vérifier si un port est ouvert sur une machine distante ? Dans ce cas, vous pouvez utiliser l’outil nmap.

Mais avant d’exécuter nmap, sachez que cet outil peut ne pas faire partie des paquets par défaut de votre distribution Linux. Dans ce cas, vous devez d’abord installer nmap en exécutant la commande ci-dessous.

apt install nmap -y

Maintenant, exécutez la commande suivante pour vérifier si un port est ouvert sur une machine distante. Cette commande teste si le port 22 est ouvert sur 159.89.176.25 afin que votre utilisateur puisse se connecter en SSH à votre serveur. Remplacez l’adresse IP par la vôtre si nécessaire.

nmap -p 22 159.89.176.25

Comme vous pouvez le voir, la sortie contient des informations sur :

  • L’heure de début du scan de ports (2022-06-30 16:58 UTC).
  • L’adresse IP de la machine distante (159.89.176.25).
  • L’état du port (ouvert).
  • Le service utilisant le port (ssh).
  • L’état de l’hôte (actif).
Checking If a Port is Open Using nmap

Le résultat confirme que les utilisateurs peuvent se connecter en SSH à l’ordinateur en utilisant l’adresse IP et le port.

ssh [email protected] -p 22

La capture d’écran ci-dessous montre une connexion SSH réussie au serveur, prouvant que le port 22 est ouvert.

SSHing into your server

Vérification de l’ouverture d’un port à partir d’un script Shell

L’automatisation est toujours une bonne idée. Vérifier les ports ouverts en exécutant un script shell est une excellente façon de tester plusieurs ports. Vous pouvez utiliser n’importe quelle méthode précédente pour vérifier si un port est ouvert. Mais, pour cet exemple, vous écrirez un script shell de base qui exécute la commande Netcat nc.

1. Créez un fichier nommé check_port.sh dans votre répertoire personnel en utilisant votre éditeur de texte préféré. Cet exemple utilise nano.

nano check_port.sh

2. Copiez le code d’exemple ci-dessous dans votre éditeur. Remplacez 80 par le numéro de port que vous souhaitez vérifier.

La condition if vérifie si le port 80 est ouvert en utilisant la commande nc. Les 2>&1 et >/dev/null redirigent respectivement les messages d’erreur et de sortie vers /dev/null. Le fichier /dev/null est un fichier spécial qui ignore tout ce qu’il reçoit.

Si le port est ouvert, le script check_port.sh affichera En ligne sur la console. Sinon, le script affichera Hors ligne.

if ( nc -zv localhost 80 2>&1 >/dev/null ); then
    echo 'Online'
else
    echo 'Offline'
fi

Le fichier de script devrait ressembler à la capture d’écran ci-dessous. Enregistrez le script et quittez l’éditeur.

Creating the Shell script

3. Exécutez le script shell pour commencer à vérifier les ports ouverts que vous avez spécifiés dans le script.

bash check_port.sh

Vous verrez l’un des résultats suivants en fonction de la disponibilité du port. Dans ce cas, le port est ouvert, ce que le message En ligne confirme.

Check if the 80 port is open

Vous pouvez utiliser ce script shell pour vérifier si un port est ouvert à un intervalle ou à une tâche planifiée. Le scriptage est particulièrement utile lorsque vous devez vérifier plusieurs serveurs. Vous avez seulement besoin de copier ce script check_port.sh sur tous les serveurs que vous souhaitez vérifier et l’exécuter à l’aide d’outils CI/CD tels que Jenkins ou Ansible.

Vérifier si un port est ouvert en utilisant PowerShell

PowerShell dispose d’une cmdlet intégrée pour tester les connexions réseau appelée Test-NetConnection — mais cette cmdlet n’est disponible que sur les systèmes Windows. Ne vous inquiétez pas ; vous pouvez toujours utiliser PowerShell dans Linux pour vérifier les ports ouverts et les connexions en utilisant la classe TcpClient.

Si votre ordinateur Linux n’a pas encore PowerShell, installez-le en suivant les instructions de cette documentation Microsoft : Installer PowerShell sur Linux.

1. Lancez PowerShell en exécutant la commande ci-dessous.

pwsh
Launching PowerShell

2. Ensuite, créez un fichier appelé Test-Port.ps1 en utilisant votre éditeur de texte. Cet exemple utilise nano.

nano Test-Port.ps1

3. Ensuite, copiez le code ci-dessous dans votre éditeur. Enregistrez le fichier et quittez l’éditeur par la suite.

Note: Ce code est un extrait de Un outil de test de port tout-en-un PowerShell.

<#
	.SYNOPSIS
		Cette fonction teste les ports TCP/UDP ouverts.
	.DESCRIPTION
		Cette fonction teste n'importe quel port TCP/UDP pour voir s'il est ouvert ou fermé.
	.NOTES

	.PARAMETER NomOrdinateur
		Un ou plusieurs noms d'ordinateurs distants, séparés par des virgules
	.PARAMETER Port
		Un ou plusieurs numéros de port séparés par des virgules que vous souhaitez tester.
	.PARAMETER TcpTimeout
		Le nombre de millisecondes que la fonction attendra avant de déclarer
		le port TCP fermé. La valeur par défaut est 1000.
	.EXAMPLE
		PS> Test-Port -NomOrdinateur 'LABDC','LABDC2' -Protocole TCP 80,443
		
		Cet exemple teste les ports réseau TCP 80 et 443 sur les serveurs LABDC
		et LABDC2.
	#>
[CmdletBinding()]
[OutputType([System.Management.Automation.PSCustomObject])]
param (
    [Parameter(Mandatory)]
    [string[]]$ComputerName,
    [Parameter(Mandatory)]
    [int[]]$Port,
    [Parameter()]
    [int]$TcpTimeout = 1000
)
begin {
    $Protocol = 'TCP'
}
process {
    foreach ($Computer in $ComputerName) {
        foreach ($Portx in $Port) {            
            $Output = @{ 'Computername' = $Computer; 'Port' = $Portx; 'Protocol' = $Protocol; 'Result' = '' }
            Write-Verbose "$($MyInvocation.MyCommand.Name) - Beginning port test on '$Computer' on port '$Protocol<code>:$Portx'"

            $TcpClient = New-Object System.Net.Sockets.TcpClient
            $Connect = $TcpClient.BeginConnect($Computer, $Portx, $null, $null)
            $Wait = $Connect.AsyncWaitHandle.WaitOne($TcpTimeout, $false)
            if (!$Wait -or !($TcpClient.Connected)) {
                $TcpClient.Close()
                Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' failed port test on port '$Protocol</code>:$Portx'"
                $Output.Result = $false
            }
            else {
                $TcpClient.EndConnect($Connect)
                $TcpClient.Close()
                Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' passed port test on port '$Protocol<code>:$Portx'"
                $Output.Result = $true
                $TcpClient.Close()
                $TcpClient.Dispose()
            }
            [pscustomobject]$Output
        }
    }
}

4. Après avoir enregistré le script Test-Port.ps1, exécutez la commande ci-dessous pour tester les ports 22, 80, 443 et 53.

Le paramètre -NomOrdinateur accepte la liste des noms d’hôtes, FQDN ou adresses IP de(s) machine(s) cible(s).

Le paramètre -Port accepte un tableau d’un ou plusieurs numéros de port à tester.

./Test-Port.ps1 -ComputerName localhost -Port 22,80,443

Comme vous pouvez le voir ci-dessous, le résultat montre que les ports 22 et 80 sont ouverts (True), tandis que le port 443 ne l’est pas (False).

Checking for open ports using PowerShell scripting

Pour exécuter le même script contre plusieurs points d’extrémité cibles et ports, modifiez le code ci-dessous pour ajouter tous les ordinateurs cibles dans le paramètre NomOrdinateur et les numéros de port dans le paramètre Port.

./Test-Port.ps1 `
    -ComputerName adamtheautomator.com,localhost,8.8.8.8 `
    -Port 22,80,443,53
Checking for open ports on multiple targets using PowerShell scripting

Conclusion

Dans cet article, vous avez appris comment vérifier si un port est ouvert ou non sous Linux. Vous avez également appris à vérifier si un port est ouvert à partir d’un script shell et de PowerShell. Maintenant, vous pouvez utiliser l’une de ces méthodes pour vérifier si un port est ouvert sur votre machine ou sur une machine distante.

Mais ne vous arrêtez pas là. Consultez d’autres articles de dépannage pour continuer à perfectionner vos compétences d’administrateur système !

Source:
https://adamtheautomator.com/check-if-a-port-is-open-in-linux/