Hoe Rol je Je Eigen Dynamische DNS-met AWS Route 53

0
39

Als je hebt servers running in huis, u zult niet in staat zijn om de route van een domein zonder dat een statisch IP-adres. In plaats van te betalen voor een dynamische DNS-service, kunt u het bouwen van uw eigen met behulp van AWS Route 53.

Dynamic DNS Is niet Ingewikkeld

Dynamic DNS, is het vrij eenvoudig in concept. Een daemon draait op de client-machine, en controleert regelmatig de openbare IP-adres voor eventuele wijzigingen. Als het IP-adres verandert, de daemon stuurt een update van de DNS-provider, die wijzigingen in de record. Dit wordt vaak aangeboden als een betaalde dienst op veel domain registrars en DNS-providers.

AWS het niet hebben van een specifieke service voor het leveren van dynamische DNS, maar het is vrij eenvoudig om zelf instelt. De “AWS” manier om dit te doen zou zijn om het opzetten van een CloudWatch gebeurtenis die de aanleiding is tot een Lambda functie in reactie op wijzigingen in de infrastructuur. (Hoewel je moet wel gewoon gebruik maken van een load balancer, en automatische schaling van de groep in de meeste scenario ‘ s.)

Echter, als u wilt instellen dynamische DNS voor een home server of een andere niet-AWS-apparaat dat voorzien zal zijn van frequent van IP-adres verandert, scripting is het vrij gemakkelijk. Route 53 heeft een eenvoudige CLI commando ‘ s die u kunt gebruiken om de DNS-records bijwerken van de commando-regel; het aansluiten op een cron job die horloges voor een wijziging van het openbare IP-adres en wordt de AWS CLI zal de klus te klaren.

Zoveel prijzen gaat, Route 53 hoeft echt niet veel te kosten—een flatscreen $0.50 per maand vergoeding voor elke domein naam, plus een paar kleine kosten voor DNS-zoekacties op basis van gebruik. A-records zijn gratis (de meest voorkomende lookup), zodat u waarschijnlijk niet meer dan een paar centen per maand op uw rekening tenzij je trekken ernstige verkeer. Ter vergelijking, de DynDNS prijzen starten bij $55 per jaar.

Het instellen van de AWS-Kant van de Dingen

Aan de slag, ga dan naar de AWS Route 53 Management console. Als u niet beschikt over een domein, kunt u zich registreren onder “Geregistreerde Domeinen” voor redelijk goedkope, meestal gewoon de prijs van de ICANN inschrijvingsgeld. Als u uw domein is momenteel niet in de Route 53, u zult moeten overbrengen op, die is een eenvoudig maar langdurig proces.

Vinden of te creëren dat de gehost zone voor uw domein, waarin alle records. U wilt een notitie te maken van de hosted zone-ID, als je het nodig hebt voor het script.

Wil je een tijdelijke aanduiding voor Een record, dus dat het script heeft iets verwijzen. U kunt dit instellen op iets wat uiteraard niet correct 255.255.255.255 zou werken—om het script te testen van de functionaliteit.

Daarnaast moet u voor het instellen van de AWS CLI, wat u kunt doen met:

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

En te configureren met een IAM gebruikersgegevens met:

aws2 configureren

Het schrijven van het Script

Als je alleen het script, kunt u verwijzen naar deze kern, maar we zullen uitleggen hoe het is opgezet, omdat het cool is. Als je gewoon kopiëren en plakken, moet u het wijzigen van de HOSTED_ZONE_ID en de NAAM van variabelen overeenkomen met de record die u probeert te werken. Dit script maakt ook gebruik van de aws2 CLI, die je zult moeten wijzigen als u het versienummer 1.

Ten eerste, we ‘ re gonna moet een manier zijn om onze openbare IP-adres in het programma. Hiervoor kunnen we gebruik maken van AWS s checkip.amazonaws.com API. Het is geheel gratis, en er is geen snelheidslimiet. U kan ook gebruik maken van api.ipify.org voor dit doel, die is ook gratis en onbeperkt. We laden deze in een variabele opslaan voor later.

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

Volgende, we hebben te valideren, dit om ervoor te zorgen dat we terug een geldig IP-adres en niet een foutcode of iets verkeerd. Gewoon controleren of de input periode gescheiden getallen is genoeg voor dit doel, dus beetje regex naast het = – ~ operator (geeft als resultaat true als regex de linkerkant het input, erg handig) zal doen de truc:

