Como rolar seu próprio DNS dinâmico com o AWS Route 53
Se você possui servidores executando em casa, não poderá rotear um domínio para eles sem um endereço IP estático. Em vez de pagar por um serviço DNS dinâmico, você pode criar seu próprio usando o AWS Route 53.
O DNS dinâmico não é complicado
O DNS dinâmico é bastante simples em conceito. Um daemon é executado na máquina do cliente e verifica regularmente o endereço IP do público em busca de alterações. Se o endereço IP for alterado, o daemon enviará uma atualização para o provedor DNS, que altera o registro. Isso geralmente é oferecido como um serviço pago em muitos registradores de domínio e provedores de DNS.
A AWS não possui um serviço específico para fornecer DNS dinâmico, mas é bastante simples de se configurar. A maneira da & AWS ” fazer isso seria configurar um evento CloudWatch que dispara uma função Lambda em resposta a alterações na infraestrutura. (Embora você provavelmente deva usar apenas um balanceador de carga e um grupo de dimensionamento automático na maioria dos cenários.)
No entanto, se você deseja configurar o DNS dinâmico para um servidor doméstico ou outro dispositivo que não seja da AWS que tenha alterações frequentes de endereço IP, é muito fácil criar scripts. O Route 53 possui comandos CLI simples que você pode usar para atualizar registros DNS a partir da linha de comando; conectar isso a um trabalho cron que observe uma alteração no endereço IP público e execute a CLI da AWS fará o trabalho.
No que diz respeito aos preços, a Rota 53 realmente não custa muito - uma taxa fixa de US $ 0,50 por mês para cada nome de domínio, além de algumas cobranças menores pelas pesquisas de DNS com base no uso. Como os registros são gratuitos (a pesquisa mais comum), você provavelmente não verá mais do que alguns centavos por mês em sua conta, a menos que esteja atraindo tráfego sério. Para comparação, os preços do DynDNS começam em US $ 55 por ano.
Configurando o lado das coisas da AWS
Para começar, vá para o console de gerenciamento do AWS Route 53. Se você não possui um domínio, pode registrar um em "Domínios registrados" ” por um preço bastante barato, geralmente apenas o preço da taxa de registro da ICANN. Se seu domínio não está atualmente na Rota 53, você precisará transferi-lo, o que é um processo fácil, mas demorado.
Encontre ou crie a zona hospedada para o seu domínio, que conterá todos os registros. Você desejará anotar o ID da zona hospedada, pois precisará dele para o script.
Você desejará criar um registro de espaço reservado A, para que o script tenha algo a que fazer referência. Você pode definir isso como algo obviamente incorreto. O 255.255.255.255 funcionaria para testar a funcionalidade do script.
Você também precisará configurar a CLI da AWS, o que você pode fazer com:
curl "https://d1vvhvl2y92vvt. cloudfront. net/awscli-exe-linux-x86_64. zip" -o "awscliv2. zip" descompacta o awscliv2. zip sudo ./aws/install
E configure-o com credenciais de usuário do IAM com:
o aws2 configura
Escrevendo o script
Se você quer apenas o script, pode se referir a essa essência, mas vamos explicar como ele está configurado, porque é legal. Se você está apenas copiando e colando, precisará alterar as variáveis HOSTED_ZONE_ID e NAME para corresponder ao registro que está tentando atualizar. Observe que esse script também usa a CLI aws2, que você precisará alterar se estiver usando a versão 1.
Primeiro, precisamos de uma maneira de obter o nosso endereço IP voltado ao público programaticamente. Para isso, podemos usar a API checkip. amazonaws. com da AWS. É totalmente gratuito e não há limite de taxa. Você também pode usar o api. ipify. org para esse fim, que também é gratuito e ilimitado. Vamos carregar isso em uma variável e salvá-la para mais tarde.
IP = $ (curl https://api. ipify. org/)
Em seguida, teremos que validar isso para garantir que recebemos de volta um endereço IP válido e não um código de erro ou qualquer coisa malformada. Simplesmente verificar se a entrada é um número separado por período é suficiente para esse objetivo, portanto, um pouco de regex ao lado do operador = ~ (retorna true se regex corresponde à entrada do lado esquerdo, muito útil) fará o truque:
se [[! $ IP = ~ ^ [0-9] \. [0-9] \. [0-9] \. [0-9] $]]; então saia 1 fi
Nós teremos que comparar isso com o nosso antigo endereço IP para ver se alguma coisa mudou. Podemos armazenar isso no disco como um arquivo em / tmp /, mas isso é confuso e propenso a erros. Em vez disso, consultaremos a rota 53 diretamente com list-resource-record-sets, e filtraremos o endereço IP do registro que estamos tentando atualizar com jq:
aws2 route53 lista-recurso-registro-conjuntos - ID da zona hospedada Z1VCYR76DBUXPL | \ jq -r '. ResourceRecordSets [] | selecione (. Name == "'" $ NAME "'") | select (. Type == "'" $ TYPE "'") | . ResourceRecords [0] . Value '> / tmp / current_route53_value
Isso salva em / tmp / current_route53_value, que podemos usar para verificar com grep, que é bastante resiliente:
se grep -Fxq "$ IP" / tmp / current_route53_value; em seguida, faça eco "IP não foi alterado, saindo" exit 1 fi
Finalmente, preparamos a carga útil para os conjuntos de registros de recursos alterados. Isso precisa estar em JSON, para que possamos gerar um arquivo em disco e enviá-lo como argumento ao comando.
cat > /tmp/route53_changes. json < < EOF {"Comentário": "Atualizado a partir do script do shell DDNS", "Alterações": [{"Ação": "UPSERT", "ResourceRecordSet": {"ResourceRecords": [{"Value": "$ IP"}], "Name": "$ NAME", "Type": "$ TYPE", "TTL": $ TTL}}]} EOF #update records aws2 route53 conjuntos de registros de recursos-mudança-aws2 - ID da zona hospedada $ HOSTED_ZONE_ID --change-batch file: ///tmp/route53_changes. json
Tudo se junta para formar o seguinte script. Você desejará alterar as variáveis HOSTED_ZONE_ID e NAME para corresponder ao registro que você está tentando atualizar. Observe que NAME tem um período no final.
#! / bin / bash #Variable Declaration - Altere estes HOSTED_ZONE_ID = "XXXXXXXXXXXX" NOME = "example. com." TYPE = "A" TTL = 60 #get endereço IP atual IP = $ (enrolar http://checkip. amazonaws. com/) #validate endereço IP (garante que o Route 53 não seja atualizado com uma carga malformada) se [ [! $ IP = ~ ^ [0-9] \. [0-9] \. [0-9] \. [0-9] $]]; em seguida, saia 1 fi #get current aws2 route53 list-resource-record-sets --hosted-zone-id $ HOSTED_ZONE_ID | \ jq -r '. ResourceRecordSets [] | selecione (. Name == "'" $ NAME "'") | select (. Type == "'" $ TYPE "'") | . ResourceRecords [0] . Value '> / tmp / current_route53_value cat / tmp / current_route53_value # verifique se o IP é diferente da rota 53 se grep -Fxq "$ IP" / tmp / current_route53_value; em seguida, ecoa "IP não foi alterado, saindo" exit 1 fi echo "IP alterado, atualizando registros" #prepare a rota 53 carga útil cat > /tmp/route53_changes. json < < EOF {"Comentário": "Atualizado a partir do script do shell DDNS", "Alterações": [{"Ação": "UPSERT", "ResourceRecordSet": {"ResourceRecords": [{"Value": "$ IP"}], "Name": "$ NAME", "Type": "$ TYPE", "TTL": $ TTL}}]} EOF #update records aws2 route53 conjuntos de registros de recursos-mudança-aws2 - ID da zona hospedada $ HOSTED_ZONE_ID --change-batch file: ///tmp/route53_changes. json > > / dev / null
Configure seu Crontab
Você pode editar seu crontab com:
crontab -e
Você pode definir esse script para ser executado a cada minuto, pois é bastante leve. Dê ao cron um caminho para o seu script no disco. Você pode enviar a saída para um arquivo de log ou para / dev / null se não quiser lidar com isso.
* * * * /home/user/update_dns. sh > / dev / null 2 > & 1
Via: How to Geek
Nenhum comentário