How to Roll your Own Dynamic DNS mit AWS Route 53

0
231

Wenn Sie haben, Server läuft zu Hause, werden Sie nicht in der Lage zu route eine domain, um Sie ohne eine statische IP-Adresse. Anstelle der Zahlung für einen dynamischen DNS-Dienst, können Sie bauen Ihre eigenen mit AWS Route 53.

Dynamic DNS Ist nicht Kompliziert

Dynamic DNS ist ziemlich einfach im Konzept. Ein daemon läuft auf der client-Maschine, und prüft regelmäßig die öffentliche IP-Adresse ändert. Wenn die IP-Adresse ändert, wird der daemon sendet ein update an den DNS-provider, die änderungen des Datensatzes. Dies ist oft als ein Kostenpflichtiger service, der bei vielen domain-Registrare und DNS-Anbieter.

AWS nicht über einen spezifischen Dienst für dynamische DNS -, aber es ist Recht einfach selbst einrichten. Die “AWS-Weg” dies zu tun wäre, um das einrichten eines CloudWatch-Ereignis auslöst, eine Lambda-Funktion, die in Reaktion auf änderungen der Infrastruktur. (Obwohl Sie sollten wahrscheinlich nur mit einem load-balancer-und auto scaling-Gruppe in den meisten Szenarien.)

Allerdings, wenn Sie möchten einrichten der dynamischen DNS für einen home-server oder einem anderen nicht-AWS-Gerät, wird oft die IP-Adresse ändert, scripting, es ist ziemlich einfach. Route 53 hat einfache CLI-Befehle, die Sie verwenden können, um die DNS-Einträge aktualisieren von der Befehl-Linie; Haken dieses bis zu einem cron-job, der Uhren für eine änderung der öffentlichen IP-Adresse und führt die AWS CLI wird den job zu erledigen.

Soweit Preisgestaltung geht, Route 53 nicht wirklich viel Kosten—eine flache $0,50 pro Monat Gebühr für jede domain-Namen, plus ein paar geringfügige Gebühren für DNS-lookups je nach Nutzung. A-Einträge sind kostenlos (die meisten common-lookup), so dass Sie wahrscheinlich nicht sehen, mehr als ein paar Pfennige pro Monat auf Ihre Rechnung, es sei denn, Sie ziehen schwere Verkehr. Zum Vergleich, DynDNS-Preisgestaltung beginnt bei $55 pro Jahr.

Einrichten der AWS-Seite der Dinge

Um loszulegen, Kopf über die AWS Route 53 Management-Konsole. Wenn Sie nicht über eine domain, können Sie sich unter “Registrierte Domains” für ziemlich Billig, in der Regel nur der Preis der ICANN-Registrierung Gebühr. Wenn Sie Ihre domain ist derzeit nicht in der Route 53, Sie müssen übertragen Sie es auf, was ist eine einfache, aber langwieriger Prozess.

Finden oder erstellen Sie die gehostete zone für Ihre domain, die enthalten alle Datensätze. Sie wollen notieren Sie sich die Hosting-zone-ID, wie Sie es benötigen für das script.

Möchten Sie einen Platzhalter Ein Datensatz, so dass das script etwas zu verweisen. Können Sie hier etwas offensichtlich nicht korrekt—255.255.255.255 funktionieren würde—um das Skript zu testen die Funktionalität.

Sie müssen auch das einrichten der AWS CLI, die Sie tun können, mit:

curl “https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip” -o “awscliv2.zip”
entpacken awscliv2.zip
sudo ./aws/installieren

Und konfigurieren Sie es mit einem IAM-Benutzer-Anmeldeinformationen mit:

aws2 konfigurieren

Das Skript zu schreiben

Wenn Sie wollen einfach nur das Skript, Sie können sich auf das wesentliche, aber wir werden erklären, wie es eingerichtet ist, denn es ist kühl. Wenn Sie nur kopieren und einfügen, müssen Sie ändern Sie die HOSTED_ZONE_ID und benennen von Variablen entsprechen den Datensatz, den Sie versuchen, zu aktualisieren. Beachten Sie, dass dieses Skript auch verwendet aws2 CLI, die Sie ändern müssen, wenn Sie mit version 1.

Zunächst, wir sind gonna brauchen einen Weg, um unsere öffentliche IP-Adresse programmgesteuert. Für diese können wir verwenden, AWS checkip.amazonaws.com API. Es ist völlig kostenlos, und es gibt kein limit. Man könnte Sie auch verwenden api.ipify.org für diesen Zweck, die ist auch kostenlos und unbegrenzt. Wir laden diese in eine variable und speichern Sie Sie für später.

