Post

DNS com o BIND Parte 2: Estrutura e Configuração do BIND

DNS com o BIND Parte 2: Estrutura e Configuração do BIND

Introdução

Na primeira parte desta série, estabelecemos a base, instalando o BIND e configurando-o como um servidor de cache local. Agora, é hora de ir além e construir uma configuração profissional e escalável. A organização dos arquivos de configuração é um passo crucial que muitos administradores negligenciam, mas que faz uma enorme diferença na manutenibilidade e clareza do ambiente a longo prazo.

Neste segundo módulo, vamos desmantelar o /etc/named.conf padrão e reconstruí-lo de forma modular e inteligente, preparando o terreno para nosso servidor split-view.

Clique aqui para ir para DNS com o BIND Parte 1: Fundamentos e Instalação do Servidor DNS com BIND

O que será visto nesta segunda parte

  • Estrutura de Diretórios: Criaremos uma hierarquia de diretórios lógica para configurações e arquivos de zona.
  • Nomenclatura de Zonas Reversas: Desmistificaremos a sintaxe de zonas reversas para IPv4 e IPv6.
  • Configuração Avançada: Reescreveremos o named.conf para usar ACLs, views e includes.
  • Logging Granular: Implementaremos uma configuração de logs que separa os eventos por categoria.
  • Permissões e SELinux: Ajustaremos as permissões de arquivos e os contextos de segurança do SELinux.

Pré-requisitos

  • BIND Instalado: Ter completado com sucesso a Parte 1 desta série.
  • Acesso root ou sudo: Necessário para criar diretórios e alterar arquivos em /etc e /var.

1. Estrutura de Diretórios para Configuração do BIND

Uma estrutura de diretórios bem organizada é essencial para manutenção e escalabilidade. Vamos criar uma hierarquia clara que separa configuração, dados e logs.

1.1 Estrutura Recomendada

1
2
3
4
5
6
7
8
/etc/named/
├── named.common.zones          # Zonas comuns (root, RFC1912)     
├── named.external.zones        # Definição de zonas externas
├── named.internal.zones        # Definição de zonas internas
├── named.logging.conf          # Configuração de logging
└── keys/                       # Chaves TSIG (para transferência segura)
    ├── tsig-internals.key      # Chave para transferência interna
    └── tsig-externals.key      # Chave para transferência externa

Benefícios desta estrutura:

  • Clareza: Separa logicamente as configurações por função (interna, externa, logging).
  • Manutenibilidade: Facilita a localização e edição de arquivos de zona específicos sem poluir o named.conf principal.
  • Escalabilidade: Permite adicionar novos domínios ou views de forma organizada, simplesmente adicionando novos arquivos de inclusão.
  • Segurança: Isola as definições de zona, reduzindo o risco de erros de configuração que poderiam expor dados internos.

1.2 Estrutura de Diretórios para Dados de Zona

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/var/named/zones/
├── internals/                          # Zonas para rede interna
│   ├── forward/                        # Zonas de encaminhamento (diretas)
│   │   └── lab4it.com.br.zone         # Zona do domínio interno
│   └── reverse/                        # Zonas de resolução inversa
│       ├── ipv4/                       # Zonas reversas IPv4
│       │   └── rev-10.16.32.24.ipv4.zone
│       └── ipv6/                       # Zonas reversas IPv6
│           ├── rev-fd00.48.ipv6.zone
│           └── dname-subnet1.ipv6.zone
│
└── externals/                          # Zonas para internet pública
    ├── forward/                        # Zonas de encaminhamento (diretas)
    │   └── lab4it.com.br.zone          # Zona do domínio público
    └── reverse/                        # Zonas de resolução inversa
        ├── ipv4/                       # Zonas reversas IPv4
        │   ├── rev-203.0.113.24.ipv4.zone
        │   ├── 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
        └── ipv6/                       # Zonas reversas IPv6
            ├── rev-2001_db8.48.ipv6.zone
            └── dname-subnet0.ipv6.zone

