VPN-Verbindung zu Azure mit FritzBox und dynamischer IP (update-gatewayip.ps1)

Besitzer einer Fritzbox können ein Site-to-Site-VPN mit Azure aufbauen. Wie das geht, ist z.B. hier beschrieben: http://www.krombusch.de/?p=629

Nun ist es leider so, dass die meisten Privatanschlüsse eine dynamische IP-Adresse haben und der Tunnel somit nach einer IP-Adressänderung nicht mehr funktioniert und die neue IP-Adresse manuell in den Azure VNET-Einstellungen geändert werden muss.

Das fand‘ ich ziemlich unbefriedigend, daher habe ich mir gedacht, das kann man doch mit einem PowerShell Skript und Azure Automation automatisieren. Als erstes braucht man dafür einen Service-Account, unter dem das Skript laufen soll. Wie dieser angelegt wird, ist hier beschrieben: http://azure.microsoft.com/blog/2014/08/27/azure-automation-authenticating-to-azure-using-azure-active-directory/

Dann muss das folgende Skript als Runbook in Azure Automation eingefügt werden. Die Werte in spitzen Klammern müssen angepasst werden. Das Skript löst den DynDNS-Namen auf die öffentliche IP-Adresse der Fritzbox auf und ersetzt per Regular Expression die IP-Adresse des lokalen VPN-Gateways in der Azure VNET-Konfiguration.


workflow Update-GatewayIp {
 Param(
 [string]$DNSName=“<DNS-Name>“
 )

$ErrorActionPreference = „Stop“
 $Cred = Get-AutomationPSCredential -Name „<Account-Name>“
 Add-AzureAccount -Credential $Cred | Write-Verbose
 Select-AzureSubscription -SubscriptionId <Subscription ID>

inlineScript {
 $DNSName = $using:DNSName

# Suchmuster für IP-Adresse anlegen
 $pattern = „[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}“

# IP Adresse ermitteln
 $ip = [System.Net.Dns]::GetHostAddresses(„$($dnsname)“) | Select-Object -First 1 -ExpandProperty IPaddressToString

# XML Content laden
 $config = Get-AzureVNetConfig

# IP ersetzen
 $config = $config.XMLConfiguration -replace „<VPNGatewayAddress>$($pattern)</VPNGatewayAddress>“,“<VPNGatewayAddress>$($ip)</VPNGatewayAddress>“

# Neuen XML Content schreiben
 Set-Content $env:temptemp.netcfg -Value $config

Set-AzureVNetConfig -ConfigurationPath $env:temptemp.netcfg

Write-Output „IP-Adresse wurde ersetzt.“
 }
 }

Ich habe meine Fritzbox so konfiguriert, dass nachts eine Zwangstrennung erfolgt. Das Runbook wird alle drei Stunden von Azure Automation ausgeführt, so dass der VPN-Tunnel zu normalen Arbeitszeiten immer zur Verfügung steht.

Danke an Ingo Deissenroth für die Umsetzung des Teils mit den regulären Ausdrücken!

Update vom 25.08.2017 (ARM-Support)

Das o.g. Skript funktioniert nur, wenn die Azure-Ressourcen im sog. Classic Mode (ASM) angelegt sind. Inzwischen sollten neue Ressourcen im Azure Resource Manager (ARM) angelegt werden. Um die IP-Adresse dort zu ändern, kann folgendes Skript verwendet werden:

 


Import-Module AzureRM.Network

# define variables
 $connectionName = "AzureRunAsConnection"
 $dynamicDnsHostname = "<dynamic DNS name>"
 $resourcegroupname = "<resource group name of local network gateway>"
 $localnetworkgatewayname = "<name of local network gateway object>"

# log in to Azure
 try
 {
 # Get the connection "AzureRunAsConnection "
 $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName

"Logging in to Azure..."
 Add-AzureRmAccount `
 -ServicePrincipal `
 -TenantId $servicePrincipalConnection.TenantId `
 -ApplicationId $servicePrincipalConnection.ApplicationId `
 -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
 }
 catch {
 if (!$servicePrincipalConnection)
 {
 $ErrorMessage = "Connection $connectionName not found."
 throw $ErrorMessage
 } else{
 Write-Error -Message $_.Exception
 throw $_.Exception
 }
 }

# Get IP address
 $currentIp = (Invoke-RestMethod -Uri "https://dns-api.org/A/$($dynamicDnsHostname)").Value

# Get local network gateway
 $lnGateway = Get-AzureRmLocalNetworkGateway -ResourceGroupName $resourcegroupname -Name $localnetworkgatewayname

# compare IPs and update if required
 If ($currentIp -ne $lnGateway.GatewayIpAddress) {
 Write-Output "Updating local network Gateway IP address to $currentIp"
 $lnGateway.GatewayIpAddress = $currentIp
 Set-AzureRmLocalNetworkGateway -LocalNetworkGateway $lnGateway
 }
 Else {
 Write-Output 'Local network gateway IP address is unchanged.'
 }

Wichtig ist, dass die Module „AzureRM.Profile“ und „AzureRM.Network“ in den Azure Automation Account über die „Modules Gallery“ hinzugefügt wurden.

Viel Spaß damit!

Marco Viets

 

Quelle Titelbild: Pixabay