PowerShell

PowerShell-comment-tester-un-port

PowerShell : comment tester si un port est ouvert ou disponible avec les commandes :

  • Tester un port avec Test-NetConnection

En PowerShell, la commande Test-NetConnection représente une alternative à la commande ping, mais grâce à ses différents paramètres, il est possible d'aller plus loin puisque l'on peut effectuer un test sur un port spécifique (uniquement en TCP). Ainsi, on peut utiliser cette commande pour déterminer si un port est ouvert ou non. Que ce soit avec Windows PowerShell ou PowerShell, vous pouvez utiliser la commande Test-NetConnection. Dans cet exemple, une machine sous Linux, qui héberge un serveur Web Apache sera testée, à la fois sur le port 80 et sur le port 443. Nous verrons si elle répond à l'un ou l'autre de ces deux ports, ou peut-être même aux deux ! La commande Test-NetConnection s'utilise de cette façon :

Test-NetConnection -ComputerName <Nom ou IP de la cible> -Port <Numéro de port>

Si l'on veut tester le port 443 de la machine 192.168.14.131, on exécutera cette commande :

Test-NetConnection -ComputerName 192.168.14.131 -Port 443

Ici, le port 443 est visiblement fermé sur le serveur distant (pare-feu local qui bloque, service Web qui n'est pas accessible en HTTPS ou sur un port personnalisé, etc...), car on obtient le statut "failed" et surtout la propriété "TcpTestSucceeded" est égale à "false" ce qui indique que le test a échoué.

PowerShell-Test-NetConnection-Port-ferme%5B1%5D

Faisons le même test sur le port 80 :

Test-NetConnection -ComputerName 192.168.14.131 -Port 80

Cette fois-ci, la propriété "TcpTestSucceeded" est égale à "true", ce qui indique que le test a réussi. Sur le serveur Web, le port 80 est bien ouvert !

PowerShell-Test-NetConnection-Port-ouvert%5B1%5D

  • Lister les ports d'écoute avec Netstat

Pour commencer, je vais vous parler de l'outil Netstat, ce dernier étant présent depuis très longtemps sur Windows, il reste aujourd'hui incontournable lorsqu'il s'agit de regarder les connexions TCP actives d'une machine Windows ou de voir les ports d'écoute. Tout d'abord, à partir d'une console PowerShell ou d'une console Invite de commande, exécuter la commande suivante :

netstat -a

L'option "-a" permet d'afficher toutes les connexions et tous les ports d'écoute comme le spécifie l'aide Netstat. Sans cette option, la commande retourne seulement les connexions actives. D'ailleurs, vous pouvez consulter l'aide de Netstat avec la commande suivante :

netstat /?

Voici un extrait de ce que j'obtiens sur mon serveur contrôleur de domaine :

tuto-netstat-01%5B1%5D

Cette commande retourne plusieurs colonnes : Proto, Adresse locale, Adresse distante et Etat. Quelques précisions sur la signification de ces quatre colonnes.

Proto

  • Spécifie le type de protocole utilisé entre TCP et UDP.

Adresse locale

  • Spécifie l'adresse locale utilisée pour écouter ou pour établir la connexion. Lorsque c'est précisé "0.0.0.0" cela signifie que c'est toutes les adresses IP du serveur local, donc autrement dit il écoute sur toutes ces interfaces pour le port spécifié après 0.0.0.0. Si l'adresse IP est spécifiée, comme par exemple 192.168.100.11:53 cela signifie que le serveur DNS (= port 53) de mon serveur est en écoute sur cette adresse IP.

Adresse distante

  • Spécifie l'adresse IP de l'hôte distant avec lequel notre serveur local a établi la connexion. Lorsqu'il s'agit d'une ligne avec un port d'écoute, l'adresse distante sera le nom du serveur local. C'est pour cette raison que l'on retrouve "SRV-ADDS-01" sur les premières lignes. Dans le cas où une connexion est établie, l'adresse IP de l'hôte distant est indiquée, ou alors le nom d'hôte s'il s'agit d'un hôte connu.

Etat

  • Spécifie l'état de la connexion. Lorsque c'est précisé "LISTENING" cela signifie que le serveur écoute sur le port spécifié au sein du champ "Adresse locale". Lorsque ce champ prend la valeur "ESTABLISHED", cela signifie que la connexion est établie. D'autres valeurs sont possibles, car il y a de nombreux états possibles sur une connexion TCP.

Si vous préférez afficher que des informations numériques (numéro de port et adresse IP), il suffit d'ajouter l'option "-n", comme ceci lorsque c'est combiné avec une autre option comme "-a" :

netstat -an

tuto-netstat-02%5B1%5D

Avec Netstat, on ne peut pas filtrer directement sur l'état de la connexion ; c'est dommage. Si l'on veut seulement voir les ports d'écoute, c'est-à-dire les lignes avec l'état "LISTENING", il faut que l'on filtre la sortie avec findstr pour rechercher le mot clé "LISTENING". Ainsi, pour afficher tous les ports d'écoute via Netstat, on utilisera la commande suivante :

netstat -a | findstr LISTENING


  • Lister les ports d'écoute avec PowerShell (Get-NetTCPConnection)

Depuis quelques années, Netstat a un concurrent de poids : PowerShell. En effet, le language PowerShell dispose de commandes capable de lister les connexions actives et les ports d'écoute, alors forcément, je devais vous en parler. Le cmdlet qui nous intéresse tout particulièrement se nomme Get-NetTCPConnection. Ce qui est cool, c'est que l'on peut tirer profit de la puissance pour PowerShell pour filtrer les résultats retournés par la commande. Il faut savoir que même si ce cmdlet se nomme Get-NetTCPConnection, il retourne à la fois informations pour les protocoles TCP et UDP, comme Netstat. Commencer par exécuter cette commande sans paramètre :

Get-NetTCPConnection

get-nettcpconnection-powershell-01-800x435%5B1%5D

Même si les noms de colonnes sont différents, on retrouve globalement les mêmes informations qu'avec Netstat. Contrairement à Netstat, les adresses IP et les numéros de ports sont associés à des colonnes distinctes : une bonne nouvelle pour appliquer des filtres.

La colonne "OwningProcess" indique l'ID du processus qui est à l'origine de cette connexion, ce qui est une information intéressante. Cette information, on aurait pu l'obtenir également avec l'option "-b" de Netstat. Par contre, la colonne "AppliedSetting" est propre à cette commande PowerShell. On remarque la valeur "Datacenter" sur l'exemple ci-dessus, mais il y a d'autres valeurs possibles : Internet, Compat, etc... (voir la commande "Get-NetTCPSetting"). En fonction de certains critères, cela permet d'associer la connexion à un profil de paramètres. Pour obtenir la liste de toutes les propriétés disponibles, vous pouvez utiliser Get-Member ou afficher directement toutes les propriétés :

Get-NetTCPConnection | Select-Object -Property *

Il y a une propriété nommée "CreationTime" qui permet de connaître la date de création de cette connexion, ou depuis quand le serveur est en écoute sur le port en question (selon le type de connexion).

Je vous rappelle tout de même que l'objectif initial c'est d'obtenir la liste des ports d'écoute sur notre serveur. Fort heureusement, on peut appliquer un filtre via le paramètre "-State" pour sélectionner uniquement les connexions avec l'état "Listen", c'est-à-dire en écoute.

La commande PowerShell à utiliser est :

Get-NetTCPConnection -State Listen

get-nettcpconnection-powershell-02-800x654%5B1%5D

Comme vous pouvez le voir sur l'image ci-dessous, on obtient la liste des ports d'écoute à partir de cette commande. Il suffit de se référer à la colonne "LocalPort" de chaque ligne. Si on se demande "Est-ce que mon serveur DNS est bien en écoute sur le port 53 ?", on peut affiner encore un peu plus la commande avec le paramètre "-LocalPort" :

Get-NetTCPConnection -State Listen -LocalPort 53

On peut voir que plusieurs lignes sont retournées (et c'est tant mieux pour le bon fonctionnement de mon serveur DNS). Avec cette commande et cette syntaxe, on peut regarder rapidement si un serveur écoute sur un port spécifique ou non. Pour connaître le nom du processus qui s'affiche directement au niveau de la commande Get-NetTCPConnection, entrer la commande suivante :

Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress,LocalPort,@{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}}

Sur mon serveur, j'obtiens un joli tableau avec la liste des ports d'écoute et le processus associé.

get-nettcpconnection-powershell-04%5B1%5D

Source


  • Désactiver le Firewall Windows en commande Powershell

    Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False


  • Se Connecter à une Machine / serveur Distant avec Powershell

    Enter-PSSession <computername> -Credential <domain\username>


Article précédent Article suivant