Monitorer un basculement de lien Internet avec PowerShell

PowerShell logo

On m'a demandé de mettre en place un système d'alerte lors d'un passage d'une connexion à une autre sur une architecture internet double wan.

Dans un environnement exclusivement Windows j'ai développé un script PowerShell.

Voyons en détail comment tout cela fonctionne…

Récupérer l'adresse ip publique avec PowerShell

Le but ici est de récupérer l'adresse ip publique. Pour se faire nous utiliserons un service externe comme proposé par http://ifconfig.me.

Mozilla Firefox | http://ifconfig.me/ip address to get current ip

Facile, un simple texte avec l'adresse ip address!

  • Donc, pour récupérer l'adresse avec PowerShell il suffira d'entrer la commande suivante :
PS C:\ > (New-Object System.Net.WebClient).DownloadString('http://ifconfig.me/ip')
PowerShell | Récupérer l'adresse ip publique
  • Un petit peu plus, mais pas tant que ça, compliqué on peut aussi récupérer l'ip au format json depuis le site https://api.ipify.org :
PS C:\ > ((New-Object System.Net.WebClient).DownloadString('https://api.ipify.org?format=json') | ConvertFrom-Json).ip
PowerShell | Get public ip address

Script PowerShell

Remplacer la variable default_ip avec l'adresse IP wan par défaut.

###########################
# author : shebangthedolphins.net
# version : 1.0
# date : 2021.06.26
# role : surveiller le lien wan, envoi d'un mail lors d'un failover
# other : Testé sur un Windows 2019 Server
# maj :
#       - 1.0 (2021/06) : 1ere version

#on paramètre l'adresse ip wan par défaut
$default_ip = '94.198.4.X'

#Fonction pour envoyer un mail
Function Mail {
    param ([string]$emailbody, [string]$subject)

    $encoding = [System.Text.Encoding]::UTF8
    Send-MailMessage -Encoding $encoding -To check_wan@shebangthedolphins.net -Subject $subject -From check_wan@shebangthedolphins.net -smtpserver mx.shebangthedolphins.net -Body $emailbody #envoi du mail
    }

#On créé un fichier checkip_state.txt avec la valeur 1. La valeur 1 pour l'ip par défaut et 0 si différence à celle par défaut
if (!(Test-Path C:\Windows\Temp\checkip_state.txt -PathType Leaf)) { #si C:\Windows\Temp\checkip_state.txt n'existe pas
    Set-Content C:\Windows\Temp\checkip_state.txt '1' #alors créer le fichier C:\Windows\Temp\checkip_state.txt avec la valeur par défaut
    }

#récupérer l'adresse ip publique
$currentIP = (New-Object System.Net.WebClient).DownloadString('http://ifconfig.me/ip')
#$currentIP = ((New-Object System.Net.WebClient).DownloadString('https://api.ipify.org?format=json') | ConvertFrom-Json).ip

#Si la valeur récupérée est Null (dans le cas ou http://ifconfig.me/ip ne renvoi rien) ou si égale à la valeur par défaut
If(($currentIP -eq $default_ip) -or ($currentIP -eq $Null)) {
    Write-Host "actuellement sur le lien par défaut"
    if ($(get-content C:\Windows\Temp\checkip_state.txt) -eq '0') { #si la valeur dans C:\Windows\Temp\checkip_state.txt est égale à 0 cela veut dire que l'on était précédement sur le lien secondaire, on est dans le cas d'un changement de lien donc envoyer un mail
        Mail "Le lien par défaut est utilisé, l'adresse ip est : $currentIP" "Check Failover : le lien a changé"
        Set-Content C:\Windows\Temp\checkip_state.txt '1' #on paramètre le fichier checkip_state.txt à 1 (qui correspond à lien par défaut)
    } 
 } else {
    Write-Host "actuellement sur le lien secondaire"
    if ($(get-content C:\Windows\Temp\checkip_state.txt) -eq '1') { #si la valeur dans C:\Windows\Temp\checkip_state.txt est égale à 1 cela veut dire que l'on était précédement sur le lien principal, on est dans le cas d'un changement de lien donc envoyer un mail 
        Mail "Le lien secondaire est utilisé, l'adresse ip est : $currentIP"" "Check Failover : le lien a changé"
        Set-Content C:\Windows\Temp\checkip_state.txt '0' #on paramètre le fichier checkip_state.txt à 0 (qui correspond au lien secondaire)
    }
}

Maintenant suivre ce lien pour créer une tâche Windows dans le but d'éxécuter le scipt de façon périodique.

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :