Post

DNS com o BIND Parte 3: Implementação de Zonas DNS

DNS com o BIND Parte 3: Implementação de Zonas DNS

Introdução

Na Parte 2, construímos o esqueleto do nosso servidor BIND com uma estrutura de diretórios e configuração modular. Agora, na Parte 3, vamos dar vida a esse esqueleto, preenchendo-o com os dados que realmente importam: os registros DNS. Esta é a parte central da configuração, onde definimos os mapeamentos de nomes para endereços IP e vice-versa, tanto para nossa rede interna quanto para a presença pública na internet.

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

O que será visto nesta terceira parte

  • Registros DNS: Uma visão detalhada dos tipos de registros mais comuns e sua função.
  • Estrutura de Arquivo de Zona: Como os arquivos de zona são formatados, com foco no registro SOA.
  • Implementação de Zonas Internas: Criaremos os arquivos de zona para a view interna, incluindo encaminhamento e resolução reversa para IPv4 e IPv6.
  • Delegação Reversa com DNAME: Entenderemos a fundo como e por que usar o registro DNAME para simplificar a administração de zonas reversas IPv6.
  • Implementação de Zonas Externas: Criaremos os arquivos de zona para a view externa, expondo os serviços públicos de forma segura.
  • Permissões e SELinux: Garantiremos que todos os novos arquivos de zona tenham as permissões e os contextos de segurança corretos.

Pré-requisitos

  • Estrutura de Diretórios Pronta: Ter completado com sucesso a Parte 2 e ter toda a estrutura de diretórios e arquivos de configuração no lugar.
  • Conceitos de views e ACLs: Entender a lógica de separação de clientes que foi configurada no named.conf.

1. Compreendendo Registros DNS

Registros DNS (Resource Records - RR) são as unidades de informação em um arquivo de zona. Cada registro é uma linha que associa um nome a um tipo de dado específico, como um endereço IP, o nome de um servidor de e-mail ou informações de texto. A sintaxe geral de um registro é:

nome [TTL] [classe] tipo dados

1.1 Registros Fundamentais

RegistroNome CompletoDescrição
AAddressMapeia um nome de host para um endereço IPv4. É o registro mais comum.
AAAAIPv6 AddressMapeia um nome de host para um endereço IPv6.
CNAMECanonical NameCria um apelido (alias) para outro nome de host. O nome canônico é o nome “real”.
MXMail ExchangerEspecifica os servidores de e-mail responsáveis por receber mensagens para o domínio. Inclui uma prioridade.
NSName ServerDelega uma zona para ser gerenciada por um servidor de nomes específico.
PTRPointerUsado em zonas reversas para mapear um endereço IP de volta para um nome de host.
TXTTextPermite associar texto arbitrário a um nome de host. Usado para SPF, DKIM, DMARC e verificação de propriedade de domínio.
SRVServiceGeneraliza o conceito do registro MX, permitindo especificar a localização (host e porta) de qualquer serviço.

1.2 Registros de Autenticação de E-mail

Para combater spam e phishing, foram criados mecanismos que usam o DNS para verificar a autenticidade de e-mails.

RegistroNome CompletoDescrição
SPFSender Policy Framework(Tipo TXT) Lista os servidores de e-mail autorizados a enviar mensagens em nome do seu domínio.
DKIMDomainKeys Identified Mail(Tipo TXT) Fornece uma chave pública que os servidores de recebimento usam para verificar uma assinatura digital adicionada ao e-mail pelo servidor de envio.
DMARCDomain-based Message Authentication, Reporting and Conformance(Tipo TXT) Define a política a ser aplicada (rejeitar, quarentena ou nenhuma) quando um e-mail falha nas verificações SPF e/ou DKIM. Também especifica um endereço para receber relatórios.

1.3 Diretivas de Arquivo de Zona

Além dos registros, os arquivos de zona podem conter diretivas que começam com $.

DiretivaDescrição
$ORIGINDefine o sufixo de domínio que será anexado a todos os nomes não qualificados (que não terminam com um ponto).
$TTLDefine o Time-To-Live (tempo de vida) padrão para os registros que não possuem um TTL explícito.
$INCLUDEInclui o conteúdo de outro arquivo no arquivo de zona atual, permitindo a modularização.
$GENERATEGera um conjunto de registros de forma programática, útil para criar um grande número de registros semelhantes (como em zonas reversas).

