Post

DNS com o BIND Parte 1: Fundamentos e Instalação do Servidor DNS com BIND

DNS com o BIND Parte 1: Fundamentos e Instalação do Servidor DNS com BIND

Introdução

Bem-vindo à primeira parte de nossa série completa sobre a configuração de um servidor DNS robusto com BIND (Berkeley Internet Name Domain). O DNS é um dos pilares fundamentais da internet, atuando como um “tradutor” que converte nomes de domínio legíveis por humanos (como www.google.com) em endereços IP numéricos que as máquinas usam para se conectar umas às outras. Sem o DNS, a navegação na web como a conhecemos seria impossível.

Nesta série, vamos explorar em detalhes como instalar, configurar e gerenciar o BIND 9, a implementação de servidor DNS mais utilizada no mundo. Começaremos com os conceitos básicos e a instalação, progredindo gradualmente para configurações avançadas, seguras e eficientes, adequadas tanto para ambientes corporativos quanto para provedores de serviço.

O que será visto nesta primeira parte

Neste primeiro módulo, nosso foco será estabelecer uma base sólida. Abordaremos os seguintes tópicos:

  • Topologia da Infraestrutura: Desenharemos o ambiente de rede que servirá de base para toda a série.
  • Lógica de Consultas: Entenderemos como o BIND processará consultas de diferentes origens usando o conceito de views.
  • Tipos de Servidores DNS: Explicaremos as diferenças entre servidores autoritativos, recursivos e híbridos.
  • Introdução ao BIND: Conheceremos a história e os componentes do BIND.
  • Instalação do BIND: Instalaremos os pacotes necessários em um servidor Oracle Linux 9.
  • Configuração de Cache: Faremos a configuração inicial do BIND para operar como um servidor de cache DNS.

Pré-requisitos

Para acompanhar este tutorial de forma eficaz, é recomendado que você tenha:

  • Conhecimento Básico de Redes: Familiaridade com conceitos como endereços IP (IPv4 e IPv6), sub-redes e portas TCP/IP.
  • Familiaridade com Linux: Conforto com a linha de comando para criar diretórios, editar arquivos e gerenciar serviços.
  • Acesso a um Servidor: Uma máquina física ou virtual com Oracle Linux 9 (ou uma distribuição baseada em RHEL, como CentOS Stream ou Rocky Linux) recém-instalado.
  • Privilégios de Administrador: Acesso sudo para instalar pacotes e alterar configurações de sistema.

1. Topologia da Infraestrutura DNS

Diagrama da Infraestrutura

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
┌───────────────────────────────────────────────────────────────┐
│                    INTERNET (Rede Externa)                    │
│                                                               │
│  203.0.113.0/24 (IPv4)  |  2001:db8::/48 (IPv6)               │
└────────────────┬──────────────────────────────────────────────┘
                 │
        ┌────────┴────────┐
        │                 │
    ┌───▼─────┐       ┌───▼──────┐
    │   NS1   │       │   NS2    │
    │ Primário│       │Secundário│
    │ (Master)│       │ (Slave)  │
    └────┬────┘       └────┬─────┘
         │                 │
    203.0.113.2         203.0.113.3
    2001:db8::2         2001:db8::3
         │                 │
         └────────┬────────┘
                  │
        ┌─────────▼──────────┐
        │  Rede Interna      │
        │  10.16.32.0/20     │
        │  fd00:0:0:1::/64   │
        │                    │
        │  Clientes Internos │
        │  (10.0.0.0/8)      │
        └────────────────────┘

Tabela de Endereços

ServidorFunçãoIPv4 InternoIPv6 InternoIPv4 ExternoIPv6 Externo
NS1Primário10.16.32.2fd00:0:0:1::2203.0.113.22001:db8::2
NS2Secundário10.16.32.3fd00:0:0:1::3203.0.113.32001:db8::3
Domínio Principallab4it.com.br10.16.32.24fd00:0:0:1::24203.0.113.242001:db8::24

Nota: Os endereços IPv4 externos (203.0.113.0/24) e IPv6 (2001:db8::/48) são blocos de exemplo documentados em RFC 5737 e RFC 3849, respectivamente. Em um ambiente de produção, você usaria endereços reais alocados pela sua organização ou registrador de domínios.


2. Lógica das Consultas DNS

O BIND será configurado para usar views (visualizações), um recurso que permite servir diferentes respostas DNS dependendo da origem da consulta. Isso é uma prática comum em ambientes corporativos.

