logo rss

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

v1.0

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) }

v1.1

########################### # 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.

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

Contact :

adresse mail de contact