Curitiba/PR Contato
Administração e Suporte em Ti

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ínio
vi /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;
}
}