Configurar um Servidor DNS Autoritativo Local no Linux

CompTIABeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como configurar um servidor DNS autoritativo local em um sistema Linux usando bind9. Você ganhará experiência prática com um dos pacotes de software DNS mais utilizados, transformando uma máquina Linux padrão em um servidor capaz de resolver nomes de domínio personalizados para uma rede local.

O processo começa com a instalação dos pacotes necessários e a configuração das opções globais do servidor, como a configuração de forwarders. Em seguida, você definirá uma zona de pesquisa direta (forward lookup zone) para resolver um nome de domínio para um endereço IP e uma zona de pesquisa reversa (reverse lookup zone) para o intervalo de IP correspondente. Para concluir o laboratório, você validará os arquivos de configuração do bind9 quanto à sintaxe correta e usará a utilidade dig para testar seu novo servidor DNS, garantindo que ele resolva corretamente as consultas para seu domínio local.

Instalar bind9 e Configurar Opções Globais

Nesta etapa, você começará configurando os componentes principais do seu servidor DNS. Isso envolve a instalação do bind9, que é um dos pacotes de software de servidor DNS mais utilizados em Linux. Você também configurará suas opções globais, que controlam o comportamento geral do servidor, como a forma como ele lida com requisições para domínios para os quais não é autoritativo.

Primeiro, é uma prática padrão atualizar a lista de pacotes do seu sistema para garantir que você esteja obtendo as versões mais recentes de software disponíveis.

Execute o seguinte comando no seu terminal:

sudo apt-get update

Em seguida, instale o pacote bind9, que contém o daemon do servidor DNS, e bind9-utils, que fornece ferramentas úteis de linha de comando como dig e named-checkconf que você usará mais tarde para testes e validação.

sudo apt-get install bind9 bind9-utils

Você será solicitado a confirmar a instalação. Digite Y e pressione Enter. A saída será semelhante a esta:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  bind9-libs bind9-doc dns-root-data
...
After this operation, XX.X MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...
Setting up bind9 (1:9.18.X-XubuntuX.X) ...

Com o bind9 instalado, a próxima tarefa é configurar seu comportamento global. A configuração principal é dividida em vários arquivos, todos localizados no diretório /etc/bind/. Para opções globais, você editará o arquivo named.conf.options.

Abra o arquivo usando o editor nano:

sudo nano /etc/bind/named.conf.options
options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        // forwarders {
        //      0.0.0.0;
        // };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        listen-on-v6 { any; };
};

Dentro deste arquivo, você verá um bloco options { ... };. Você precisa garantir que este bloco contenha diretivas para encaminhamento (forwarding), permissões de consulta (query permissions) e interfaces de escuta (listening interfaces). O encaminhamento permite que seu servidor DNS resolva domínios externos (como google.com) consultando outros servidores DNS públicos.

Modifique o bloco options para corresponder ao seguinte. Você pode adicionar as linhas que estão faltando ou descomentar e alterar as que já existem.

Dicas: Você pode limpar o conteúdo do arquivo pressionando Ctrl+K, depois cole o seguinte conteúdo.

options {
        directory "/var/cache/bind";

        // If there is not a line with forwarders, add the following section.
        // If there is one, ensure it's not commented out and has valid IPs.
        forwarders {
                8.8.8.8;
                8.8.4.4;
        };

        // Add or uncomment this line to allow queries from any host
        allow-query { any; };
        recursion yes;

        listen-on { any; }; // Listen on all interfaces
        listen-on-v6 { any; }; // Listen on all IPv6 interfaces

        dnssec-validation auto;
        auth-nxdomain no;    ## conform to RFC1035
};

Depois de terminar a edição, salve o arquivo pressionando Ctrl+O, depois pressione Enter para confirmar o nome do arquivo. Saia do editor nano pressionando Ctrl+X. Você agora instalou com sucesso o bind9 e definiu sua configuração inicial.

Definir e Criar uma Zona de Pesquisa Direta para mylocaldomain.net

Nesta etapa, você configurará seu servidor bind9 para ser autoritativo para um domínio personalizado. Isso é alcançado criando uma zona de pesquisa direta (forward lookup zone), que é um banco de dados que mapeia nomes de host legíveis por humanos (como webserver.mylocaldomain.net) para seus endereços IP correspondentes. Você primeiro definirá a zona na configuração do bind9 e, em seguida, criará o arquivo de zona real contendo os registros DNS.

Primeiro, você precisa informar ao bind9 sobre sua nova zona. As configurações de zona local são mantidas em /etc/bind/named.conf.local para separá-las da configuração padrão do pacote. Este arquivo será totalmente configurado na próxima etapa.

Agora que a zona está definida, você deve criar o arquivo de zona correspondente. Este arquivo contém os registros DNS reais.

Primeiro, copie um arquivo modelo para garantir que o novo arquivo tenha as permissões e propriedade corretas:

sudo cp /etc/bind/db.local /etc/bind/db.mylocaldomain.net

