Post

DNS com o BIND Parte 5: Configuração do Servidor Secundário

DNS com o BIND Parte 5: Configuração do Servidor Secundário

Introdução

Até agora, construímos um servidor DNS primário (master) totalmente funcional com configuração modular, múltiplas views e logging granular. Porém, um único servidor DNS é um ponto único de falha. Na Parte 5, vamos aumentar a resiliência do nosso ambiente configurando um servidor secundário (slave) que obterá as informações de zona automaticamente do primário. Isso garante que, mesmo que o servidor primário fique indisponível, o serviço DNS continuará operacional.

O que será visto nesta quinta parte

  • Conceitos de Redundância: Entender a diferença entre servidores primários e secundários.
  • Configuração do Servidor Primário: Preparar o NS1 para permitir transferências de zona.
  • Configuração do Servidor Secundário: Configurar o NS2 para receber e sincronizar as zonas.
  • Transferências de Zona: Compreender AXFR (transferência completa) e IXFR (transferência incremental).
  • Testes e Validação: Verificar se a sincronização está funcionando corretamente.
  • Monitoramento: Acompanhar a saúde do servidor secundário.

Pré-requisitos

  • Ter um servidor BIND primário totalmente configurado conforme as Partes 1 a 4.
  • Uma segunda máquina com BIND instalado (Parte 1) para atuar como servidor secundário.
  • Conectividade de rede entre os dois servidores na porta 53 (TCP e UDP).

1. Conceitos Fundamentais: Primário vs. Secundário

1.1 Servidor DNS Primário (Master)

O servidor primário é aquele que gerencia as zonas. Os administradores editam os arquivos de zona diretamente no primário, incrementam o número serial e recarregam o serviço. O primário é a fonte de verdade para os dados DNS.

1.2 Servidor DNS Secundário (Replica)

Um servidor DNS secundário é autoritativo mas não gerencia as zonas. Em vez disso, ele sincroniza automaticamente com o primário através de transferências de zona. O secundário obtém uma cópia completa (ou incremental) de cada zona do primário em intervalos regulares.

Características principais:

  • Não edita arquivos de zona diretamente.
  • Sincroniza automaticamente com o primário.
  • Responde a consultas DNS de forma idêntica ao primário.
  • Aumenta a disponibilidade e a redundância.

1.3 Arquitetura de Redundância

O diagrama abaixo ilustra a arquitetura que vamos implementar, com transferências de zona para ambas as views (interna e externa).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 +-------------------+                                    +---------------------+
 |                   |                                    |                     |
 |        NS1        |                                    |         NS2         |
 |   (Primário)      |                                    |   (Secundário)      |
 |                   |                                    |                     |
 +-------------------+                                    +---------------------+
 |                   |                                    |                     |
 | View Internals:   |                                    | View Internals:     |
 | 10.16.32.2        | -----> Transferência AXFR ----->   | 10.16.32.3          |
 | fd00:0:0:1::2     |        (a cada 4 horas)            | fd00:0:0:1::3       |
 |                   |                                    |                     |
 | View Externals:   |                                    | View Externals:     |
 | 203.0.113.2       | -----> Transferência AXFR ----->   | 203.0.113.3         |
 | 2001:db8::2       |        (a cada 4 horas)            | 2001:db8::3         |
 +-------------------+                                    +---------------------+

2. Configuração do Servidor Primário (NS1) para Transferências

2.1 Verificar Configuração Existente

A configuração necessária para permitir transferências já foi adicionada nas Partes 2 e 4. Verifique se o seu /etc/named.conf contém as ACLs e as permissões de transferência:

1
2
3
4
5
# Verificar ACLs para transferências
sudo grep -A 2 "internals_transfers\|externals_transfers" /etc/named.conf

# Verificar permissões nas views
sudo grep -A 1 "allow-transfer" /etc/named.conf

A saída esperada deve ser semelhante a:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
};

# Dentro da view internals:
allow-transfer { internals_transfers; };
also-notify { 10.16.32.3; fd00:0:0:1::3; };

# Dentro da view externals:
allow-transfer { externals_transfers; };
also-notify { 203.0.113.3; 2001:db8::3; };