Explicação da estrutura:

  • internals/ - Zonas acessíveis apenas pela rede interna
  • externals/ - Zonas acessíveis pela internet pública
  • forward/ - Zonas de encaminhamento (A, AAAA, MX, etc.)
  • reverse/ - Zonas de resolução inversa (PTR)
  • ipv4/ e ipv6/ - Separação por versão de protocolo

1.3 Criação dos Diretórios

Execute os seguintes comandos para criar toda a estrutura:

1
2
3
4
5
6
7
8
9
10
# Criar estrutura de configuração
sudo mkdir -p /etc/named/keys

# Criar estrutura de dados de zona
sudo mkdir -p /var/named/zones/internals/forward
sudo mkdir -p /var/named/zones/internals/reverse/ipv4
sudo mkdir -p /var/named/zones/internals/reverse/ipv6
sudo mkdir -p /var/named/zones/externals/forward
sudo mkdir -p /var/named/zones/externals/reverse/ipv4
sudo mkdir -p /var/named/zones/externals/reverse/ipv6

Alternativa compacta:

1
2
3
4
sudo mkdir -p /etc/named/keys
sudo mkdir -p /var/named/zones/{internals,externals}/{forward,reverse}
sudo mkdir -p /var/named/zones/internals/reverse/{ipv4,ipv6}
sudo mkdir -p /var/named/zones/externals/reverse/{ipv4,ipv6}

1.4 Verificação da Estrutura

Verifique que todos os diretórios foram criados corretamente:

1
2
tree /etc/named/
tree /var/named/zones/

Nota: Se o comando tree não estiver disponível, use find /etc/named -type d e find /var/named/zones -type d.


2. Tabela de Conversão de Nomenclatura de Zonas Reversas

Um dos aspectos mais confusos do DNS é a nomenclatura de zonas reversas (PTR). Esta tabela serve como referência rápida:

TipoNotação TécnicaNome do ArquivoLocalização RelativaDescrição
IPv432.16.10.in-addr.arparev-10.16.32.24.ipv4.zonezones/internals/reverse/ipv4/Rede interna 10.16.32.0/20
IPv4113.0.203.in-addr.arparev-203.0.113.24.ipv4.zonezones/externals/reverse/ipv4/Rede externa 203.0.113.0/24
IPv448.66.128.in-addr.arparev-128.66.48.24.ipv4.zonezones/externals/reverse/ipv4/Rede externa 128.66.48.0/22
IPv68.b.d.0.1.0.0.2.ip6.arparev-2001_db8.48.ipv6.zonezones/externals/reverse/ipv6/Rede externa 2001:db8::/48
DNAME0.rev-ip6.lab4it.com.brdname-subnet0.ipv6.zonezones/externals/reverse/ipv6/Delegação DNAME para IPv6
FWDlab4it.com.brlab4it.com.br.zonezones/internals/forward/ ou zones/externals/forward/Zona de encaminhamento

Explicação da conversão IPv4:

Para converter um endereço IPv4 em notação de zona reversa:

  1. Endereço: 10.16.32.0/20
  2. Reverter octetos: 32.16.10
  3. Adicionar sufixo: 32.16.10.in-addr.arpa

Exemplo de conversão IPv6:

Para converter um endereço IPv6 em notação de zona reversa:

  1. Endereço: 2001:db8::/48
  2. Expandir: 2001:0db8:0000:0000:0000:0000:0000:0000
  3. Reverter nibbles: 0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2
  4. Adicionar sufixo: 0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa

Nota: Você consegue reverter um endereço ou subrede usando o comando dig dig -x 2001:db8::.


3. Arquivo de Configuração Principal: /etc/named.conf Avançado

3.1 Backup do Arquivo Original

Antes de fazer alterações, sempre faça backup:

1
sudo cp -a /etc/named.conf{,.dist-$(date +%Y%m%d)}

Explicação:

  • -a - Preserva permissões e timestamps
  • {,.dist-$(date +%Y%m%d)} - Cria cópia com data no nome