Em seguida, em vez de editar manualmente o arquivo, você pode executar um único bloco de comando que irá:

  1. Obter o endereço IP da sua VM.
  2. Gerar um número de série dinâmico usando a data atual.
  3. Escrever o conteúdo completo e correto do arquivo de zona em /etc/bind/db.mylocaldomain.net.

Primeiro, capture o endereço IP da sua VM em uma variável que será usada no arquivo de zona:

VM_IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

Este comando extrai o endereço IPv4 da sua interface de rede principal (eth0) usando uma expressão regular. O endereço IP será inserido automaticamente em seus registros DNS.

Agora, crie o arquivo de zona com os registros DNS apropriados. Este único comando gerará o arquivo de zona completo:

sudo bash -c "cat > /etc/bind/db.mylocaldomain.net" << EOF
\$TTL    604800
@       IN      SOA     ns1.mylocaldomain.net. admin.mylocaldomain.net. (
                     $(date +%Y%m%d)01 ; Serial (YYYYMMDDNN)
                             604800     ; Refresh
                              86400     ; Retry
                            2419200     ; Expire
                             604800 )   ; Negative Cache TTL
;
@       IN      NS      ns1.mylocaldomain.net.
ns1     IN      A       ${VM_IP}
webserver IN    A       ${VM_IP}
fileserver IN   A       ${VM_IP}
www     IN      CNAME   webserver
EOF

Este comando preenche automaticamente o arquivo de zona com os registros corretos, usando o endereço IP específico da sua VM. Você pode verificar o conteúdo com cat /etc/bind/db.mylocaldomain.net. Você agora definiu e criou com sucesso sua primeira zona de pesquisa direta.

Definir e Criar Todas as Zonas Locais

Nesta etapa, você criará todas as configurações de zona local necessárias. Em vez de editar arquivos manualmente, você usará um script para executar as seguintes ações, garantindo uma configuração precisa:

  1. Criar /etc/bind/named.conf.local: Este arquivo será gerado do zero para conter as definições para suas zonas de pesquisa direta (mylocaldomain.net) e reversa.
  2. Criar o Arquivo de Zona Reversa: O script também criará o arquivo db.REVERSE_IP com os registros PTR necessários.

Primeiro, colete as informações de endereço IP necessárias para ambas as configurações de zona:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')
LAST_OCTET=$(echo $IP | awk -F. '{print $4}')

Isso extrai o endereço IP da sua VM e o processa para criar o formato de IP reverso necessário para a zona de pesquisa reversa. Por exemplo, se o seu IP for 172.16.50.100, o REV_IP se tornará 50.16.172 e LAST_OCTET se tornará 100.

Em seguida, crie o arquivo de configuração principal da zona que informa ao bind9 sobre ambas as zonas:

sudo bash -c "cat > /etc/bind/named.conf.local" << EOF
//
// Do any local configuration here
//

// Forward lookup zone
zone "mylocaldomain.net" {
    type master;
    file "/etc/bind/db.mylocaldomain.net";
};

// Reverse lookup zone
zone "${REV_IP}.in-addr.arpa" {
    type master;
    file "/etc/bind/db.${REV_IP}";
};
EOF

Este arquivo define tanto a zona de pesquisa direta (para resolver nomes para IPs) quanto a zona de pesquisa reversa (para resolver IPs de volta para nomes). O type master indica que este servidor é autoritativo para essas zonas.

Finalmente, crie o arquivo de zona reversa com os registros PTR:

sudo bash -c "cat > /etc/bind/db.${REV_IP}" << EOF
\$TTL    604800
@       IN      SOA     ns1.mylocaldomain.net. admin.mylocaldomain.net. (
                     $(date +%Y%m%d)01 ; Serial
                             604800     ; Refresh
                              86400     ; Retry
                            2419200     ; Expire
                             604800 )   ; Negative Cache TTL
;
@       IN      NS      ns1.mylocaldomain.net.
;
${LAST_OCTET}     IN      PTR     ns1.mylocaldomain.net.
${LAST_OCTET}     IN      PTR     webserver.mylocaldomain.net.
${LAST_OCTET}     IN      PTR     fileserver.mylocaldomain.net.
EOF

Esta abordagem automatizada garante que ambas as zonas sejam definidas corretamente em named.conf.local e que o arquivo de zona reversa seja criado corretamente, prevenindo erros comuns de configuração.

Validar a Configuração do bind9 e Testar a Resolução DNS com dig

Nesta etapa, você validará todas as alterações de configuração que fez e, em seguida, testará seu servidor DNS ativo. É uma prática crítica verificar os arquivos de configuração em busca de erros de sintaxe antes de aplicá-los, pois um erro pode impedir que o serviço bind9 inicie corretamente. Uma vez validado, você usará a utilidade dig para realizar consultas DNS e confirmar que seu servidor está funcionando como esperado.

Primeiro, verifique os principais arquivos de configuração do bind9 em busca de erros de sintaxe usando named-checkconf. Se este comando não produzir nenhuma saída, significa que seus arquivos de configuração (named.conf.local, named.conf.options, etc.) são válidos.