2. Estrutura de um Arquivo de Zona

Todo arquivo de zona começa com diretivas opcionais ($TTL, $ORIGIN) e, obrigatoriamente, com um registro SOA, seguido pelos outros registros da zona.

2.1 Registro SOA (Start of Authority)

O registro SOA é o mais importante. Ele define as propriedades globais da zona e quem é o responsável por ela.

@ IN SOA ns1.lab4it.com.br. hostmaster.lab4it.com.br. (

CampoValor ExemploDescrição
Name Server Primárions1.lab4it.com.br.O FQDN do servidor DNS primário para esta zona.
E-mail do Responsávelhostmaster.lab4it.com.br.O endereço de e-mail do administrador da zona (o primeiro . substitui o @).
Serial2026020401O número de série da zona. Deve ser incrementado toda vez que a zona for alterada. O formato YYYYMMDDNN (AnoMêsDiaRevisão) é uma convenção popular.
Refresh14400 (4 horas)O tempo em segundos que um servidor secundário (slave) deve esperar antes de perguntar ao primário (master) se há atualizações.
Retry3600 (1 hora)Se o secundário não conseguir contatar o primário após o refresh, ele esperará este tempo antes de tentar novamente.
Expire2419200 (4 semanas)Se o secundário não conseguir contatar o primário por este período, ele deixará de responder como autoritativo para a zona.
Minimum (Negative TTL)300 (5 minutos)O tempo que outros servidores devem manter em cache uma resposta negativa (NXDOMAIN - domínio não existente) para esta zona.

2.2 Registros NS (Name Server)

Logo após o SOA, você deve declarar quais são os servidores de nomes autoritativos para a zona. Estes registros informam ao mundo quais servidores podem responder oficialmente por este domínio.

IN NS ns1.lab4it.com.br. IN NS ns2.lab4it.com.br.


3. Zonas Internas (/var/named/zones/internals/)

3.1 Zona de Encaminhamento Interna: lab4it.com.br.zone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sudo cat /var/named/zones/internals/forward/lab4it.com.br.zone
$ORIGIN lab4it.com.br.
$TTL 86400 ; 1 day
@       IN SOA  ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                            2026020401 ; serial (yyyymmddxx)
                            14400      ; refresh (4 hours)
                            3600       ; retry (1 hour)
                            2419200    ; expire (4 weeks)
                            300        ; minimum (5 minutes)
                            )
 
                        NS      ns1.lab4it.com.br.
                        NS      ns2.lab4it.com.br.
 
$ORIGIN lab4it.com.br.
$TTL 10800   ; 3 hours

; DNSs
ns1.lab4it.com.br.              A       10.16.32.2
                                AAAA    fd00:0:0:1::2
ns2.lab4it.com.br.              A       10.16.32.3
                                AAAA    fd00:0:0:1::3

3.2 Zona de Resolução Inversa IPv4: 16.32.10.in-addr.arpa.zone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo cat /var/named/zones/internals/reverse/ipv4/rev-10.16.32.24.ipv4.zone
$ORIGIN 32.16.10.in-addr.arpa.
$TTL 86400      ; 1 day
@     IN SOA ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                    2026020401 ; serial (yyyymmddxx)
                    14400      ; refresh (4 hours)
                    3600       ; retry (1 hour)
                    2419200    ; expire (4 weeks)
                    300        ; minimum (5 minutes)
                    )
                NS      ns1.lab4it.com.br.
                NS      ns2.lab4it.com.br.

$ORIGIN 32.16.10.in-addr.arpa.
2         PTR     ns1.lab4it.com.br.
3         PTR     ns2.lab4it.com.br.

3.3 Zona de Resolução Inversa IPv6: 0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo cat /var/named/zones/internals/reverse/ipv6/rev-fd00.48.ipv6.zone
$ORIGIN 0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa.
$TTL 86400
@   IN  SOA  ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                  2026020401 ; serial
                  14400      ; refresh
                  3600       ; retry
                  2419200    ; expire
                  300        ; minimum
                  )
    IN  NS   ns1.lab4it.com.br.
    IN  NS   ns2.lab4it.com.br.

