Come arrotolare il DNS Dinamico con AWS Route 53

0
211

Se hai i server che eseguono a casa, non sarà in grado di reindirizzare un dominio senza un indirizzo IP statico. Invece di pagare per un servizio di DNS dinamico, è possibile creare il proprio utilizzando AWS Route 53.

DNS dinamico non È Complicato

Il DNS dinamico è abbastanza semplice come concetto. Un demone in esecuzione sulla macchina client, e controlla regolarmente il pubblico indirizzo IP per eventuali modifiche. Se l’indirizzo IP cambia, il demone invia un aggiornamento per il DNS del provider, che cambia il record. Questo è spesso offerto come un servizio a pagamento in molti registrar di domini e DNS del provider.

AWS non dispone di un servizio specifico per la fornitura di DNS dinamico, ma è abbastanza semplice da impostare voi stessi. Il “AWS modo” di fare questa sarebbe la creazione di un CloudWatch evento che attiva una funzione Lambda in risposta alle modifiche dell’infrastruttura. (Anche se probabilmente si dovrebbe usare un sistema di bilanciamento del carico e di auto-scaling gruppo nella maggior parte dei casi.)

Tuttavia, se si desidera impostare il DNS dinamico per un home server o un altro non-AWS dispositivo con frequenti modifiche dell’indirizzo IP, la creazione di script è abbastanza facile. Route 53 è semplice CLI comandi che è possibile utilizzare per aggiornare i record DNS dalla riga di comando; agganciando un cron job che orologi per modificare l’indirizzo IP pubblico e corre AWS CLI otterrà il lavoro fatto.

Per quanto pricing va, via 53 in realtà non costano molto—un piatto di $0,50 per la quota mensile per ogni nome di dominio, oltre a un paio di minori oneri per le ricerche DNS in base all’utilizzo. I record sono gratis (il più comune di ricerca), in modo che probabilmente non vedrà più di pochi centesimi per ogni mese sul tuo conto a meno che non si sta tirando stradali gravi. Per confronto, DynDNS prezzi a partire da $55 per anno.

L’impostazione di AWS Lato delle Cose

Per iniziare, oltre al capo AWS Route 53 console di Gestione. Se non si dispone di un dominio, è possibile registrare uno sotto la “registrazione Domini” per abbastanza a buon mercato, di solito il prezzo di ICANN quota di iscrizione. Se il tuo dominio non è attualmente in via 53, dovrete trasferire sopra, che è un semplice, ma il processo è lungo.

Trovare o creare l’ospitata di zona per il vostro dominio, che conterrà tutti i record. Avrai voglia di prendere nota della ospitato ID area, come avrete bisogno per lo script.

Si vuole fare un segnaposto, Un record, in modo che lo script è qualcosa a cui fare riferimento. Si può impostare qualcosa, ovviamente, non è corretto—255.255.255.255 sarebbe al lavoro per testare lo script funzionalità.

Inoltre, è necessario impostare il AWS CLI, che si può fare con:

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

E configurarlo con un IAM credenziali dell’utente con:

aws2 configurare

La scrittura di Script

Se si desidera solo lo script, è possibile fare riferimento a questa sostanza, ma ti spiegheremo come è impostato, perché è cool. Se sei solo copia e incolla, dovrete cambiare la HOSTED_ZONE_ID e variabili NOME per abbinare il record che si sta tentando di aggiornare. Si noti che questo script utilizza anche il aws2 CLI, che dovrete cambiare se si sta utilizzando la versione 1.

Prima di tutto, stiamo andando a bisogno di un modo per ottenere il nostro pubblico di indirizzi IP a livello di programmazione. Per questo, siamo in grado di utilizzare AWS s checkip.amazonaws.com API. È completamente gratuito, e non c’è nessun limite di velocità. Si potrebbe anche usare api.ipify.org per questo scopo, che è anche gratuito e illimitato. Ci caricare questo in una variabile e salvarlo per dopo.

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

A quel punto, avremo per convalidare questo per assicurarsi che abbiamo ottenuto un indirizzo IP valido e non un codice di errore o qualcosa di non valido. Semplicemente verifica che l’ingresso è periodo di numeri separati è sufficiente per questo scopo, in modo da po ‘ di regex insieme i =~ operatore (restituisce true se l’espressione regolare corrisponde al lato sinistro ingresso, molto utile) farà il trucco:

