Azure DNS Records dynamisch aktualisieren

Dynamische DNS Dienste wie z.B. DynDNS sind heute im privaten Umfeld weit verbreitet, um seinen Consumer-DSL-Anschluss per Namensauflösung erreichbar zu machen.

Möchte man jedoch z.B. seine Webseite auf einem eigenen Server an diesen DSL-Anschlüssen mit eigenem Domain-Namen nutzen, bleibt im Regelfall nur die Nutzung eines Hosting-Anbieters, bei dem man einen CNAME seines Domain-Namens auf den DynDNS-Namen anlegen kann. Das kann an der einen oder anderen Stelle jedoch zu Problemen führen und ist nicht optimal.

Eine kostengünstige Alternative ist die Nutzung des DNS-Services in Microsoft Azure. Leider gibt es hierfür jedoch keinen Update-Client wie für DynDNS, da sich Microsoft Azure nicht als Anbieter von dynamischem DNS versteht. Glücklicherweise bietet Microsoft jedoch ein PowerShell Modul, mit dem Azure Resourcen remote administriert werden können. Das mache ich mir zu Nutze, indem ich ein Script zum Vergleichen von DNS-IP und WAN-IP inkl. Update per Scheduled Task ausführe.

Voraussetzungen:

  • Microsoft Azure
    • Eine Resource Group für DNS muss angelegt sein
    • Eine DNS Zone und entsprechende Host-Records müssen angelegt sein.
    • Ein User mit Berechtigungen zur DNS-Record-Änderung muss in der Cloud existieren ohne MFA (ja, ich weiß :-), es gibt hier ja glücklicherweise auch andere/bessere Anmeldmethoden, ist hier nur der Einfachheit halber)
  • Domain Hoster
    • Die DNS Server von Microsoft Azure müssen für die Domain als Name-Server eingetragen sein.
  • Lokal/Client
    • AzureRM (Update 22.07.2020: Az!) PowerShell Modul muss installiert sein
    • Eine Credential XML Datei muss erstellt und in einem Ordner abgelegt sein (z.B.: C:\Scripts\Microsoft\Azure\DNS\AzureCredentials.xml).

Im folgenden Beispiel möchte ich den Host www der Domain domain.com überprüfen und aktualisieren, wenn sich die WAN-IP Adresse geändert hat und vom DNS-Wert abweicht. Die Resource Group nenne ich in diesem Beispiel einfach Azure-DNS.

Das Script läuft in folgenden Schritten ab:

  • PowerShell Modul für die Azure Remote Verwaltung wird importiert/geladen.
  • Der Pfad zur Credential XML Datei wird definiert.
  • Die aktuelle WAN IP wird abgefragt.
  • Die aktuelle DNS IP wird abgefragt
  • Die WAN IP wird mit der DNS IP verglichen.
  • Weichen die IPs voneinander ab?
    • Die Azure Credentials werden importiert und ein Login zu Azure durchgeführt.
    • Die DNS IP wird mit dem Wert der WAN IP aktualisiert.
    • Das Script wird beendet.
  • Weichen die IPs nicht voneinander ab?
    • Das Script wird beendet.
# Import required Modules
Import-Module AzureRM
# Configure Execution Directory / Script Path
$ScriptPath = C:\Scripts\Microsoft\Azure\DNS
# Query Public IPv4 Address from WAN-Interface
$WanIp4 = Invoke-RestMethod http://ipinfo.io/json | Select-Object -ExpandProperty ip
# Query current DNS-Record
$DnsIp4 = [System.Net.Dns]::GetHostAddresses("www.domain.com") | Select-Object -ExpandProperty IPAddressToString

If ($WanIp4 -ne $DnsIp4) {
# Connect to Azure Platform
  $Credentials = Import-Clixml -Path $ScriptPath"\AzureCredentials.xml"
  Login-AzureRmAccount -Credential $Credentials
# Update DNS-Record
  $RS = Get-AzureRmDnsRecordSet -Name "www" -RecordType A -ZoneName "domain.com" -ResourceGroupName "Azure-DNS"
  $RS.Records[0].Ipv4Address = $WanIp4
  Set-AzureRmDnsRecordSet -RecordSet $RS
}
Else {
}

Update 22.07.2020

Seit Dezember 2018 sind die Azure PowerShell Az Module offiziell veröffentlicht und nun die bevorzugten Module für die Azure Verwaltung. Az wird auch von PowerShell Core unterstützt und hat ähnliche Befehle, wie AzureRM. Allerdings können AzureRM und Az nicht gleichzeitig installiert sein, sodass bei einer Migration der Module das Script entsprechend auf die neuen Befehle angepasst werden muss.

# Import required Modules
Import-Module Az
# Configure Execution Directory / Script Path
$ScriptPath = C:\Scripts\Microsoft\Azure\DNS
# Query Public IPv4 Address from WAN-Interface
$WanIp4 = Invoke-RestMethod http://ipinfo.io/json | Select-Object -ExpandProperty ip
# Query current DNS-Record
$DnsIp4 = [System.Net.Dns]::GetHostAddresses("www.domain.com") | Select-Object -ExpandProperty IPAddressToString

If ($WanIp4 -ne $DnsIp4) {
# Connect to Azure Platform 
  $Credentials = Import-Clixml -Path $ScriptPath"\AzureCredentials.xml"
  Connect-AzAccount -Credential $Credentials
# Update DNS-Record
  $RS = Get-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "domain.com" -ResourceGroupName "Azure-DNS"
  $RS.Records[0].Ipv4Address = $WanIp4
  Set-AzDnsRecordSet -RecordSet $RS
}
Else {
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.