Fluxo de Consultas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
┌──────────────────────────────────────────────────────────────┐
│                    Consulta DNS Recebida                     │
└────────────────────────┬─────────────────────────────────────┘
                         │
                    ┌────▼─────┐
                    │ Verificar│
                    │ Origem   │
                    └────┬─────┘
                         │
         ┌───────────────┼─────────────────┐
         │               │                 │
    ┌────▼────┐     ┌────▼────┐       ┌────▼────┐
    │Interna? │     │Loopback?│       │ Outra?  │
    │10.0.0/8 │     │127.0.0.1│       │         │
    │fd00::/48│     │::1      │       │         │
    └────┬────┘     └────┬────┘       └────┬────┘
         │               │                 │
    ┌────▼───────────────▼───┐    ┌────────▼─────────┐
    │ View "internals"       │    │ View "externals" │
    │ - Zonas internas       │    │ - Zonas públicas | 
    │ - Recursão habilitada  │    │ - Sem recursão   │
    │ - Acesso total         │    └──────────────────┘
    └────────────────────────┘    

Tabela de Views

ViewClientesOrigemRecursãoZonasPropósito
internalsRede interna10.0.0.0/8, fd00::/48, localhostSimInternas + ExternasResolução completa para usuários internos
externalsInternetQualquer outra origemNãoApenas públicasRespostas autoritativas para domínios públicos

Nota: Esta é uma implementação possível. Alguns administradores preferem separar DNS recursivos e autoritativos em servidores distintos por questões de segurança e performance. A abordagem com views oferece flexibilidade, mas requer configuração cuidadosa para evitar vulnerabilidades de amplificação de DNS.

Para aprofundar seus conhecimentos sobre DNS e resolução de nomes na Internet, consulte: Servidor de Nomes - DNS: Resolução de Nomes na Internet


3. Introdução aos Tipos de Funcionamento de um DNS

Servidor Autoritativo (Authoritative)

Um servidor DNS autoritativo é aquele que detém os registros oficiais e definitivos para um determinado domínio. Pense nele como a fonte da verdade. Quando alguém pergunta o endereço IP de www.lab4it.com.br, o servidor autoritativo para o domínio lab4it.com.br é o único que pode dar a resposta final e “oficial”.

  • Responsabilidade: Armazena os arquivos de zona (com os registros A, AAAA, MX, CNAME, etc.) de um ou mais domínios.
  • Comportamento: Responde apenas a consultas sobre os domínios para os quais tem autoridade. Ele não tenta resolver nomes de outros domínios para seus clientes.

Servidor Recursivo (Recursive / Caching)

Um servidor DNS recursivo, também conhecido como resolver ou servidor de cache, é o intermediário que faz o trabalho pesado para os clientes (como seu computador ou smartphone). Quando um cliente precisa resolver um nome, ele envia a consulta a um servidor recursivo.

  • Responsabilidade: Encontrar a resposta para a consulta de um cliente, mesmo que não a saiba.
  • Comportamento: Se não tiver a resposta em seu cache, ele executa um processo de consulta iterativa: pergunta aos servidores raiz da internet, depois aos servidores do TLD (.br, .com), e assim por diante, até encontrar o servidor autoritativo que tem a resposta. Após obtê-la, ele a entrega ao cliente e a armazena em cache por um tempo para acelerar futuras solicitações para o mesmo nome.

Servidor Híbrido (Split-View DNS)

Um servidor híbrido combina as funções de autoritativo e recursivo em uma única instância do BIND, mas de forma inteligente e segregada. Utilizando um recurso chamado views (visualizações), o servidor pode fornecer respostas diferentes para a mesma pergunta, dependendo de quem está perguntando (por exemplo, um cliente da rede interna ou um usuário da internet).

  • Responsabilidade: Servir como autoritativo para domínios públicos e internos, ao mesmo tempo que atua como um servidor recursivo para os clientes da rede local.
  • Comportamento: É exatamente o modelo que implementaremos nesta série. Para consultas da rede interna, ele permitirá recursão e mostrará registros internos. Para consultas da internet, ele desativará a recursão e mostrará apenas os registros públicos, protegendo a infraestrutura interna.

4. Introdução ao BIND

O que é BIND?

BIND (Berkeley Internet Name Domain) é o software de servidor DNS mais antigo e amplamente utilizado na internet. Criado no início dos anos 1980 na Universidade da Califórnia, Berkeley, com financiamento da DARPA, o BIND tornou-se a implementação de referência para o protocolo DNS.