2.2 Recarregar Configuração em NS1

Se você adicionou as ACLs e permissões pela primeira vez, valide e recarregue a configuração:

1
2
sudo named-checkconf /etc/named.conf
sudo rndc reload

2.3 Permitir Acesso no Firewall

Certifique-se de que a porta 53 está aberta para o servidor secundário:

1
2
3
4
5
6
# Adicionar serviço DNS ao firewall
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload

# Verificar se a porta está aberta
sudo firewall-cmd --list-all | grep dns

3. Configuração do Servidor Secundário (NS2)

O servidor secundário precisa de uma configuração similar ao primário, mas com as zonas definidas como type slave em vez de type master.

3.1 Estrutura de Diretórios em NS2

Crie a mesma estrutura de diretórios que existe em NS1:

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

# Criar estrutura de dados de zona
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}

# Criar diretório de logs
sudo mkdir -p /var/log/named
sudo chown -R named:named /var/log/named
sudo chmod 750 /var/log/named

3.2 Arquivo de Configuração Principal: /etc/named.conf em NS2

Crie o arquivo /etc/named.conf em NS2 com a seguinte estrutura:

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
# /etc/named.conf (em NS2)
// ================================================================================
// ACLs
// ================================================================================
acl "iface_v4" {
    127.0.0.1/32;
    10.16.32.3/32;
    203.0.113.3/32;
};

acl "iface_v6" {
    ::1/128;
    fd00:0:0:1::3/128;
    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;
};

acl "public" {
    203.0.113.0/24;
    128.66.48.0/22;
    2001:db8::/48;
};

// ================================================================================
// Opções Globais
// ================================================================================
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";
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";

    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; };

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

