Jusqu’à présent, j’avais toujours résolu ce type de questions en effectuant mes tests Telnet à la main en installant sur mon Windows Server le client Telnet. Mais cela peut vite devenir un peu ennuyeux lorsque vous devez tester un grand nombre de ports (et sur plusieurs serveurs).
Contexte
Je vous propose de partager un court script PowerShell qui m’a permis de répondre à ce besoin et que j’utilise régulièrement depuis.
Mon contexte est le suivant : je dispose de plusieurs scénarios qui comportent chacun une série spécifique de ports à tester. Je souhaite donc exécuter un scénario en particulier en fonction du serveur sur lequel je suis connecté. Idéalement, je ne souhaite pas modifier le script si jamais un port doit être changé/supprimé ou ajouté.
Mon script sera composé de 2 fichiers : 1 fichier CSV qui contiendra les différents scénarios de tests et 1 script PowerShell que je pourrais appeler en fonction de mon besoin et qui utilisera en entrée le fichier CSV. Je souhaite également pouvoir tester des ports dont le protocole sera TCP ou UDP (et le script doit pouvoir gérer ça tout seul). Pas besoin de gérer d’autres protocoles dans mon cas de figure.
Comme d’habitude, je vous partage tous les fichiers à la fin de l’article pour que vous puissiez tester de votre côté si besoin. Libre à vous de copier/adapter le tout en fonction de vos besoins.
Fichier CSV
De mon côté, je suis parti sur un fichier CSV avec le contenu suivant – TestPortsOpened.csv :
Ce script fonctionnera avec 2 paramètres : le nom du scénario à tester ainsi que l’adresse cible que l’on souhaite tester.
Les premières variables vont nous permettre successivement récupérer le dossier d’exécution du script, trouver automatiquement le fichier CSV correspondant dans le dossier et finalement notre variable $data importera notre fichier CSV pour ne garder que le scénario et les ports correspondants à tester.
Write-Host"Test executed on $($item.port) ($($item.protocol)) from localhost to $($target): "-NoNewline
26
Write-Host"SUCCESS"-ForegroundColorGreen
27
}
28
29
# If the connection has timedout and can't be established
30
else
31
{
32
# Displaying the result
33
Write-Host"Test executed on $($item.port) ($($item.protocol)) from localhost to $($target): "-NoNewline
34
Write-Host"FAILED"-ForegroundColorRed
35
}
36
# Closing connection
37
$connection.Close()
38
}
Pour chaque scénario, nous avons donc plusieurs ports à tester. Dans la variable $data nous avons récupéré la liste des ports à tester pour un scénario donné.
Pour chaque ligne, nous avons donc 1 port à tester avec le numéro, un nom/description (dont nous ne faisons rien) et le protocole.
Cette boucle foreachva nous permettre pour un port donné de :
Tester s’il s’agit d’un port UDP ou TCP et en fonction du protocole on établit une nouvelle connexion de type System.Net.Sockets.UdpClient dans le cas d’un port UDP ou System.Net.Sockets.TcpClient pour le protocole TCP ;
Si nous parvenons à établir la connexion avec succès dans ce cas nous affichons un message de succès avec une coloration verte et la mention « SUCCESS » ;
En revanche, sinon nous ne parvenons pas à établir la connexion dans ce cas le message se terminera de la mention « FAILED » en rouge ;
Une fois terminé, on clos la connexion proprement. 🙂
Exemples d’exécution
Bien entendu, pour pouvoir effectuer un test probant, réalisez votre test sur un serveur ou quelque-chose dont vous maîtrisez la configuration réseau.
Pour télécharger l’intégralité du script ainsi qu’un exemple de fichier CSV suivez ce lien: TestPortsOpened.
Testé sous Windows Server 2012 R2, 2016 (avec les versions PowerShell intégrées par défaut à ces versions d’OS).
Anciennement Sr. Cloud Solution Architect (PFE) @ Microsoft France dans les domaines de l'infrastructure, du cloud et de la sécurité. Je suis aujourd'hui Technical Lead au sein de Devoteam M Cloud. Bonne visite ! 🤓