Powershell : Comment tester les ports TCP ?

Firewall icon 
Et si on se passait de telnet ?
Il est courant de vouloir savoir si un port spécifique est ouvert ou fermé sur un équipement réseau, pour ouvrir les ports depuis son firewall. Et souvent, je peux encore voir par-ci et par-là qu'il utilise encore Telnet. Et si on s'en passait ?

Via un site internet

Ici, nous sommes dans le cas où nous voudrions savoir si les ports de notre serveur en DMZ*. Et quoi de mieux qu'un site externe qui va tester pour nous notre serveur à distance.
https://www.yougetsignal.com/tools/open-ports/ est l'un des nombreux sites qui propose ce service

Via une simple recherche sur un moteur de recherche on peut trouver d'autre site qui vous proposera la même chose par exemple sur Duckduckgo via la recherche Open Port Check Tool

Tester la connection via un port avec PowerShell

Il y a deux solutions ici, la première est d'utiliser la fonction "Test-NetConnection" du module NetTCPIP qui est disponible depuis Windows 8. Cette fonction remplace les commandes dos telnet, tracert et ping.

Utiliser la commande PowerShell qui suit pour vérifier que si le port TCP du périphérique réseau est ouvert :

Test-NetConnection -ComputerName duckduckgo.com -Port 443

Le nom ou l'ip du périphérique en bleu et le numéro du port est en vert .

Si vous n'avez pas la fonction Test-NetConnection sur votre ordinateur, il suffira d'utiliser la commande powershell suivante, elle va passer une fonction Dotnet.

New-Object System.Net.Sockets.TcpClient("duckduckgo.com", 443)

Le nom ou l'ip du périphérique en bleu et le numéro du port est en vert .

Et si on faisait une petite fonction pour tester, la présence d'un serveur et si c'est le cas, de voir si le port voulu est ouvert  ?
function Test-Port
{
    param (
        [Parameter(Mandatory = $true, HelpMessage = "Indiquer le nom de l'ordinateur qui sera testé.")]
        $hostname,
        [Parameter(Mandatory = $true, HelpMessage = "Indiquer le port qui sera testé.")]
        $port
    )

    # This works no matter in which form we get $host - hostname or ip address
    try {
        try
            {
                $hostname = [System.Net.Dns]::gethostentry($hostname).Hostname
            }
            Catch
            {
                Write-Warning "l'ordinateur $hostname n'a pas été résolu par le serveur DNS"
            }
            $Task = (New-Object System.Net.NetworkInformation.Ping).SendPingAsync($hostname)
            $ip = $Task.Result.Address.IPAddressToString
    } catch {
        Write-Warning "Il est possible que l'adresse $hostname est fausse"
        return
    }
    $t = New-Object Net.Sockets.TcpClient
    # We use Try\Catch to remove exception info from console if we can't connect
    try
    {
        $t.Connect($ip,$port)
    } catch {}

    if($t.Connected)
    {
        $t.Close()
        $msg = "Port $port sur l'adresse $ip est opérationnel"
    }
    else
    {
        $msg = "Port $port sur l'adresse $ip est bloqué, "
        $msg += "Il faudra contacter l'équipe réseau pour l'ouvrir."                                 
    }
    $msg
}

DMZ : Pour une zone démilitarisée, c'est un sous-réseau séparé du réseau local et isolé de celui-ci et d'Internet par un pare-feu. Ce sous-réseau contient les machines étant susceptibles d'être accédées depuis Internet, et qui n'ont pas besoin d'accéder au réseau local.

Commentaires

Posts les plus consultés de ce blog

MRemoteNG - Voir les mots de passe dans l'application

Powershell - Utiliser les requêtes WMI

PowerShell - Utiliser NSIS (Nullsoft Scriptable Install System) pour simplifier l'usage des scripts PS1