; Mapeia fd00:0:0:1::/64 para a zona personalizada
; Note que 1.0.0.0 representa o 4º grupo (hexteto) do IPv6
1.0.0.0 IN DNAME 1.rev-ip6.lab4it.com.br.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo cat /var/named/zones/internals/reverse/ipv6/dname-subnet1.ipv6.zone
$ORIGIN 1.rev-ip6.lab4it.com.br.
$TTL 86400
@   IN  SOA  ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                  2026020401 ; serial
                  14400      ; refresh
                  3600       ; retry
                  2419200    ; expire
                  300        ; minimum
                  )
    IN  NS   ns1.lab4it.com.br.
    IN  NS   ns2.lab4it.com.br.

; Registros PTR 
; IP: fd00:0:0:1::2 -> Reverso final: 2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa.
; Como o DNAME cuida dos primeiros 16 nibbles, aqui colocamos os 16 nibbles restantes (Interface ID)
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR ns1.lab4it.com.br.
3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR ns2.lab4it.com.br.

4. Entendendo DNAME para IPv6

Por Que Usar DNAME?

Administrar zonas reversas para IPv6 pode ser extremamente tedioso. Uma única sub-rede /64 tem um espaço de endereçamento vasto, e criar um registro PTR para cada endereço é impraticável. Além disso, a notação reversa de um endereço IPv6 é longa e propensa a erros.

O registro DNAME (Delegation Name), definido na RFC 6672, resolve isso de forma elegante. Ele permite criar um alias para uma árvore inteira de nomes, em vez de apenas um único nome como o CNAME. Para zonas reversas, isso significa que podemos delegar a resolução de uma grande faixa de endereços IP para outra zona com um nome mais simples.

4.1 Como Funciona

O processo ocorre em duas etapas:

  1. Delegação na Zona Principal: Na zona reversa principal (ex: a do /48), criamos um registro DNAME que aponta um prefixo específico (ex: o do /64) para uma nova zona com um nome amigável (ex: 1.rev-ip6.lab4it.com.br).
  2. Criação da Zona de Destino: Criamos essa nova zona e, dentro dela, colocamos os registros PTR usando apenas a parte final (o ID da Interface) do endereço IPv6.

Quando uma consulta reversa chega para um IP dentro daquele /64, o BIND encontra o DNAME, sintetiza um registro CNAME “virtual” e redireciona a consulta para a zona de destino, onde o PTR final é encontrado. Isso simplifica drasticamente a administração, pois só precisamos gerenciar os registros na zona de destino, que tem um nome muito mais curto.


5. Zonas Externas (/var/named/zones/externals/)

5.1 Zona de Encaminhamento Externa: lab4it.com.br.zone

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
; /var/named/zones/externals/forward/lab4it.com.br.zone
$ORIGIN lab4it.com.br.
$TTL 86400 ; 1 day

@       IN SOA  ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                            2026020401 ; serial
                            14400      ; refresh (4 hours)
                            3600       ; retry (1 hour)
                            2419200    ; expire (4 weeks)
                            300        ; minimum (5 minutes)
                            )
 
                        NS      ns1.lab4it.com.br.
                        NS      ns2.lab4it.com.br.
 
                        A       203.0.113.24
                        AAAA    2001:db8::24
                        MX      10 mail.lab4it.com.br.
                        TXT     "v=spf1 a mx -all"

; DMARC Policy
_dmarc                  TXT     "v=DMARC1; p=none"

; DKIM
_domainkey              TXT     "o=~"
mail._domainkey         TXT     "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/..sua..chave..publica..AQAB"

$ORIGIN lab4it.com.br.
$TTL 10800   ; 3 hours

ns1                     A       203.0.113.2
                        AAAA    2001:db8::2
ns2                     A       203.0.113.3
                        AAAA    2001:db8::3

mail                    A       203.0.113.5
                        AAAA    2001:db8::5
www                     A       203.0.113.24
                        AAAA    2001:db8::24

$ORIGIN lab4it.com.br. 
$GENERATE   0-255     host-$.lab4it.com.br    IN      A    128.66.48.$
$GENERATE   0-255     host-$.lab4it.com.br    IN      A    128.66.49.$
$GENERATE   0-255     host-$.lab4it.com.br    IN      A    128.66.50.$
$GENERATE   0-255     host-$.lab4it.com.br    IN      A    128.66.51.$