Sua longevidade e adoção massiva se devem à sua robustez, flexibilidade e conformidade com os padrões da internet (RFCs). Hoje, ele é mantido pelo Internet Systems Consortium (ISC) e continua a evoluir, incorporando novas funcionalidades e aprimoramentos de segurança.

Componentes Principais do BIND

O BIND é, na verdade, um conjunto de ferramentas. Os componentes que mais utilizaremos são:

  • named: O daemon (serviço) do servidor de nomes propriamente dito. É o processo que roda em segundo plano, escutando por consultas DNS na porta 53 e respondendo a elas com base em sua configuração.
  • rndc (Remote Name Daemon Control): A ferramenta de controle do named. Ela permite que administradores gerenciem o serviço DNS sem precisar reiniciá-lo, executando ações como recarregar zonas, limpar o cache ou verificar o status.
  • Ferramentas de Diagnóstico: Utilitários como dig (Domain Information Groper) e nslookup, que são instalados com o pacote bind-utils. Eles são essenciais para testar e solucionar problemas de DNS.

5. Outros Servidores DNS

Embora o BIND seja o padrão de fato, é importante saber que existem outras implementações de servidores DNS populares, cada uma com suas próprias filosofias e pontos fortes. Algumas alternativas notáveis incluem:

ServidorDesenvolvedorFoco Principal
PowerDNSPowerDNS.COMFoco em performance e backends de banco de dados. Oferece um servidor autoritativo e um recursor separados.
Knot DNSCZ.NICUm servidor autoritativo de alta performance, projetado para ser rápido e moderno.
UnboundNLnet LabsUm servidor DNS exclusivamente recursivo, com forte foco em segurança, validação e performance.
dnsmasqSimon KelleyUm servidor DNS leve, ideal para redes pequenas e dispositivos embarcados, que geralmente combina DNS com serviços DHCP.

Nesta série, focaremos no BIND por ser a solução mais tradicional, flexível e rica em funcionalidades, tornando-o uma base de conhecimento indispensável para qualquer administrador de sistemas.


6. Instalação do Pacote BIND

6.1 Preparação do Sistema

Nota: Para esta implementação usaremos a distribuiçao Oracle Linux versão 9.

Antes de instalar o BIND, configure o servidor para usar um nameserver externo confiável:

1
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf 

Nota: Este comando configura temporariamente o Google DNS (8.8.8.8) como servidor de nomes, permitindo que o sistema resolva nomes durante a instalação do BIND e assumindo que a VM ainda não possua um servidor de DNS definido.

6.2 Instalação dos Pacotes

Instale o BIND e suas ferramentas de utilidade:

1
sudo dnf install bind bind-utils

Pacotes instalados:

  1. bind - O servidor DNS BIND propriamente dito
  2. bind-utils - Ferramentas de utilidade para consultas e diagnóstico

6.3 Verificação da Instalação

Verifique que os pacotes foram instalados corretamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[gean@ns1 ~]$ rpm -qil bind
Name        : bind
Epoch       : 32
Version     : 9.16.23
Release     : 34.0.1.el9_7.1
Architecture: x86_64
Install Date: Fri 06 Feb 2026 11:02:03 AM -03
Group       : Unspecified
Size        : 1506464
License     : MPLv2.0
Signature   : RSA/SHA256, Mon 17 Nov 2025 10:24:42 PM -03, Key ID bc4d06a08d8b756f
Source RPM  : bind-9.16.23-34.0.1.el9_7.1.src.rpm
Build Date  : Mon 17 Nov 2025 10:19:02 PM -03
Build Host  : build-ol9-x86_64.oracle.com
Vendor      : Oracle America
URL         : https://www.isc.org/downloads/bind/
Summary     : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
Description :
BIND (Berkeley Internet Name Domain) is an implementation of the DNS
(Domain Name System) protocols. BIND includes a DNS server (named),
which resolves host names to IP addresses; a resolver library
(routines for applications to use when interfacing with DNS); and
tools for verifying that the DNS server is operating properly.
[...]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[gean@ns1 ~]$ rpm -qil bind-utils
Name        : bind-utils
Epoch       : 32
Version     : 9.16.23
Release     : 34.0.1.el9_7.1
Architecture: x86_64
Install Date: Fri 06 Feb 2026 11:01:59 AM -03
Group       : Unspecified
Size        : 657438
License     : MPLv2.0
Signature   : RSA/SHA256, Mon 17 Nov 2025 10:24:44 PM -03, Key ID bc4d06a08d8b756f
Source RPM  : bind-9.16.23-34.0.1.el9_7.1.src.rpm
Build Date  : Mon 17 Nov 2025 10:19:02 PM -03
Build Host  : build-ol9-x86_64.oracle.com
Vendor      : Oracle America
URL         : https://www.isc.org/downloads/bind/
Summary     : Utilities for querying DNS name servers
Description :
Bind-utils contains a collection of utilities for querying DNS (Domain
Name System) name servers to find out information about Internet
hosts. These tools will provide you with the IP addresses for given
host names, as well as other information about registered domains and
network addresses.

