Um eine Azure VPN Verbindung mit einer dynamischen IP-Adresse verwenden zu können, kann man sich einen DynDNS Dienst und einen Automation Account zunutze machen. Durch ein Runbook wird der DynDNS Hostname aufgelöst um die IP-Adresse des lokalen Gateways zu aktualisieren. Ein Wechsel der IP-Adresse durch die Zwangstrennung oder einen unerwarteten Neustart des Routers sorgt somit nur noch für einen kurzen Ausfall der VPN Verbindung.
Um eine Azure VPN Verbindung mit DynDNS einzurichten kann zum Beispiel der kostenlose DynDNS Anbieter No-IP verwendet werden, bei diesen Anbieter muss nur darauf geachtet werden, dass der Account alle 30 Tage bestätigt werden muss. Da der Automation Account jedoch nur ein Workaround ist, bis eine feste IP-Adresse für den Anschluss gebucht wurde, ist dies meines Erachtens zu verschmerzen. Wenn der Dienst länger verwendet werden soll, macht es Sinn sich für eine bezahlte Variante zu entscheiden. Alternativ gibt es noch viele weitere kostenlose Anbieter, diese führe ich nun allerdings nicht auf, da sich diese auch gerne ändern.
Das PowerShell Skript für das Runbook befindet sich am Ende des Artikels.
Ressourcengruppen erstellen
Für den Automation Account wurde eine zusätzliche Ressourcengruppe erstellt. In der Ressourcengruppe rg-infrastructure befinden sich alle Ressourcen die zum Betrieb einer VM und eines VPN Gateways notwendig sind. In der Ressourcengruppe rg-automation befindet sich der Automation Account und das Runbook.

Diese Trennung wurde bewusst so gewählt, damit die Ressourcengruppe rg-automation einfach gelöscht werden kann wenn ihr Life Cycle beendet ist. Der Life Cycle ist beendet, wenn eine feste IP-Adresse für den Anschluss gebucht wurde.
Erstellen der Automation Accounts
In der zuvor erstellen Ressourcengruppe rg-automation wurde der Automation Account hinzugefügt.

Module importieren
Die Module AzureRM.profile und AzureRM.Network müssen über die Module Gallery importiert bzw. aktuallisiert werden.

Zeitplan erstellen
Damit das Runbook regelmäßig ausgeführt wird, ist es notwendig ein Zeitplan zu erstellen.

Ich habe mich für eine stündliche Ausführung entschieden, damit regelmäßig überprüft wird ob sich die IP-Adresse geändert hat. Im Normalfall sollte dies nur einmal am Tag vorkommen. In einer Fritzbox kann zum Beispiel eingestellt werden, das die Zwangstrennung immer Nachts erfolgen soll. Sollte sich die IP-Adresse jedoch über Tage ändern, weil sich zum Beispiel der Router nach einem Stromausfall neu einwählt, wird die IP-Adresse des lokalen Gateways schnell angepasst, sodass die VPN Verbindung wiederhergestellt werden kann.
Runbook importieren
Als nächstes wird das Runbook dem Automation Account hinzugefügt.

Das Runbook kann einfach als PowerShell Skript importiert werden.

Variablen anpassen
Nachdem das Runbook importiert wurde, müssen die Variablen angepasst werden. Damit das Runbook ausgeführt werden kann, muss es nun anschließend veröffentlicht werden.

Zeitplan zuweisen
Dem veröffentlichtem Runbook kann nun der vorher erstellte Zeitplan zugewiesen werden.

Testen des Runbooks
Um das Runbook nun zu testen, kann dieses auf der Übersichtseite manuell gestartet werden.

In den Logs kann anschließend überprüft werden, ob die Ausführung des Runbooks erfolgreich war.

Da sich die IP-Adresse nicht geändert hat, muss das Gateway auch nicht angepasst werden.

Da sich die IP-Adresse des Anschlusses geändert hat wurde die IP-Adresse des lokalen Gateways erfolgreich aktualisiert, somit wird die VPN Verbindung wieder
Fazit
Azure Runbooks sind ein mächtiges Werkzeug. Dank ihnen ist es möglich eine Azure VPN Verbindung mit einer dynamischen IP-Adresse einzurichten. Grade für kleinere Unternehmen die aktuell keinen Business Anschluss mit fester IP-Adresse besitzen ist dies eine Möglichkeit trotzdem ihre Infrastruktur in die Cloud zu verlagern.
PowerShell Skript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | Import-Module AzureRM.Network # define variables $connectionName = "AzureRunAsConnection" $dynamicDnsHostname = "your DynDNS hostname" $resourcegroupname = "name of your ressource group" $localnetworkgatewayname = "name of your local network gateway" # 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 = [System.Net.Dns]::GetHostAddresses(„$($dynamicDnsHostname)“) | Select-Object -First 1 -ExpandProperty IPaddressToString # Get local network gateway $lnGateway = Get-AzureRmLocalNetworkGateway -ResourceGroupName $resourcegroupname -Name $localnetworkgatewayname # Get local network gateway address $lnGatewayIP = $lnGateway.GatewayIpAddress # compare IPs and update if required If ($currentIp -ne $lnGateway.GatewayIpAddress) { Write-Output "Updating local network Gateway IP address ($lnGatewayIP) to $currentIp" $lnGateway.GatewayIpAddress = $currentIp Set-AzureRmLocalNetworkGateway -LocalNetworkGateway $lnGateway } Else { Write-Output "Local network gateway IP address ($lnGatewayIP) is unchanged." } |