Zonas de Resolução Inversa IPv4 e IPv6 Externas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; /var/named/zones/externals/reverse/ipv4/rev-203.0.113.24.ipv4.zone
$ORIGIN 113.0.203.in-addr.arpa.
$TTL 86400      ; 1 dia
@     IN SOA ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                    2026020401 ; serial (aaaammddxx)
                    14400      ; refresh (4 horas)
                    3600       ; retry (1 hora)
                    2419200    ; expire (4 semanas)
                    300        ; minimum (5 minutos)
                    )
                NS      ns1.lab4it.com.br.
                NS      ns2.lab4it.com.br.

$ORIGIN 113.0.203.in-addr.arpa.
2         PTR     ns1.lab4it.com.br.
3         PTR     ns2.lab4it.com.br.
5         PTR     mail.lab4it.com.br.
24        PTR     www.lab4it.com.br.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; /var/named/zones/externals/reverse/ipv4/rev-128.66.48.24.ipv4.zone
$ORIGIN 48.66.128.in-addr.arpa. 
$TTL 86400      ; 1 dia
@     IN SOA ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                    2026020401 ; serial (aaaammddxx)
                    14400      ; refresh (4 horas)
                    3600       ; retry (1 hora)
                    2419200    ; expire (4 semanas)
                    300        ; minimum (5 minutos)
                    )
                NS      ns1.lab4it.com.br.
                NS      ns2.lab4it.com.br.

$ORIGIN 48.66.128.in-addr.arpa.
$GENERATE 0-255   $   IN    PTR   host-$.lab4it.com.br.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; /var/named/zones/externals/reverse/ipv4/rev-128.66.49.24.ipv4.zone
$ORIGIN 49.66.128.in-addr.arpa. 
$TTL 86400      ; 1 dia
@     IN SOA ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                    2026020401 ; serial (aaaammddxx)
                    14400      ; refresh (4 horas)
                    3600       ; retry (1 hora)
                    2419200    ; expire (4 semanas)
                    300        ; minimum (5 minutos)
                    )
                NS      ns1.lab4it.com.br.
                NS      ns2.lab4it.com.br.

$ORIGIN 49.66.128.in-addr.arpa.
$GENERATE 0-255   $   IN    PTR   host-$.lab4it.com.br.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; /var/named/zones/externals/reverse/ipv4/rev-128.66.50.24.ipv4.zone
$ORIGIN 50.66.128.in-addr.arpa. 
$TTL 86400      ; 1 dia
@     IN SOA ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                    2026020401 ; serial (aaaammddxx)
                    14400      ; refresh (4 horas)
                    3600       ; retry (1 hora)
                    2419200    ; expire (4 semanas)
                    300        ; minimum (5 minutos)
                    )
                NS      ns1.lab4it.com.br.
                NS      ns2.lab4it.com.br.

$ORIGIN 50.66.128.in-addr.arpa.
$GENERATE 0-255   $   IN    PTR   host-$.lab4it.com.br.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; /var/named/zones/externals/reverse/ipv4/rev-128.66.51.24.ipv4.zone
$ORIGIN 51.66.128.in-addr.arpa. 
$TTL 86400      ; 1 dia
@     IN SOA ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                    2026020401 ; serial (aaaammddxx)
                    14400      ; refresh (4 horas)
                    3600       ; retry (1 hora)
                    2419200    ; expire (4 semanas)
                    300        ; minimum (5 minutos)
                    )
                NS      ns1.lab4it.com.br.
                NS      ns2.lab4it.com.br.

$ORIGIN 51.66.128.in-addr.arpa.
$GENERATE 0-255   $   IN    PTR   host-$.lab4it.com.br.

Delegação Reversa IPv6 usando DNAME (RFC 6672)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; 2001:db8::/48
; /var/named/zones/externals/reverse/ipv6/rev-2001_db8.48.ipv6.zone
$ORIGIN 0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
$TTL 86400
@   IN  SOA  ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                  2026020401 ; serial
                  14400      ; refresh
                  3600       ; retry
                  2419200    ; expire
                  300        ; minimum
                  )
    IN  NS   ns1.lab4it.com.br.
    IN  NS   ns2.lab4it.com.br.

; Delegações DNAME para sub-redes /64
0.0.0.0 IN DNAME 0.rev-ip6.lab4it.com.br.  ; 2001:db8::/64
; Delegação correta do /64
0.0.0.0.0.0.0.0 IN DNAME 0.rev-ip6.lab4it.com.br.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; /var/named/zones/externals/reverse/ipv6/dname-subnet0.ipv6.zone
$ORIGIN 0.rev-ip6.lab4it.com.br.
$TTL 86400
@   IN  SOA  ns1.lab4it.com.br. hostmaster.lab4it.com.br. (
                  2026020401 ; serial
                  14400      ; refresh
                  3600       ; retry
                  2419200    ; expire
                  300        ; minimum
                  )
    IN  NS   ns1.lab4it.com.br.
    IN  NS   ns2.lab4it.com.br.

