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…
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.
Facile, un simple texte avec l'adresse ip address!
PS C:\ > (New-Object System.Net.WebClient).DownloadString('http://ifconfig.me/ip')
PS C:\ > ((New-Object System.Net.WebClient).DownloadString('https://api.ipify.org?format=json') | ConvertFrom-Json).ip
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
#Activer le TLS1.2 :
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
#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 au 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)
}
###########################
# author : shebangthedolphins.net
# version : 1.1
# date : 2022.09.13
# role : monitor wan link, send email in case of failover
# other : Tested on Windows 2019 Server
# updates :
# - 1.0 (2021/06) : First Version
# - 1.1 (2022/09) : Send an email if the script has run 12 times on the secondary link
#Activer le TLS1.2 :
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
#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
}
#On créé un fichier checkip_count.txt avec la valeur 0. Si le fichier n'existe pas. Ce fichier comptera le nombre de fois que le script a été exécuté lorsque l'on était sur le lien secondaire.
if (!(Test-Path C:\Windows\Temp\checkip_count.txt -PathType Leaf)) { #si C:\Windows\Temp\checkip_count.txt n'existe pas
Set-Content C:\Windows\Temp\checkip_count.txt '0' #alors créer le fichier C:\Windows\Temp\checkip_count.txt avec la valeur 0
}
#récupérer l'adresse ip publique
$currentIP = (New-Object System.Net.WebClient).DownloadString('http://ifconfig.me/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)
Set-Content C:\Windows\Temp\checkip_count.txt '0' #on réinitialise la valeur contenue dans checkip_count.txt à 0
} else {
Write-Host "actuellement sur le lien secondaire"
Set-Content C:\Windows\Temp\checkip_count.txt $([int](get-content C:\Windows\Temp\checkip_count.txt)+1) #incrémente de 1 la valeur contenue dans checkip_count.txt
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é"
}
if ($(get-content C:\Windows\Temp\checkip_count.txt) -ge '13') { #si le script a été exécuté 12 fois alors qu'on était sur le lien secondaire alors
Set-Content C:\Windows\Temp\checkip_count.txt '0' #réinitialiser le compteur checkip
Mail "Le lien secondaire est actuellement utilisé, l'adresse ip est : $currentIP" "Check Failover : toujours sur le lien secondaire" #envoi du mail
}
Set-Content C:\Windows\Temp\checkip_state.txt '0' #on paramètre la valeur de checkip_state.txt à 0 (ce qui veut dire que l'on se trouve sur le 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.
Contact :