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.confpara usar ACLs,viewseincludes. - 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
rootousudo: Necessário para criar diretórios e alterar arquivos em/etce/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.confprincipal. - Escalabilidade: Permite adicionar novos domínios ou
viewsde 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
treenão estiver disponível, usefind /etc/named -type defind /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:
| Tipo | Notação Técnica | Nome do Arquivo | Localização Relativa | Descrição |
|---|---|---|---|---|
| IPv4 | 32.16.10.in-addr.arpa | rev-10.16.32.24.ipv4.zone | zones/internals/reverse/ipv4/ | Rede interna 10.16.32.0/20 |
| IPv4 | 113.0.203.in-addr.arpa | rev-203.0.113.24.ipv4.zone | zones/externals/reverse/ipv4/ | Rede externa 203.0.113.0/24 |
| IPv4 | 48.66.128.in-addr.arpa | rev-128.66.48.24.ipv4.zone | zones/externals/reverse/ipv4/ | Rede externa 128.66.48.0/22 |
| IPv6 | 8.b.d.0.1.0.0.2.ip6.arpa | rev-2001_db8.48.ipv6.zone | zones/externals/reverse/ipv6/ | Rede externa 2001:db8::/48 |
| DNAME | 0.rev-ip6.lab4it.com.br | dname-subnet0.ipv6.zone | zones/externals/reverse/ipv6/ | Delegação DNAME para IPv6 |
| FWD | lab4it.com.br | lab4it.com.br.zone | zones/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:
- Endereço: 10.16.32.0/20
- Reverter octetos: 32.16.10
- 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:
- Endereço: 2001:db8::/48
- Expandir: 2001:0db8:0000:0000:0000:0000:0000:0000
- Reverter nibbles: 0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2
- 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
- ISC BIND Official Documentation
- BIND 9 Administrator Reference Manual
- RFC 1035 - Domain Names - Implementation and Specification