; Registros PTR 
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR ns1.lab4it.com.br.
3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR ns2.lab4it.com.br.

Estrutura final:

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
[gean@ns1 ~]$ sudo tree /var/named/zones
/var/named/zones
├── externals
│   ├── forward
│   │   └── lab4it.com.br.zone
│   └── reverse
│       ├── ipv4
│       │   ├── rev-128.66.48.24.ipv4.zone
│       │   ├── rev-128.66.49.24.ipv4.zone
│       │   ├── rev-128.66.50.24.ipv4.zone
│       │   ├── rev-128.66.51.24.ipv4.zone
│       │   └── rev-203.0.113.24.ipv4.zone
│       └── ipv6
│           ├── dname-subnet0.ipv6.zone
│           └── rev-2001_db8.48.ipv6.zone
└── internals
    ├── forward
    │   └── lab4it.com.br.zone
    └── reverse
        ├── ipv4
        │   └── rev-10.16.32.24.ipv4.zone
        └── ipv6
            ├── dname-subnet1.ipv6.zone
            └── rev-fd00.48.ipv6.zone

10 directories, 12 files

Permissões e Contextos SELinux para Zonas

1
2
3
sudo find /var/named/zones -type d -exec chmod 750 {} \;
sudo find /var/named/zones -type f -exec chmod 640 {} \;
sudo chown -R root:named /var/named/zones
1
2
sudo semanage fcontext -a -t named_zone_t "/var/named/zones(/.*)?"
sudo restorecon -Rv /var/named/zones 

Verificação de Contextos SELinux

1
2
3
4
5
6
7
8
9
10
[gean@ns1 ~]$ sudo ls -lZ /var/named/
total 16
drwxrwx---. 2 named named system_u:object_r:named_cache_t:s0      23 Feb  6 11:12 data
drwxrwx---. 2 named named system_u:object_r:named_cache_t:s0      60 Feb  6 11:13 dynamic
-rw-r-----. 1 root  named system_u:object_r:named_conf_t:s0     2112 Nov 17 22:21 named.ca
-rw-r-----. 1 root  named system_u:object_r:named_zone_t:s0      152 Nov 17 22:21 named.empty
-rw-r-----. 1 root  named system_u:object_r:named_zone_t:s0      152 Nov 17 22:21 named.localhost
-rw-r-----. 1 root  named system_u:object_r:named_zone_t:s0      168 Nov 17 22:21 named.loopback
drwxrwx---. 2 named named system_u:object_r:named_cache_t:s0       6 Nov 17 22:21 slaves
drwxr-x---. 4 root  named unconfined_u:object_r:named_zone_t:s0   40 Feb  6 11:37 zones
1
2
3
4
[gean@ns1 ~]$ sudo ls -lZ /var/named/zones
total 0
drwxr-x---. 4 root named unconfined_u:object_r:named_zone_t:s0 36 Feb  6 11:37 externals
drwxr-x---. 4 root named unconfined_u:object_r:named_zone_t:s0 36 Feb  6 11:37 internals
1
sudo semanage port -l | grep named

Conclusão

Nesta terceira e densa parte, mergulhamos no coração do DNS: os arquivos de zona. Dissecamos os principais tipos de registros, entendemos a estrutura de um arquivo de zona com o registro SOA e, o mais importante, criamos todos os arquivos de zona necessários para as nossas views interna e externa. Também desmistificamos o uso do DNAME para simplificar a complexa tarefa de gerenciar zonas reversas IPv6.

Finalmente, garantimos que todos os novos arquivos tivessem as permissões e os contextos SELinux corretos, deixando nosso servidor pronto para ser validado.


Próximos Passos

Com todos os arquivos de configuração e de zona no lugar, a próxima e última etapa desta série inicial é validar toda a nossa configuração, iniciar o serviço, realizar testes exaustivos para garantir que ambas as views (interna e externa) estão funcionando como esperado e aprender os comandos básicos de operação do dia a dia.

Clique aqui para ir para a Fase 4: Validação, Testes e Operação


Referências


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