6.4 Ativação do Serviço

Ative o serviço BIND para iniciar automaticamente no boot:

1
sudo systemctl enable --now named

Verifique o status:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[gean@ns1 ~]$ sudo systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
     Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: disabled)
     Active: active (running) since Fri 2026-02-06 11:12:37 -03; 11min ago
    Process: 1493 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is>
    Process: 1495 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
   Main PID: 1496 (named)
      Tasks: 10 (limit: 9010)
     Memory: 23.9M (peak: 26.2M)
        CPU: 147ms
     CGroup: /system.slice/named.service
             └─1496 /usr/sbin/named -u named -c /etc/named.conf

Feb 06 11:12:37 ns1 named[1496]: zone localhost.localdomain/IN: loaded serial 0
Feb 06 11:12:37 ns1 named[1496]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
Feb 06 11:12:37 ns1 named[1496]: zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
Feb 06 11:12:37 ns1 named[1496]: zone localhost/IN: loaded serial 0
Feb 06 11:12:37 ns1 named[1496]: all zones loaded
Feb 06 11:12:37 ns1 named[1496]: running
Feb 06 11:12:37 ns1 systemd[1]: Started Berkeley Internet Name Domain (DNS).
Feb 06 11:12:37 ns1 named[1496]: managed-keys-zone: Initializing automatic trust anchor management for zone "."; DNSKEY ID 20326 is now trusted, waiving the normal 30-day w>
Feb 06 11:12:37 ns1 named[1496]: managed-keys-zone: Initializing automatic trust anchor management for zone "."; DNSKEY ID 38696 is now trusted, waiving the normal 30-day w>
Feb 06 11:12:38 ns1 named[1496]: resolver priming query complete

6.5 Verificação de Portas

Confirme que o BIND está escutando na porta 53:

1
2
3
4
5
6
7
8
9
10
11
[gean@ns1 ~]$ ss -nltpu | grep 53 
udp   UNCONN 0      0          127.0.0.1:53        0.0.0.0:*          
udp   UNCONN 0      0          127.0.0.1:53        0.0.0.0:*          
udp   UNCONN 0      0              [::1]:53           [::]:*          
udp   UNCONN 0      0              [::1]:53           [::]:*          
tcp   LISTEN 0      4096       127.0.0.1:953       0.0.0.0:*          
tcp   LISTEN 0      10         127.0.0.1:53        0.0.0.0:*          
tcp   LISTEN 0      10         127.0.0.1:53        0.0.0.0:*          
tcp   LISTEN 0      10             [::1]:53           [::]:*          
tcp   LISTEN 0      10             [::1]:53           [::]:*          
tcp   LISTEN 0      4096           [::1]:953          [::]:*     

7. BIND como Servidor Cache

Agora que o BIND está instalado, configure-o para funcionar como servidor cache. Primeiro, configure o /etc/resolv.conf para usar o próprio servidor:

1
2
3
[gean@ns1 ~]$ echo -e "nameserver 127.0.0.1\nnameserver ::1" | sudo tee /etc/resolv.conf 
nameserver 127.0.0.1
nameserver ::1
1
sudo chattr +i /etc/resolv.conf

Nosso servidor recém-instalado já está operando como servidor cache. Para demonstrar o efeito do cache, faça uma consulta DNS e observe o Query time. Em seguida, repita a mesma consulta e note a diferença:

Nota: O servidor de cache nesse momento já está funcionando, apenas para o próprio servidor, respondendo na loopback

Primeira Consulta (sem cache):

1
2
3
4
5
6
[gean@ns1 ~]$ dig @localhost -t soa kernel.org | tail -n6

;; Query time: 2217 msec
;; SERVER: ::1#53(::1)
;; WHEN: Fri Feb 06 11:26:35 -03 2026
;; MSG SIZE  rcvd: 126

Segunda Consulta (com cache):