als [[ ! $IP =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; dan
afslag 1
fi

We hebben deze te vergelijken met onze oude IP-adres om te zien of er iets veranderd. We konden slaan deze op schijf opgeslagen als een bestand in de /tmp/, maar dat is rommelig en gevoelig voor fouten. In plaats daarvan gaan we query Route 53 direct met lijst-bronrecord-sets, en filter het IP-adres van het record dat we proberen te werken met jq:

aws2 route53 lijst-bronrecord-sets –hosted-zone-id Z1VCYR76DBUXPL |
jq -r ‘.ResourceRecordSets[] | selecteren (.Naam == “‘”$NAAM”‘”) | selecteren (.Type == “‘”$TYPE”‘”) | .ResourceRecords[0].De waarde’ > /tmp/current_route53_value

Dit bespaart het om /tmp/current_route53_value, die we dan kunnen gebruiken om te controleren met grep, die is tamelijk veerkrachtige:

als grep -Fxq “$IP” /tmp/current_route53_value; vervolgens
echo “IP Is Niet Veranderd, Verlaten”
afslag 1
fi

Eindelijk, we bereiden de lading voor de verandering-bronrecord-sets. Dit dient te worden in JSON, dus we zullen output naar een bestand op schijf en stuur het als een argument voor de opdracht.

cat > /tmp/route53_changes.json – < < EOF
{
“Commentaar”:”Bijgewerkt Van de DDNS-Shell Script”,
“Veranderingen”:[
{
“Actie”:”UPSERT”,
“ResourceRecordSet”:{
“ResourceRecords”:[
{
“Value”:”$IP”
}
],
“Naam”:”$NAAM”,
“Type”:”$TYPE”,
“TTL”:$TTL
}
}
]
}
EOF

#records bijwerken
aws2 route53 wijzigen-bronrecord-sets –hosted-zone-id $HOSTED_ZONE_ID –verander-batch file:///tmp/route53_changes.json

Alles komt samen in het volgende script. Je wilt wijzigen van de HOSTED_ZONE_ID en de NAAM van variabelen overeenkomen met de record die u probeert te werken. Merk op dat de NAAM heeft van een punt aan het einde.

#!/bin/bash

#Declaratie Van De Variabele – Veranderen
HOSTED_ZONE_ID=”XXXXXXXXXXXX”
NAME=”example.com.”
TYPE=”A”
TTL=60

#current IP-adres
IP=$(krul http://checkip.amazonaws.com/)

#valideer IP-adres (zorgt ervoor Route 53 niet bijgewerkt met een verkeerde lading)
als [[ ! $IP =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; dan
afslag 1
fi

#current
aws2 route53 lijst-bronrecord-sets –hosted-zone-id $HOSTED_ZONE_ID |
jq -r ‘.ResourceRecordSets[] | selecteren (.Naam == “‘”$NAAM”‘”) | selecteren (.Type == “‘”$TYPE”‘”) | .ResourceRecords[0].De waarde’ > /tmp/current_route53_value

cat /tmp/current_route53_value

#controleren of het IP-afwijkt van de Route 53
als grep -Fxq “$IP” /tmp/current_route53_value; vervolgens
echo “IP Is Niet Veranderd, Verlaten”
afslag 1
fi

echo “IP Veranderd, Records Bijwerken”

#maak route 53 lading
cat > /tmp/route53_changes.json – < < EOF
{
“Commentaar”:”Bijgewerkt Van de DDNS-Shell Script”,
“Veranderingen”:[
{
“Actie”:”UPSERT”,
“ResourceRecordSet”:{
“ResourceRecords”:[
{
“Value”:”$IP”
}
],
“Naam”:”$NAAM”,
“Type”:”$TYPE”,
“TTL”:$TTL
}
}
]
}
EOF

#records bijwerken
aws2 route53 wijzigen-bronrecord-sets –hosted-zone-id $HOSTED_ZONE_ID –verander-batch file:///tmp/route53_changes.json >> /dev/null

Stel Uw Crontab

U kunt uw crontab met:

crontab -e

U kunt dit script uitvoeren elke minuut, want het is vrij licht van gewicht. Geef cron een pad naar uw script op de schijf. U kunt de output naar een log bestand, of naar /dev/null als u niet wilt om te gaan.

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