DNS dinâmico usando o Bind9 no Centos
A configuração a seguir foi testada primeiramente em um servidor virtual com o Centos 7.
Resolvi configurar este serviço devido a necessidade de saber o endereço de IPv6 fornecido aos equipamentos de uma rede, onde era preciso acessar para futuras configurações, e acompanhamentos. O problema é que as operadoras continuam fornecendo os endereços ips de seus clientes como dinâmicos, mesmo com o número quase infinito do IPv6. Com o uso de CGNAT pelas operadoras, praticamente é impossível o uso de conexão direta máquina a máquina, sem aplicativos como Teamviewer e AnyDesk que se utilizam de uma VPN via internet.
Como quem conhece o protocolo IPv6, sabe que as operadoras no Brasil fornecem um prefixo de rede /64 para seus clientes, mas este bloco de rede não é fixo, não sendo possível fornecer um prefixo de endereço IPv6 fixo. Se solicitado um bloco fixo, dificilmente você será atendido. PS: Na minha opinião é falta de conhecimento técnico ou falta de vontade mesmo.
Mas, vamos lá….
A base da atualização do dns dinâmico está no ddnsupdate que após as configurações incluí no site com o uso do php, e após a autenticação do usuário cliente.
1. Instale o bind
yum install bind bind-utils bind-devel
2. Crie sua chave dnssec
Execute o comando abaixo para criar sua chave dnssec a ser incluída na configuração e usada para atualizar remotamente os registros dns. Mais tarde, usaremos um script para a atualização periodicamente.
ddns-confgen -r /dev/urandom -s ddnssrv.example.com.br
Este comando deve produzir uma saída com a chave recém-criada e algumas informações sobre como configurar o restante:
Para ativar esta chave, coloque o seguinte em named.conf e
key "ddns-key.ddnssrv.example.com.br" { algorithm hmac-sha256; secret "cq/vdZkwJxBPPxi41N2KxPOznj8OMTnI7I.....="; };
# Ainda em named.conf, na instrução “zone” que do domínio “example.com”, teste com uma instrução “update-policy” ou allow-update # ajuste conforme necessário de acordo com suas permissões:
// zone example.com.br zone "example.com.br" { type master; allow-transfer { 245.234.223.212; }; also-notify { 245.234.223.212; }; file "/var/named/example.com.br.db"; //update-policy { grant ddns-key.ddnssrv.example.com.br name ddnssrv.example.com.br ANY; }; allow-update { key ddns-key.ddnssrv.example.com.br; }; }; // zone_end example.com.br
# Depois que o arquivo de chave foi colocado, o seguinte comando será # execute o nsupdate usando esta chave:
nsupdate -k
3. Obviamente, vamos atualizar o arquivo de zona do domíniovi /var/named/example.com
.db
$ORIGIN . $TTL 86400 ; 1 day example.com.br IN SOA ns1.example.com.br. postmaster.example.com.br. ( 2020112004 ; serial 3600 ; refresh (1 hour) 7200 ; retry (2 hours) 1209600 ; expire (2 weeks) 86400 ; minimum (1 day) ) NS ns1.example.com.br. NS ns2.example.com.br. $TTL 14400 ; 4 hours A 172.173.174.175 MX 0 mail.example.com.br. $ORIGIN example.com.br.
4. Configuração concluída
Agora reiniciamos o named.service
systemctl restart named.service
5. Script de atualização, se for usado método diferente via web.
Crie o script de shell de atualização./usr/local/bin/ddnsupdate
#!/bin/bash MYIP=$(dig +short myip.opendns.com @resolver1.opendns.com) KEY=/etc/ddnsupdate.key NS=ns1.example.com DOMAIN=myhost.example.com. ZONE=example.com. nsupdate -k $KEY -v << EOF server $NS zone $ZONE update delete $DOMAIN A update add $DOMAIN 30 A $MYIP send EOF
6. Cron
Abra a configuração do cron para adicionar e agendar o script de atualização. Não é necessário se a atualização for realizado pelo PHP como no caso que utilizei a aplicação WEB com a autenticação do cliente entre outras verificações…
# crontab -e
Adicione a linha para executar o script de atualização a cada 5 minutos …
... */5 * * * * /usr/local/bin/ddnsupdate > /dev/null 2>&1 ...
# torne o script executável
chmod +x /usr/local/bin/ddnsupdate
Na configuração do servidor Web que atualiza o dns dinâmicamente, após a autenticação do usuário, é chamado uma função em uma estrutura MVC para executar o ddnsupdate. Atente-se as variáveis que você definir no PHP. Esta função deve ser executado no model da estrutura MVC no servidor Web
public function nsupdate($hostname, $domain, $ip, $ipv6){
/*
Recebe-se o endereço já inserido ou atualizado na tabela endereço
A atualização dinâmica no servidor, demora poucos minutos após update.
Para o comando EOF não se pode adicionar espaços desnecessários
Prepare command
*/
$hostname = strtolower($hostname);
if (strlen($ip) <= 22) {
$data = "<<EOF
zone $domain
update delete $hostname.$domain A
update delete $hostname.$domain AAAA
update add $hostname.$domain 14400 A $ip
update add $hostname.$domain 14400 AAAA $ipv6
send
EOF";
// run DNS update
exec("/usr/bin/nsupdate -k ddnsupdate.key $data", $cmdout, $ret);
return $ret;
} else {
$data = "<<EOF
zone $domain
update delete $hostname.$domain AAAA
update add $hostname.$domain 14400 AAAA $ipv6
send
EOF";
// run DNS update
exec("/usr/bin/nsupdate -k ddnsupdate.key $data", $cmdout, $ret);
return $ret;
}
}