IP=$(curl https://api.ipify.org/)

Als Nächstes müssen wir überprüfen, um sicherzustellen, dass wir wieder eine gültige IP-Adresse und nicht ein Fehler code oder etwas fehlerhaftes. Einfach überprüfen, dass die Eingabe von Zeitraum-getrennt zahlen ist genug für diesen Zweck, so ein bisschen regex neben dem = ~ – operator (gibt true zurück, wenn der reguläre Ausdruck entspricht der linken Seite-Eingang, sehr nützlich) wird den trick tun:

if [[ ! $IP =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; dann
exit 1
fi

Wir vergleichen dies mit unserer alten IP-Adresse, um zu sehen, ob sich etwas geändert. Wir könnten speichern diese auf der Festplatte als Datei in /tmp/, aber das ist aufwändig und fehleranfällig. Stattdessen werden wir-Abfrage Route 53, die direkt mit Liste-Ressource-record-sets und filtern Sie die IP-Adresse aus dem Datensatz, den wir versuchen zu aktualisieren, mit jq:

aws2 route53-Liste-Ressource-record-sets –hosted-zone-id Z1VCYR76DBUXPL |
jq -r ‘.ResourceRecordSets[] | select – (.Name == “‘”$NAME”‘”) | select – (.Type == “‘”$TYP”‘”) | .ResourceRecords[0].Wert’ > /tmp/current_route53_value

Dieses speichert Sie in /tmp/current_route53_value, die wir dann verwenden können, um zu überprüfen, mit grep, und ist ziemlich widerstandsfähig:

wenn grep -Fxq “$IP” /tmp/current_route53_value; dann
echo “IP Hat sich Nicht Geändert, Exiting”
exit 1
fi

Schließlich bereiten wir die Nutzlast für den Wandel-Ressource-record-sets. Diese Bedürfnisse werden im JSON-Format, also müssen wir die Ausgabe in eine Datei auf der Festplatte und senden Sie es als ein argument für den Befehl.

cat > /tmp/route53_changes.json << EOF
{
“Comment”:”Aktualisiert der DDNS-Shell-Skript”,
“Veränderungen”:[
{
“Action”:”UPSERT”,
“ResourceRecordSet”:{
“ResourceRecords”:[
{
“Wert”:”$IP”
}
],
“Name”:”$NAME”,
“Type”:”$ART”,
“TTL”:$TTL
}
}
]
}
EOF

#aktualisieren von Datensätzen
aws2 route53 ändern-Ressource-record-sets –hosted-zone-id $HOSTED_ZONE_ID –change-batch-file:///tmp/route53_changes.json

Alles kommt zusammen, um das folgende Skript. Sie möchten, ändern Sie die HOSTED_ZONE_ID und benennen von Variablen entsprechen den Datensatz, den Sie versuchen, zu aktualisieren. Beachten Sie, dass NAMEN einen Punkt am Ende.

#!/bin/bash

#Deklaration Von Variablen – Ändern Sie Diese
HOSTED_ZONE_ID=”XXXXXXXXXXXX”
NAME=”example.com.”
TYPE=”A”
TTL=60

#aktuelle IP-Adresse
IP=$(curl http://checkip.amazonaws.com/)

#Validierung der IP-Adresse (stellt sicher, dass Route 53 nicht aktualisiert mit einem fehlerhaften Nutzlast)
if [[ ! $IP =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; dann
exit 1
fi

#Holen Sie sich die aktuellen
aws2 route53-Liste-Ressource-record-sets –hosted-zone-id $HOSTED_ZONE_ID |
jq -r ‘.ResourceRecordSets[] | select – (.Name == “‘”$NAME”‘”) | select – (.Type == “‘”$TYP”‘”) | .ResourceRecords[0].Wert’ > /tmp/current_route53_value

cat /tmp/current_route53_value

#überprüfen, ob die IP ist Verschieden von Route 53
wenn grep -Fxq “$IP” /tmp/current_route53_value; dann
echo “IP Hat sich Nicht Geändert, Exiting”
exit 1
fi

echo “die IP sich Geändert hat, Aktualisieren von Datensätzen”

#vorbereiten route 53 Nutzlast
cat > /tmp/route53_changes.json << EOF
{
“Comment”:”Aktualisiert der DDNS-Shell-Skript”,
“Veränderungen”:[
{
“Action”:”UPSERT”,
“ResourceRecordSet”:{
“ResourceRecords”:[
{
“Wert”:”$IP”
}
],
“Name”:”$NAME”,
“Type”:”$ART”,
“TTL”:$TTL
}
}
]
}
EOF

#aktualisieren von Datensätzen
aws2 route53 ändern-Ressource-record-sets –hosted-zone-id $HOSTED_ZONE_ID –change-batch-file:///tmp/route53_changes.json – > > /dev/null

Richten Sie Ihre Crontab

Bearbeiten Sie Ihre crontab mit:

crontab -e

Sie können dieses Skript jede minute ausführen, da es ziemlich leicht. Geben cron ein Weg, um Ihr Skript auf der Festplatte. Du kannst die Ausgabe in eine Logdatei oder nach /dev/null wenn Sie nicht wollen, zu beschäftigen.

* * * * * /home/user/update_dns.sh >/dev/null 2>&1