1
2
3
4
5
6
[gean@ns1 ~]$ dig @localhost -t soa kernel.org | tail -n6

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Fri Feb 06 11:26:39 -03 2026
;; MSG SIZE  rcvd: 126

8. Conhecendo o Arquivo de Configuração Principal: /etc/named.conf

O arquivo /etc/named.conf é o coração da configuração do BIND. Ele define as opções globais do servidor, as zonas que ele gerencia e outras configurações importantes. Vamos analisar as principais seções deste arquivo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[gean@ns1 ~]$ sudo cat /etc/named.conf 
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
	listen-on port 53 { 127.0.0.1; };
	listen-on-v6 port 53 { ::1; };
	directory 	"/var/named";
	dump-file 	"/var/named/data/cache_dump.db";
	statistics-file "/var/named/data/named_stats.txt";
	memstatistics-file "/var/named/data/named_mem_stats.txt";
	secroots-file	"/var/named/data/named.secroots";
	recursing-file	"/var/named/data/named.recursing";
	allow-query     { localhost; };

	/* 
	 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
	 - If you are building a RECURSIVE (caching) DNS server, you need to enable 
	   recursion. 
	 - If your recursive DNS server has a public IP address, you MUST enable access 
	   control to limit queries to your legitimate users. Failing to do so will
	   cause your server to become part of large scale DNS amplification 
	   attacks. Implementing BCP38 within your network would greatly
	   reduce such attack surface 
	*/
	recursion yes;

	dnssec-validation yes;

	managed-keys-directory "/var/named/dynamic";
	geoip-directory "/usr/share/GeoIP";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";

	/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
	include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
	type hint;
	file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

8.1 Seção options

Esta é a seção de configuração global. As diretivas definidas aqui se aplicam a todo o servidor, a menos que sejam sobrescritas em uma seção mais específica (como uma view ou zone).

  • listen-on / listen-on-v6: Especifica em quais endereços IP e portas o BIND deve escutar por consultas. No exemplo, ele está configurado para escutar apenas na interface de loopback (127.0.0.1 e ::1), o que é o padrão para um servidor de cache local.
  • directory: Define o diretório de trabalho do named. Todos os caminhos relativos nos arquivos de configuração serão baseados neste diretório.
  • allow-query: Controla quem tem permissão para fazer consultas ao servidor. localhost; permite apenas consultas originadas do próprio servidor.
  • recursion yes;: Habilita a funcionalidade de servidor recursivo. É essencial para um servidor de cache, mas deve ser desabilitado em um servidor puramente autoritativo exposto à internet.

8.2 Seção logging

Esta seção controla como o BIND registra suas atividades (logs). A configuração padrão cria um canal (channel) chamado default_debug que envia todas as mensagens de log de severidade dinâmica para o arquivo data/named.run (relativo ao diretório de trabalho).

Nas próximas partes, veremos como criar uma configuração de logging muito mais granular e útil, separando diferentes categorias de eventos (consultas, segurança, erros) em arquivos distintos.

8.3 Seção zone

Cada bloco zone define uma zona DNS que o servidor gerencia. A configuração padrão inclui a zona raiz (.), que é do tipo hint. Isso significa que o BIND usará o arquivo named.ca para saber quais são os servidores raiz da internet, o ponto de partida para qualquer consulta recursiva.

8.4 Seção include

A diretiva include permite dividir a configuração em múltiplos arquivos, o que é uma prática essencial para manter a organização. O arquivo padrão inclui /etc/named.rfc1912.zones, que contém definições de zonas para redes privadas (RFC 1912), e /etc/named.root.key, que contém as chaves de confiança para a validação DNSSEC da zona raiz.


Conclusão

Nesta primeira parte, construímos a fundação para nossa jornada com o BIND. Definimos nossa arquitetura, entendemos os diferentes papéis que um servidor DNS pode desempenhar e instalamos com sucesso o BIND 9. Além disso, o configuramos para funcionar como um servidor de cache local e verificamos sua operação.

Com essa base estabelecida, estamos prontos para avançar para a próxima fase: estruturar e organizar as configurações de forma profissional para suportar nosso ambiente de split-view.


Próximos Passos

Agora que o BIND está instalado e funcionando como um servidor de cache, o próximo passo é organizar nossa estrutura de arquivos e criar a configuração avançada que separará as consultas internas das externas.

Clique aqui para ir para DNS com o BIND Parte 2: Estrutura e Configuração do BIND


Referências


This post is licensed under CC BY 4.0 by the author.