3.2 Estrutura Completa do /etc/named.conf

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# /etc/named.conf
// ================================================================================
// ACL.
// ================================================================================
acl "iface_v4" {
	127.0.0.1/32;
	10.16.32.2/32;
	203.0.113.2/32;
};
acl "iface_v6" {
	::1/128;
	fd00:0:0:1::2/128;
	2001:db8::2/128;
};

acl "internals_transfers" {
	10.16.32.3/32;
	fd00:0:0:1::3/128;
};

acl "externals_transfers" {
	203.0.113.3/32;
	2001:db8::3/128;
};

acl "internals" {
	::1/128;
	127.0.0.1/32;
	10.0.0.0/8;
	172.16.0.0/12;
	192.168.0.0/16;
        fd00::/48;
};

// Blocos para simular IPs públicos válidos
acl "public" {
	203.0.113.0/24;
	128.66.48.0/22;
	2001:db8::/48;
};

options {
	listen-on port 53 { iface_v4; };
	listen-on-v6 port 53 { iface_v6; };
	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";
        version none;
	hostname none;
	server-id none;
	auth-nxdomain no;
	max-ncache-ttl 300;
	min-cache-ttl 90;

	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.
// ================================================================================
include "/etc/named/named.logging.conf";

// ================================================================================
// Views
// ================================================================================
view "internals"
{
        match-clients {
                internals;
        };

        allow-query { internals; };
        allow-recursion { internals; };
        allow-query-cache { internals; };
        allow-transfer { internals_transfers; };
        also-notify { 10.16.32.3; fd00:0:0:1::3; };

        include "/etc/named/named.common.zones";
        include "/etc/named/named.internals.zones";
};

view "externals"
{
        match-clients { any; };
        recursion no;
        allow-transfer { externals_transfers; };
        also-notify { 203.0.113.3; 2001:db8::3; };

        include "/etc/named/named.externals.zones";
};

4. Arquivo de Configuração de Logging: /etc/named/named.logging.conf

Um dos aspectos mais importantes da administração de um servidor é ter um sistema de logs robusto. A configuração padrão do BIND envia tudo para um único arquivo, o que torna a análise e o troubleshooting uma tarefa difícil. Vamos criar uma configuração muito mais útil, que separa os logs em canais específicos por categoria.

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
# /etc/named/named.logging.conf
logging {
    channel security_file {
        file "/var/log/named/security.log" versions 5 size 50m;
        severity dynamic;
        print-time yes;
        print-severity yes;
    };
    
    channel dnssec_log {
        file "/var/log/named/dnssec.log" versions 3 size 10m;
        severity info;
        print-time yes;
    };
    
    channel query_log {
        file "/var/log/named/query.log" versions 10 size 500m;
        severity info;
        print-time yes;
        print-category yes;
    };

    channel error_log {
        file "/var/log/named/errors.log" versions 3 size 15m;
        severity warning;
        print-time yes;
    };

    channel xfer_log {
        file "/var/log/named/xfer.log" versions 3 size 20m;
        severity info;
        print-time yes;
    };

    channel validation_log {
        file "/var/log/named/validation.log" versions 3 size 15m;
        severity dynamic;
        print-time yes;
    };

    channel unmatched_log {
        file "/var/log/named/unmatched.log" versions 3 size 10m;
        severity info;
        print-time yes;
    };

    category security { security_file; };
    category dnssec { dnssec_log; validation_log; };
    category queries { query_log; };
    category xfer-in { xfer_log; };
    category xfer-out { xfer_log; };
    category notify { xfer_log; };
    category resolver { error_log; validation_log; };
    category unmatched { unmatched_log; };
    category default { null; };
    category lame-servers { null; };
    category edns-disabled { null; };
    category delegation-only { null; };
};

5. Arquivos de Definição de Zonas Comuns: /etc/named/named.common.zones

1
2
3
4
5
6
7
8
# /etc/named/named.common.zones
zone "." IN {
	type hint;
	file "named.ca";
};

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

6. Arquivos de Definição de Zonas Internas: /etc/named/named.internals.zones

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
# /etc/named/named.internals.zones
zone "lab4it.com.br" IN {
  type master;
  file "zones/internals/forward/lab4it.com.br.zone";
};

# subrede 10.16.32.0/20
# zona /24
zone "32.16.10.in-addr.arpa" IN {
  type master;
  file "zones/internals/reverse/ipv4/rev-10.16.32.24.ipv4.zone";
};

# fd00::/48 - Nibbles no DNAME (RFC 6672)
# // Zona Master /48
zone "0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa" IN {
    type master;
    file "zones/internals/reverse/ipv6/rev-fd00.48.ipv6.zone";
};

// Zona de destino para a sub-rede /64
zone "1.rev-ip6.lab4it.com.br" IN {
    type master;
    file "zones/internals/reverse/ipv6/dname-subnet1.ipv6.zone";
};

7. Arquivos de Definição de Zonas Externas: /etc/named/named.externals.zones

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
# /etc/named/named.externals.zones
zone "lab4it.com.br" IN {
  type master;
  file "zones/externals/forward/lab4it.com.br.zone";
};

zone "113.0.203.in-addr.arpa" IN {
  type master;
  file "zones/externals/reverse/ipv4/rev-203.0.113.24.ipv4.zone";
};

# 128.66.48.0/22
zone "48.66.128.in-addr.arpa" IN {
  type master;
  file "zones/externals/reverse/ipv4/rev-128.66.48.24.ipv4.zone";
};

zone "49.66.128.in-addr.arpa" IN {
  type master;
  file "zones/externals/reverse/ipv4/rev-128.66.49.24.ipv4.zone";
};

zone "50.66.128.in-addr.arpa" IN {
  type master;
  file "zones/externals/reverse/ipv4/rev-128.66.50.24.ipv4.zone";
};

zone "51.66.128.in-addr.arpa" IN {
  type master;
  file "zones/externals/reverse/ipv4/rev-128.66.51.24.ipv4.zone";
};

#dig -x  2001:db8::
#0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. IN PTR
# Zona /48 principal - DNAME (RFC 6672)
# 2001:db8::/48
zone "0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa" IN {
  type master;
  file "zones/externals/reverse/ipv6/rev-2001_db8.48.ipv6.zone";
};

# 2001:db8::/64
zone "0.rev-ip6.lab4it.com.br" IN {
  type master;
  file "zones/externals/reverse/ipv6/dname-subnet0.ipv6.zone";
};

Permissões e Contextos SELinux

Permissões de Arquivo para /etc/named

1
2
sudo find /etc/named -type f -exec chmod 640 {} \;
sudo chown -R root:named /etc/named

Contextos SELinux para /etc/named

1
2
sudo semanage fcontext -a -t named_conf_t "/etc/named(/.*)?"
sudo restorecon -Rv /etc/named

Criação e Permissões para Diretório de Logs

1
2
3
sudo mkdir /var/log/named
sudo chown -R named:named /var/log/named
sudo chmod 750 /var/log/named

Contextos SELinux para Diretório de Logs

1
2
sudo semanage fcontext -a -t named_log_t "/var/log/named(/.*)?"
sudo restorecon -Rv /var/log/named

Conclusão

Nesta segunda parte, demos um passo fundamental para a profissionalização do nosso servidor BIND. Deixamos para trás a configuração monolítica e adotamos uma abordagem modular, organizada e segura. Criamos uma estrutura de diretórios escalável, separamos as configurações em arquivos lógicos, definimos ACLs para controle de acesso e implementamos um sistema de logging granular.

Com esta estrutura robusta em vigor, nosso servidor está pronto para começar a gerenciar zonas DNS de verdade.


Próximos Passos

Agora que toda a estrutura de configuração está montada e as permissões ajustadas, o próximo passo é popular esses diretórios com os arquivos de zona que contêm os registros DNS para nossos domínios interno e externo.

Clique aqui para ir para DNS com o BIND Parte 3: Implementação de Zonas DNS


Referências


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