view "externals"
{
    match-clients { any; };
    recursion no;

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

3.3 Arquivo de Definição de Zonas Internas: /etc/named/named.internals.zones em NS2

Crie o arquivo com as zonas definidas como type slave:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# /etc/named/named.internals.zones (em NS2)
zone "lab4it.com.br" IN {
    type slave;
    masters { 10.16.32.2; fd00:0:0:1::2; };
    file "zones/internals/forward/lab4it.com.br.zone";
};

zone "32.16.10.in-addr.arpa" IN {
    type slave;
    masters { 10.16.32.2; fd00:0:0:1::2; };
    file "zones/internals/reverse/ipv4/rev-10.16.32.24.ipv4.zone";
};

zone "0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa" IN {
    type slave;
    masters { 10.16.32.2; fd00:0:0:1::2; };
    file "zones/internals/reverse/ipv6/rev-fd00.48.ipv6.zone";
};

zone "1.rev-ip6.lab4it.com.br" IN {
    type slave;
    masters { 10.16.32.2; fd00:0:0:1::2; };
    file "zones/internals/reverse/ipv6/dname-subnet1.ipv6.zone";
};

3.4 Arquivo de Definição de Zonas Externas: /etc/named/named.externals.zones em NS2

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
# /etc/named/named.externals.zones (em NS2)
zone "lab4it.com.br" IN {
    type slave;
    masters { 203.0.113.2; 2001:db8::2; };
    file "zones/externals/forward/lab4it.com.br.zone";
};

zone "113.0.203.in-addr.arpa" IN {
    type slave;
    masters { 203.0.113.2; 2001:db8::2; };
    file "zones/externals/reverse/ipv4/rev-203.0.113.24.ipv4.zone";
};

zone "48.66.128.in-addr.arpa" IN {
    type slave;
    masters { 203.0.113.2; 2001:db8::2; };
    file "zones/externals/reverse/ipv4/rev-128.66.48.24.ipv4.zone";
};

zone "49.66.128.in-addr.arpa" IN {
    type slave;
    masters { 203.0.113.2; 2001:db8::2; };
    file "zones/externals/reverse/ipv4/rev-128.66.49.24.ipv4.zone";
};

zone "50.66.128.in-addr.arpa" IN {
    type slave;
    masters { 203.0.113.2; 2001:db8::2; };
    file "zones/externals/reverse/ipv4/rev-128.66.50.24.ipv4.zone";
};

zone "51.66.128.in-addr.arpa" IN {
    type slave;
    masters { 203.0.113.2; 2001:db8::2; };
    file "zones/externals/reverse/ipv4/rev-128.66.51.24.ipv4.zone";
};

zone "0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa" IN {
    type slave;
    masters { 203.0.113.2; 2001:db8::2; };
    file "zones/externals/reverse/ipv6/rev-2001_db8.48.ipv6.zone";
};

zone "0.rev-ip6.lab4it.com.br" IN {
    type slave;
    masters { 203.0.113.2; 2001:db8::2; };
    file "zones/externals/reverse/ipv6/dname-subnet0.ipv6.zone";
};

3.5 Arquivo de Logging: /etc/named/named.logging.conf em NS2

Copie o arquivo de logging do NS1 ou crie um novo com a mesma configuração (confira a Parte 2 para o conteúdo completo).

3.6 Permissões e SELinux em NS2

Ajuste as permissões dos diretórios e aplique os contextos SELinux:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Diretório de logs
sudo chown -R named:named /var/log/named
sudo chmod 750 /var/log/named
sudo semanage fcontext -a -t named_log_t "/var/log/named(/.*)?"
sudo restorecon -Rv /var/log/named

# Diretório de configuração
sudo find /etc/named -type f -exec chmod 640 {} \;
sudo chown -R root:named /etc/named
sudo semanage fcontext -a -t named_conf_t "/etc/named(/.*)?"
sudo restorecon -Rv /etc/named

# Diretório de zonas (será preenchido pelo BIND)
sudo chown -R named:named /var/named/zones
sudo find /var/named/zones -type d -exec chmod 770 {} \;
sudo semanage fcontext -a -t named_zone_t "/var/named/zones(/.*)?"
sudo restorecon -Rv /var/named/zones

3.7 Iniciar e Validar NS2

1
2
3
4
5
6
7
8
9
10
11
12
# Validar configuração
sudo named-checkconf /etc/named.conf

# Iniciar o serviço
sudo systemctl start named
sudo systemctl enable named

# Verificar status
sudo systemctl status named

# Monitorar logs em tempo real
sudo journalctl -u named -f

4. Transferências de Zona: AXFR vs IXFR

4.1 AXFR (Full Zone Transfer)

AXFR é uma transferência completa de zona. O servidor secundário solicita toda a zona do primário, incluindo todos os registros.

Quando ocorre:

  • Primeira sincronização do secundário.
  • Serial do primário é maior que o do secundário.
  • Transferência incremental (IXFR) falha ou não é suportada.

Fluxo da Transferência AXFR:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Passo 1: NS2 consulta o serial de NS1
  NS2 → NS1: "Qual é o serial de lab4it.com.br?"
  NS1 → NS2: "Serial é 2026020401"

Passo 2: NS2 compara com seu serial local
  NS2: "Meu serial é 0, preciso de AXFR"

Passo 3: NS2 solicita transferência completa
  NS2 → NS1: "Solicito transferência completa (AXFR)"

Passo 4: NS1 envia toda a zona
  NS1 → NS2: [Todos os registros da zona]

Passo 5: NS2 armazena a zona
  NS2: "Zona recebida e armazenada em disco"

Comando para testar AXFR:

1
dig @10.16.32.2 lab4it.com.br AXFR

4.2 IXFR (Incremental Zone Transfer)

IXFR é uma transferência incremental. Apenas as mudanças (deltas) são transferidas, reduzindo significativamente o tráfego de rede.

Quando ocorre:

  • Secundário já possui a zona.
  • Serial do primário é maior que o do secundário.
  • Primário mantém histórico de mudanças.

Vantagens:

  • Menos tráfego de rede.
  • Transferência mais rápida.
  • Menos carga no servidor primário.

Fluxo da Transferência IXFR:

1
2
3
4
5
6
7
8
9
10
11
12
13
Passo 1: NS2 consulta o serial de NS1
  NS2 → NS1: "Tenho serial 2026020401, qual é o seu?"
  NS1 → NS2: "Meu serial é 2026020402"

Passo 2: NS2 solicita apenas as mudanças
  NS2 → NS1: "Solicito IXFR de 2026020401 para 2026020402"

Passo 3: NS1 envia apenas as mudanças
  NS1 → NS2: [Registros removidos]
  NS1 → NS2: [Registros adicionados]

Passo 4: NS2 aplica as mudanças
  NS2: "Zona atualizada"

Comando para testar IXFR:

1
dig @10.16.32.2 lab4it.com.br IXFR=2026020401

5. Testes e Validação

5.1 Verificar Transferência de Zona

Após iniciar o BIND em NS2, verifique se os arquivos de zona foram criados:

1
2
3
4
5
6
# Listar arquivos de zona em NS2
ls -la /var/named/zones/internals/forward/
ls -la /var/named/zones/externals/forward/

# Ver conteúdo da zona transferida
cat /var/named/zones/internals/forward/lab4it.com.br.zone

Se os arquivos existem e contêm dados, a transferência foi bem-sucedida.

5.2 Testar Resolução em NS2

Faça uma consulta diretamente ao NS2 para verificar se ele responde corretamente:

1
2
3
4
5
6
7
8
# Teste da view interna
dig @10.16.32.3 lab4it.com.br

# Teste da view externa
dig @203.0.113.3 lab4it.com.br

# Teste de resolução reversa
dig @10.16.32.3 -x 10.16.32.2

5.3 Verificar Logs de Transferência

Monitore os logs para confirmar que as transferências ocorreram:

1
2
3
4
5
# Ver logs de transferência
tail -f /var/log/named/xfer.log

# Ou via systemd
journalctl -u named -f | grep -i "transfer\|xfr"

6. Monitoramento de Transferências

6.1 Comparar Seriais

Verifique se os seriais em ambos os servidores estão sincronizados:

1
2
3
4
5
echo "Serial em NS1 (primário):"
dig @10.16.32.2 lab4it.com.br SOA +short

echo "Serial em NS2 (secundário):"
dig @10.16.32.3 lab4it.com.br SOA +short

Os seriais devem ser idênticos.

6.2 Verificar Saúde do Secundário

1
2
3
4
5
# Verificar se o secundário está respondendo
dig @10.16.32.3 lab4it.com.br +short

# Verificar flags de autoridade
dig @10.16.32.3 lab4it.com.br | grep -E "flags:|aa"

A flag aa (authoritative answer) deve estar presente, indicando que o servidor é autoritativo para a zona.


7. Solucionando Problemas Comuns Nesta Etapa

Sintoma ObservadoProblemaCausa ProvávelSolução
Arquivos de zona não aparecem em NS2 após iniciar o BIND.Transferência não ocorreu.Firewall bloqueando porta 53, ACL incorreta ou permissões de diretório.Verifique sudo firewall-cmd --list-all, confirme ACLs em NS1 e permissões de /var/named/zones em NS2.
Erro “connection refused” nos logs de NS2.Conexão recusada ao NS1.NS1 não está respondendo ou porta 53 está bloqueada.Teste dig @10.16.32.2 lab4it.com.br de NS2. Verifique se NS1 está rodando com sudo systemctl status named.
Zona transferida, mas com dados antigos.Serial não foi incrementado no primário.Mudanças foram feitas em NS1, mas o serial não foi alterado.Edite o arquivo de zona em NS1, incremente o serial e execute sudo rndc reload.
NS2 responde, mas com dados diferentes de NS1.Zonas não estão sincronizadas.Transferência parcial ou falha.Verifique os logs de transferência com tail -f /var/log/named/xfer.log e compare os seriais com dig SOA.

Conclusão

Com a configuração do servidor secundário concluída, você agora possui uma arquitetura DNS redundante e resiliente. O servidor primário gerencia as zonas, e o secundário sincroniza automaticamente, garantindo que o serviço DNS continue disponível mesmo que um dos servidores fique offline. Na próxima parte, vamos aumentar ainda mais a segurança das transferências de zona implementando TSIG (Transaction Signatures), que usa autenticação criptográfica para garantir que apenas servidores autorizados possam receber transferências de zona.


Próximos Passos

Clique aqui para ir para DNS com o BIND Parte 6: TSIG - Transferências Seguras de Zona DNS


Referências

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