se [[ ! $IP =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; quindi
uscita 1
fi

Dovremo confrontare questo con il nostro vecchio indirizzo IP per vedere se qualcosa è cambiato. Si potrebbe archiviare questo su disco come file in /tmp, ma disordinato e soggetta a errori. Invece, ti query Route 53 direttamente con lista-resource-record-set, e il filtro l’indirizzo IP del disco che stiamo cercando di aggiornare con jq:

aws2 route53 elenco-resource-record-set-ospitata-zona-id Z1VCYR76DBUXPL |
jq -r ‘.ResourceRecordSets[] | select (.Nome == “‘”$NOME”‘”) | (selezionare.Tipo == “‘”$TIPO”‘”) | .ResourceRecords[0].Valore’ > /tmp/current_route53_value

Questo salva in /tmp/current_route53_value, che si può utilizzare per controllare con grep, il che è abbastanza resiliente:

se grep -Fxq “$IP” /tmp/current_route53_value; poi
echo “IP Non È Cambiato, Uscita”
uscita 1
fi

Infine, prepariamo il payload per il cambiamento-resource-record-set. Questo deve essere in JSON, quindi avremo l’output a un file su disco e inviarlo come argomento al comando.

cat > /tmp/route53_changes.json << EOF
{
“Comment”:”Aggiornato Dal DDNS Script di Shell”,
“Modifiche”:[
{
“Azione”:”UPSERT”,
“ResourceRecordSet”:{
“ResourceRecords”:[
{
“Value”:”$IP”
}
],
“Nome”:”$NOME”,
“Type”:”$TIPO”,
“TTL”:$TTL
}
}
]
}
EOF

#aggiornamento dei record
aws2 route53 cambiare-resource-record-set-ospitata-zona-id $HOSTED_ZONE_ID –change-batch file:///tmp/route53_changes.json

Tutto viene insieme per formare il seguente script. Si può decidere di cambiare il HOSTED_ZONE_ID e variabili NOME per abbinare il record che si sta tentando di aggiornare. Nota che il NOME ha un periodo alla fine.

#!/bin/bash

#Dichiarazione Di Variabile – Modificare Queste
HOSTED_ZONE_ID=”XXXXXXXXXXXX”
NAME=”example.com.”
TYPE=”A”
TTL=60

#ottenere indirizzo IP corrente
IP=$(curl http://checkip.amazonaws.com/)

#convalidare l’indirizzo IP (consente di verificare Route 53 non viene aggiornato con un formato non valido payload)
se [[ ! $IP =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; quindi
uscita 1
fi

#ottenere corrente
aws2 route53 elenco-resource-record-set-ospitata-zona-id $HOSTED_ZONE_ID |
jq -r ‘.ResourceRecordSets[] | select (.Nome == “‘”$NOME”‘”) | (selezionare.Tipo == “‘”$TIPO”‘”) | .ResourceRecords[0].Valore’ > /tmp/current_route53_value

cat /tmp/current_route53_value

#controlla se l’IP è diverso da Route 53
se grep -Fxq “$IP” /tmp/current_route53_value; poi
echo “IP Non È Cambiato, Uscita”
uscita 1
fi

echo “IP Cambiato, l’Aggiornamento dei Record”

#preparare route 53 payload
cat > /tmp/route53_changes.json << EOF
{
“Comment”:”Aggiornato Dal DDNS Script di Shell”,
“Modifiche”:[
{
“Azione”:”UPSERT”,
“ResourceRecordSet”:{
“ResourceRecords”:[
{
“Value”:”$IP”
}
],
“Nome”:”$NOME”,
“Type”:”$TIPO”,
“TTL”:$TTL
}
}
]
}
EOF

#aggiornamento dei record
aws2 route53 cambiare-resource-record-set-ospitata-zona-id $HOSTED_ZONE_ID –change-batch file:///tmp/route53_changes.json >> /dev/null

Impostare Il Crontab

È possibile modificare il crontab con:

crontab-e

È possibile impostare l’esecuzione di questo script ogni minuto, come è abbastanza leggero. Dare cron un percorso per il tuo script su disco. È possibile inviare l’output a un file di log, o /dev/null se non si vuole affrontare.

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