Hur att Rulla Dina Egna Dynamiska DNS-med AWS Väg 53

0
221

Om du har servrar som kör hemma, du kommer inte att kunna dirigera en domän utan en statisk IP-adress. Istället för att betala för en dynamisk DNS-tjänst, kan du bygga din egen med hjälp av AWS Väg 53.

Dynamisk DNS Är inte Komplicerat

Dynamisk DNS är ganska enkelt koncept. En daemon körs på klientdatorn, och regelbundet kontrollerar en offentlig IP-adress för eventuella ändringar. Om IP-adressen ändras, demonen skickar en uppdatering till DNS-leverantör, som ändrar posten. Här erbjuds ofta som en betaltjänst på många domänregistratorer och DNS-leverantörer.

AWS inte har en särskild service för att ge dynamisk DNS, men det är ganska enkelt att ställa upp själv. Den “AWS sätt” för att göra detta skulle vara att sätta upp en CloudWatch händelse som utlöser en Lambda funktion i respons till förändringar i infrastrukturer. (Även om du bör nog använda en lastbalanserare och automatisk skalning grupp i de flesta scenarier.)

Men om du vill konfigurera dynamisk DNS för en home server eller annan icke-AWS enhet som kommer att ha täta IP-adress ändras, scripting det är ganska lätt. Väg 53 har enkel CLI-kommandon som du kan använda för att uppdatera DNS-poster från kommandoraden; att haka upp detta till ett cron-jobb som klockor för en förändring av den allmänna IP-adressen och kör AWS CLI kommer att få jobbet gjort.

Så långt som prissättning går, Väg 53 egentligen inte kostar så mycket—en platt $0,50 per månad avgift för varje domännamn, plus några mindre avgifter för DNS-uppslagningar baserat på användning. Ett register är gratis (de vanligaste lookup), så du kommer antagligen inte att se mer än några ören per månad på din faktura om du drar allvarliga trafik. För jämförelse, DynDNS prissättning börjar på $55 per år.

Att sätta Upp AWS Sida av Saker och ting

För att komma igång, chef över till AWS Väg 53 Management console. Om du inte har en domän, kan du registrera dig under “Registrerade Domäner” för ganska billigt, oftast bara priset för ICANN anmälningsavgiften. Om din domän är för närvarande inte i Väg 53, måste du överföra den, vilket är en enkel men långdragen process.

Hitta eller skapa värd zon för din domän, som kommer att innehålla alla poster. Vill du vara del av den värd zon-ID, som du kommer att behöva det för skriptet.

Vill du göra en platshållare för En post, så att skriptet har något att referera till. Du kan ställa in den här till något som uppenbarligen inte är korrekt—255.255.255.255 skulle fungera att testa skriptet funktionalitet.

Du kommer också att behöva ställa in AWS CLI, som du kan göra med:

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

Och konfigurera det med en IAM användaridentifiering med:

aws2 konfigurera

Skriva Manus

Om du bara vill skript, kan du hänvisa till denna sammanfattning, men vi kommer att förklara hur det är att ställa upp, eftersom det är coolt. Om du bara kopiera och klistra in måste du ändra HOSTED_ZONE_ID och NAMN på variabler för att matcha in du försöker att uppdatera. Observera att skriptet använder också aws2 CLI, som du kommer att behöva ändra om du använder version 1.

Först ut, vi kommer att behöva ett sätt att få våra offentlig IP-adress automatiskt. För detta kan vi använda AWS s checkip.amazonaws.com API. Det är helt och hållet gratis, och det är ingen gräns. Du kan även använda api.ipify.org för detta ändamål, vilket också är fri och obegränsad. Vi kommer läsa detta i en variabel och spara den till senare.

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

Nästa, vi måste godkänna detta för att se till att vi fick tillbaka en giltig IP-adress och inte ett fel kod eller någonting felaktigt. Att helt enkelt kontrollera att ingången är punktavgränsad nummer är tillräckligt för detta ändamål, så lite regex längs =~ operatör (returnerar sant om regex matchar vänster ingång, mycket användbart) kommer att göra susen:

