dyndns is not free anymore… what now?

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