Boa tarde a todos!
Desde que me lembro de ter banda larga (em 1999) que sempre houve o dyndns.org e o seu serviço free de dynamic dns. Este serviço dava por sua vez voz a tudo o que eu tinha no meu homelab: @dns, @email, @hosting etc.
Até que na primavera de 2014 eles decidiram que este seria um negócio gratuito a descontinuar, e que agora quem queria o serviço teria de pagar por ele.
Tinha três hipóteses:
Passava para um serviço pago, passava para outro provider de free dyndns(e arriscar-me que daqui a pouco tempo voltasse a ter o serviço fechado – na altura que a dyndns fechou o serviço free, estava de férias – todas as alterações e correções foram feitas num tablet para voltar a ter as coisas a funcionar) ou já que tinha um domínio pago e infraestrutura de DNS montada e a funcionar ser eu próprio o meu dynamic dns provider.
O desafio estava lançado na minha cabeça. Mas como começar?
Existe muita documentação sobre o processo, e praticamente todas rondam o bind e páginas e páginas de php mas não encontrei nenhuma em Português.
Este HOWTO, assume que já tem um bind a funcionar corretamente (no meu caso está chrooted) e um NTP a funcionar corretamente tanto no dns server como no dns update client.
Nota: uma desfasagem de tempo entre o cliente que atualiza e o servidor que recebe a atualização demasiado grande vai resultar num acesso negado.
1) No vosso servidor de DNS:
Alterar a vossa zona de domínio no named.conf:
zone “xpto.com” {
type master;
allow-update { key host1.xpto.com.; };
file “/var/named/xpto.com”;
};
Na prática, isto diz ao bind que o host com a chave “host1.xpto.com” pode fazer atualizações à zona xpto.com.
Esta chave tem que ser igualmente declarada no named.conf:
key host1.xpto.com. {
algorithm hmac-md5;
secret “aqui_a_chave_secreta”;
};
Já mostrarei como gerar a chave mais abaixo.
1) No “cliente” de DNS:
De forma a garantir os updates aos hosts dentro das zonas, iremos necessitar de uma tool presente no bind chamada de nsupdate. Esta tool é o que nos atualiza o host dentro da zona.
Primeiro vamos gerar a nossa chave secreta: dnssec-keygen -a hmac-md5 -b 128 -n USER host1.xpto.com.
Isto irá gerar dois ficheiros em separado:
-rw——- 1 root root 165 Nov 23 18:01 Khost1.xpto.com.+157+46430.private
-rw——- 1 root root 56 Nov 23 18:01 Khost1.xpto.com.+157+46430.key
Obter a chave correta que está no ficheiro com extensão .key (será sempre a que tem o == ao fim):
~ # awk ‘{ print $7 }’ Khost1.xpto.com.+157+46430.key
ViHwSxFs1v5718tOuUKCgA==
Carregar a chave na secção do named.conf que tem “aqui_a_chave_secreta”
Após as alterações efetuar rndc reconfig ao bind e validar que não ocorreu nenhum problema tanto na zona, como em nenhuma secção.
Agora que temos uma infraestrutura montada, podemos nos dedicar ao cliente em si. No meu caso, tenho o bind/DNS numa VPS (vamos imaginar vps1 e o cliente numa outra vps3) ambas por detrás da mesma gateway para a internet.
Para tal tenho o seguinte bash script que corre de 5 em 5 minutos:
#!/bin/bash
PATH=”/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin”
host=border.xpto.com #este sera o host a actualizar
ip=`wget http://dynupdate.no-ip.com/ip.php -q -O -`
check_xpto_status=`dig @checkip.xpto.com border.xpto.com | grep -i border | grep -v \; | awk ‘{ print $5 }’`
data=`date +%s`
chave=/home/chaves/Khost1.xpto.com.+157+46430.private
log=/var/log/dyndns_xpto.log
update_ip () {
execute=`nsupdate -k $chave -d <<EOF
zone xpto.com
update delete border.xpto.com A
update add border.xpto.com 300 A $ip
send
EOF`
echo $execute &>> $log
}
if [ “$check_xpto_status” = “” ]
then
echo “$data: IP invalido – IP encontrado $ip” >> $log && exit
else
echo “$data: IP valido”
fi
if [ “$check_xpto_status” = “$ip” ]
then
echo “$data: IP ja actualizado” && exit
else
echo “$data: IP Alterou: A actualizar named para $ip” >> $log && update_ip
fi
Nota: estou a descobrir o meu IP através de um URL free – http://dynupdate.no-ip.com/ip.php – embora existam muitos mais e podem vocês fazer o vosso.
Sites onde validar o vosso IP:
http://dynupdate.no-ip.com/ip.php
http://www.antedes.com/getip.php
http://www.whatsmyip.org/
Abr.
Nuno