om [[ ! $IP =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; sedan
utgång 1
fi

Vi kommer att jämföra detta till våra gamla IP-adress för att se om något förändrats. Vi kan lagra den på hårddisken som en fil i /tmp/, men det är rörigt och risk för fel. Istället ska vi fråga Väg 53 direkt med list-resurs-post-apparater, och filtrera IP-adress ur den post som vi försöker att uppdatera med jq:

aws2 route53 lista-resurs-post-set –värd-zon-id Z1VCYR76DBUXPL |
jq -r”.ResourceRecordSets[] | välja (.Namn == “‘”$NAMN”‘”) | välj (.Typ == “‘”$TYP”””)|.ResourceRecords[0].Värdet ” > /tmp/current_route53_value

Detta sparar det till /tmp/current_route53_value, som vi sedan kan använda för att kontrollera med grep, vilket är ganska motståndskraftig:

om grep -Fxq “$IP” /tmp/current_route53_value; sedan
echo “IP Har Inte Förändrats, Spännande”
utgång 1
fi

Slutligen, vi förbereda nyttolast för förändring-resurs-post-apparater. Detta måste vara i JSON, så vi ska ut till en fil på hårddisken och skicka det som ett argument till kommandot.

cat > /tmp/route53_changes.json << EOF
{
“Kommentar”:”Uppdateras Från DDNS Shell Script”,
“Förändringar”:[
{
“Åtgärd”:”UPPDATERA”,
“ResourceRecordSet”:{
“ResourceRecords”:[
{
“Värde”:”$IP”
}
],
“Name”:”$NAMN”,
“Typ”:”$TYPE”,
“TTL”:$TTL
}
}
]
}
EOF

#uppdatera poster
aws2 route53 förändring-resurs-post-set –värd-zon-id $HOSTED_ZONE_ID-ändra-batch file:///tmp/route53_changes.json

Allt kommer tillsammans att bilda följande skript. Du kommer att vilja ändra HOSTED_ZONE_ID och NAMN på variabler för att matcha in du försöker att uppdatera. Notera att NAMN har en period på slutet.

#!/bin/bash

#Variabel Förklaring – Att Ändra Dessa
HOSTED_ZONE_ID=”XXXXXXXXXXXX”
NAMN=”example.com.”
TYPE=”A”
TTL=60

#få aktuell IP-adress
IP=$(curl http://checkip.amazonaws.com/)

#bekräfta IP-adress (ser till Väg 53 inte uppdateras med en missbildad nyttolast)
om [[ ! $IP =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; sedan
utgång 1
fi

#få nuvarande
aws2 route53 lista-resurs-post-set –värd-zon-id $HOSTED_ZONE_ID |
jq -r”.ResourceRecordSets[] | välja (.Namn == “‘”$NAMN”‘”) | välj (.Typ == “‘”$TYP”””)|.ResourceRecords[0].Värdet ” > /tmp/current_route53_value

cat /tmp/current_route53_value

#kontrollera om IP är olika från Route 53
om grep -Fxq “$IP” /tmp/current_route53_value; sedan
echo “IP Har Inte Förändrats, Spännande”
utgång 1
fi

echo “IP Ändras, Uppdatera Register”

#förbered rutt 53 nyttolast
cat > /tmp/route53_changes.json << EOF
{
“Kommentar”:”Uppdateras Från DDNS Shell Script”,
“Förändringar”:[
{
“Åtgärd”:”UPPDATERA”,
“ResourceRecordSet”:{
“ResourceRecords”:[
{
“Värde”:”$IP”
}
],
“Name”:”$NAMN”,
“Typ”:”$TYPE”,
“TTL”:$TTL
}
}
]
}
EOF

#uppdatera poster
aws2 route53 förändring-resurs-post-set –värd-zon-id $HOSTED_ZONE_ID-ändra-batch file:///tmp/route53_changes.json >> /dev/null

Ställ In Din Crontab

Du kan redigera din crontab med:

crontab -e

Du kan ställa in detta script för att köra varje minut, så det är ganska lätt. Ge cron-en väg till ditt manus på disk. Du kan skicka utdata till en logg-fil, eller till /dev/null om du inte vill ta itu med det.

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