sudo named-checkconf

Em seguida, valide a sintaxe do seu arquivo de zona de pesquisa direta. O comando named-checkzone verifica a correção de um arquivo de zona.

sudo named-checkzone mylocaldomain.net /etc/bind/db.mylocaldomain.net

Uma verificação bem-sucedida retornará um status "OK" e mostrará o número de série do seu arquivo de zona:

zone mylocaldomain.net/IN: loaded serial 2024052001
OK

Agora, valide a zona de pesquisa reversa. Como o nome da zona e o nome do arquivo dependem do endereço IP da sua VM, primeiro colete as informações necessárias:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')
ZONE_NAME="${REV_IP}.in-addr.arpa"
ZONE_FILE="/etc/bind/db.${REV_IP}"

Isso cria o nome de zona e o caminho do arquivo corretos com base no endereço IP real da sua VM.

Agora execute o comando de validação da zona:

echo "Checking reverse zone: ${ZONE_NAME}"
sudo named-checkzone ${ZONE_NAME} ${ZONE_FILE}

Uma verificação bem-sucedida mostrará novamente um status "OK":

zone 50.16.172.in-addr.arpa/IN: loaded serial 2024052001
OK

Antes de reiniciar, certifique-se de que o serviço bind9 possa ler os arquivos de zona definindo a propriedade correta. Primeiro, obtenha as informações de IP novamente para construir o caminho correto do arquivo:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')

Agora defina a propriedade correta para ambos os arquivos de zona:

sudo chown root:bind /etc/bind/db.mylocaldomain.net "/etc/bind/db.${REV_IP}"

Com todas as configurações validadas, é hora de reiniciar o serviço bind9 para aplicar as alterações:

sudo systemctl restart bind9

Para ter certeza de que o serviço iniciou corretamente e carregou suas novas zonas, verifique os logs do sistema.

sudo grep named /var/log/syslog | grep "loaded serial"

Você deverá ver uma saída confirmando que ambas as suas zonas foram carregadas com sucesso. A saída também incluirá zonas padrão como localhost, o que é normal. O importante é encontrar as linhas para mylocaldomain.net e sua zona reversa.

... named[...]: zone mylocaldomain.net/IN: loaded serial 2025071401
... named[...]: zone 50.16.172.in-addr.arpa/IN: loaded serial 2025071401
...

Se você não vir essas linhas, revise a saída de sudo systemctl status bind9 em busca de erros.

Finalmente, teste seu servidor DNS usando dig. Você consultará seu servidor local diretamente especificando @127.0.0.1.

Primeiro, teste a pesquisa direta para webserver.mylocaldomain.net:

dig @127.0.0.1 webserver.mylocaldomain.net

Na saída, procure pela ANSWER SECTION. Ela deve mostrar o registro A apontando para o endereço IP da sua VM e, importantemente, as flags no cabeçalho devem incluir aa para uma resposta autoritativa. A linha SERVER na parte inferior deve mostrar 127.0.0.1.

...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ...
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;webserver.mylocaldomain.net. IN A

;; ANSWER SECTION:
webserver.mylocaldomain.net. 604800 IN A <your_vm_ip>

;; SERVER: 127.0.0.1#53(127.0.0.1)
...

Em seguida, teste a pesquisa reversa usando a flag -x. Primeiro, capture o endereço IP da sua VM:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

Agora execute o teste de pesquisa reversa:

dig @127.0.0.1 -x $IP

A ANSWER SECTION agora deve mostrar os registros PTR que você criou, mapeando seu IP de volta para os nomes de host, e as flags devem incluir novamente aa.

...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ...
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;<last_octet>.<your_reversed_network_part>.in-addr.arpa. IN PTR

;; ANSWER SECTION:
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR fileserver.mylocaldomain.net.
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR ns1.mylocaldomain.net.
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR webserver.mylocaldomain.net.

;; SERVER: 127.0.0.1#53(127.0.0.1)
...

Parabéns! Você configurou, validou e testou com sucesso um servidor DNS autoritativo básico.

Resumo

Neste laboratório, você configurou um servidor DNS autoritativo local no Linux usando o pacote de software bind9. O processo começou com a instalação do bind9 e suas utilidades essenciais, seguido pela edição do arquivo global named.conf.options para definir comportamentos em todo o servidor, como a configuração de forwarders para resolver consultas de domínio externas.

Em seguida, você criou as zonas DNS primárias: uma zona de pesquisa direta para mylocaldomain.net para mapear nomes de host para endereços IP usando registros A, e uma zona de pesquisa reversa correspondente para mapear endereços IP de volta para nomes de host com registros PTR. O laboratório concluiu com a fase crucial de validação, onde você usou named-checkconf e named-checkzone para verificar erros de configuração e, em seguida, testou a funcionalidade do servidor ativo realizando pesquisas diretas e reversas bem-sucedidas com a utilidade dig.