Delegação e Subdomínios no DNS BIND
Este é o oitavo e último artigo de nossa série sobre implementação e configuração do DNS BIND no Oracle Linux 9. Nos artigos anteriores, abordamos os conceitos fundamentais do DNS, a instalação e configuração básica, a configuração de zonas DNS, a implementação de views e DNS Split-Horizon, a segurança e hardening, o logging, monitoramento e troubleshooting e as configurações avançadas. Agora, vamos explorar a delegação e gerenciamento de subdomínios.
Introdução
A delegação de subdomínios é um aspecto fundamental da arquitetura DNS, permitindo a descentralização da administração e a criação de uma estrutura hierárquica que reflete a organização de uma empresa ou instituição. Através da delegação, diferentes equipes ou departamentos podem gerenciar suas próprias zonas DNS, enquanto mantêm a integração com a infraestrutura DNS global.
Neste artigo final da série, abordaremos os conceitos, implementação e gerenciamento de delegação de subdomínios no BIND. Exploraremos desde os fundamentos teóricos até configurações práticas, incluindo delegação em ambientes com views, delegação segura com DNSSEC e estratégias para troubleshooting e manutenção.
Ao dominar a delegação de subdomínios, você terá todas as ferramentas necessárias para implementar uma infraestrutura DNS completa, escalável e bem organizada.
Conceitos Fundamentais de Delegação DNS
A delegação DNS é o processo pelo qual a responsabilidade por uma parte do espaço de nomes de domínio é transferida de uma autoridade DNS para outra.
Hierarquia DNS e Delegação
O DNS é organizado como uma estrutura hierárquica em forma de árvore invertida:
- Raiz (.): No topo da hierarquia, representada por um ponto
- Domínios de Primeiro Nível (TLDs): Como .com, .org, .net, .br, .us
- Domínios de Segundo Nível: Como example.com, google.com
- Subdomínios: Como dev.example.com, mail.example.com
A delegação ocorre quando um nível superior da hierarquia aponta para servidores autoritativos em um nível inferior, permitindo que esses servidores respondam por uma parte específica do espaço de nomes.
Benefícios da Delegação
A delegação de subdomínios oferece diversos benefícios:
- Descentralização administrativa: Diferentes equipes podem gerenciar suas próprias zonas
- Escalabilidade: Distribui a carga de consultas entre múltiplos servidores
- Autonomia: Permite que departamentos ou filiais gerenciem seus próprios recursos DNS
- Organização lógica: Reflete a estrutura organizacional na hierarquia DNS
- Isolamento de falhas: Problemas em um subdomínio não afetam outros subdomínios
Registros NS e Glue Records
A delegação é implementada através de dois tipos principais de registros:
Registros NS (Name Server)
Os registros NS identificam os servidores autoritativos para uma zona:
1
2
subdominio.example.com. IN NS ns1.subdominio.example.com.
subdominio.example.com. IN NS ns2.subdominio.example.com.
Glue Records
Os glue records são registros A (ou AAAA) que fornecem os endereços IP dos servidores de nomes mencionados nos registros NS, quando esses servidores estão dentro da zona delegada:
1
2
ns1.subdominio.example.com. IN A 192.168.200.51
ns2.subdominio.example.com. IN A 192.168.200.52
Sem glue records, ocorreria uma dependência circular: para resolver ns1.subdominio.example.com, o resolvedor precisaria consultar os servidores autoritativos para subdominio.example.com, mas para encontrar esses servidores, ele precisaria resolver ns1.subdominio.example.com.
Fluxo de Resolução com Delegação
Quando um cliente tenta resolver um nome em um subdomínio delegado, o processo segue estas etapas:
- O cliente consulta um servidor recursivo
- O servidor recursivo consulta um servidor raiz
- O servidor raiz responde com referência aos servidores TLD
- O servidor recursivo consulta um servidor TLD
- O servidor TLD responde com referência aos servidores do domínio
- O servidor recursivo consulta um servidor do domínio
- O servidor do domínio responde com referência aos servidores do subdomínio (delegação)
- O servidor recursivo consulta um servidor do subdomínio
- O servidor do subdomínio responde com o registro solicitado
- O servidor recursivo retorna a resposta ao cliente
+---------+ Consulta www.dev.example.com +-----------------+
| Cliente | -------------------------------> | Servidor Recurso |
+---------+ +--------+--------+
|
V Consulta Raiz (.)
+------v----------+
| Servidor Raiz |
+-----------------+
| Resposta: Servidores .com
V
+------v----------+
| Servidor TLD .com |
+-----------------+
| Resposta: Servidores example.com (ns1/ns2.example.com)
V
+------v----------+
| Servidor |
| example.com |
| (ns1.example.com)|
+-----------------+
| Resposta: Delegação para dev.example.com
| NS: ns1/ns2.dev.example.com
| Glue: A ns1/ns2.dev.example.com
V
+------v----------+
| Servidor |
| dev.example.com |
| (ns1.dev.example.com)|
+-----------------+
| Resposta: A www.dev.example.com = 192.168.200.60
V
+---------+ Resposta: 192.168.200.60 +--------+--------+
| Cliente | <------------------------------- | Servidor Recurso |
+---------+ +-----------------+
Figura 1: Fluxo de Resolução Detalhado com Delegação de Subdomínio
Planejamento de Delegação de Subdomínios
Antes de implementar a delegação, é importante realizar um planejamento adequado.
Estratégias de Nomeação
Adote uma estratégia de nomeação consistente para subdomínios:
- Baseada em função: mail.example.com, www.example.com, db.example.com
- Baseada em departamento: marketing.example.com, ti.example.com, rh.example.com
- Baseada em localização: sp.example.com, rj.example.com, ny.example.com
- Baseada em ambiente: dev.example.com, test.example.com, prod.example.com
- Híbrida: dev.sp.example.com, prod.ny.example.com
Considerações de Infraestrutura
Ao planejar a delegação, considere:
- Servidores dedicados: Cada subdomínio terá servidores DNS dedicados ou compartilhados?
- Redundância: Quantos servidores NS serão configurados para cada subdomínio?
- Localização: Onde os servidores estarão localizados fisicamente?
- Conectividade: Como será a conectividade entre os servidores do domínio principal e os subdomínios?
- Segurança: Como será implementada a segurança nas transferências de zona e atualizações?
Matriz de Responsabilidades
Defina claramente as responsabilidades:
Aspecto | Equipe do Domínio Principal | Equipe do Subdomínio |
---|---|---|
Registros NS do subdomínio | Responsável | Consultada |
Glue records | Responsável | Consultada |
Configuração dos servidores do subdomínio | Consultada | Responsável |
Arquivos de zona do subdomínio | Informada | Responsável |
Monitoramento do subdomínio | Compartilhada | Compartilhada |
Resolução de problemas | Compartilhada | Compartilhada |
Documentação
Mantenha documentação detalhada sobre:
- Estrutura de subdomínios
- Servidores NS para cada subdomínio
- Contatos responsáveis
- Procedimentos de alteração
- Procedimentos de troubleshooting
Implementação de Delegação de Subdomínios
Vamos implementar a delegação de um subdomínio chamado “dev.example.com” para servidores DNS dedicados.
Cenário
- Domínio principal: example.com
- Subdomínio: dev.example.com
- Servidores do domínio principal:
- ns1.example.com (192.168.200.49)
- ns2.example.com (192.168.200.50)
- Servidores do subdomínio:
- ns1.dev.example.com (192.168.200.51)
- ns2.dev.example.com (192.168.200.52)
Configuração no Servidor do Domínio Principal
Atualização do Arquivo de Zona
Edite o arquivo de zona do domínio principal para adicionar a delegação:
1
sudo vi /var/named/zones/example.com.zone
Adicione os registros NS e glue records:
1
2
3
4
5
; Delegação para dev.example.com
dev IN NS ns1.dev.example.com.
dev IN NS ns2.dev.example.com.
ns1.dev IN A 192.168.200.51
ns2.dev IN A 192.168.200.52
Observe que:
- Os registros NS apontam para os servidores autoritativos do subdomínio
- Os glue records fornecem os endereços IP desses servidores
- Não é necessário incluir o domínio completo à esquerda (dev em vez de dev.example.com)
Incremente o número de série do SOA:
1
2
3
4
5
6
@ IN SOA ns1.example.com. admin.example.com. (
2025052401 ; Serial (incrementado)
10800 ; Refresh (3 hours)
3600 ; Retry (1 hour)
604800 ; Expire (1 week)
86400 ) ; Minimum TTL (1 day)
Verificação e Recarregamento
Verifique a sintaxe do arquivo de zona:
1
sudo named-checkzone example.com /var/named/zones/example.com.zone
Recarregue a zona:
1
sudo rndc reload example.com
Configuração no Servidor do Subdomínio
Instalação do BIND
Se ainda não estiver instalado:
1
sudo dnf install bind bind-utils -y
Criação da Estrutura de Diretórios
1
2
3
4
5
sudo mkdir -p /var/named/zones
sudo chown -R root:named /var/named/zones
sudo chmod -R 750 /var/named/zones
sudo semanage fcontext -a -t named_zone_t "/var/named/zones(/.*)?"
sudo restorecon -Rv /var/named/zones
Configuração do named.conf
1
sudo vi /etc/named.conf
Adicione:
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
options {
directory "/var/named";
listen-on port 53 {
127.0.0.1;
192.168.200.51; // IP deste servidor
};
listen-on-v6 port 53 { ::1; };
allow-query { any; };
recursion no; // Servidor autoritativo apenas
// Configurações adicionais
dnssec-validation auto;
// Logging
// ... (configuração de logging similar ao primário)
};
// Zona do subdomínio
zone "dev.example.com" IN {
type master;
file "zones/dev.example.com.zone";
allow-transfer { 192.168.200.52; }; // Permitir transferência para o secundário
also-notify { 192.168.200.52; };
notify yes;
};
Criação do Arquivo de Zona do Subdomínio
1
sudo vi /var/named/zones/dev.example.com.zone
Adicione:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$TTL 86400
@ IN SOA ns1.dev.example.com. admin.dev.example.com. (
2025052401 ; Serial
10800 ; Refresh (3 hours)
3600 ; Retry (1 hour)
604800 ; Expire (1 week)
86400 ) ; Minimum TTL (1 day)
IN NS ns1.dev.example.com.
IN NS ns2.dev.example.com.
ns1 IN A 192.168.200.51
ns2 IN A 192.168.200.52
www IN A 192.168.200.60
app IN A 192.168.200.61
db IN A 192.168.200.62
Configuração de Permissões
1
2
3
sudo chown root:named /var/named/zones/dev.example.com.zone
sudo chmod 640 /var/named/zones/dev.example.com.zone
sudo restorecon -v /var/named/zones/dev.example.com.zone
Inicialização do Serviço
1
sudo systemctl enable --now named
Configuração do Firewall
1
2
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload
Configuração do Servidor Secundário do Subdomínio
A configuração do servidor secundário do subdomínio é similar à configuração de um servidor secundário regular, como vimos no artigo anterior.
1
2
3
4
5
6
// Zona do subdomínio (no servidor secundário)
zone "dev.example.com" IN {
type slave;
masters { 192.168.200.51; };
file "slaves/dev.example.com.zone";
};
Verificação da Delegação
Teste de Resolução
Teste a resolução de nomes no subdomínio:
1
2
3
4
5
6
7
8
# Consultar os servidores NS do subdomínio
dig NS dev.example.com
# Consultar um registro no subdomínio
dig www.dev.example.com
# Consultar com rastreamento completo
dig +trace www.dev.example.com
Verificação de Autoridade
Verifique se os servidores do subdomínio são realmente autoritativos:
1
2
3
4
5
# Consultar diretamente o servidor do subdomínio
dig @192.168.200.51 www.dev.example.com
# Verificar a seção de autoridade (AA flag)
dig @192.168.200.51 www.dev.example.com +norec
A resposta deve incluir a flag “aa” (authoritative answer).
Delegação em Ambientes com Views
A delegação em ambientes com views (Split-Horizon DNS) requer considerações especiais, pois você pode querer apresentar diferentes visões do mesmo subdomínio para clientes internos e externos.
Cenário
- Domínio principal: example.com com views interna e externa
- Subdomínio: dev.example.com, visível apenas internamente
Configuração no Servidor do Domínio Principal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
view "internal" {
match-clients { internal_clients; };
zone "example.com" IN {
type master;
file "zones/internal/example.com.zone";
// ...
};
};
view "external" {
match-clients { any; };
zone "example.com" IN {
type master;
file "zones/external/example.com.zone";
// ...
};
};
Arquivo de Zona Interna
No arquivo /var/named/zones/internal/example.com.zone
, adicione a delegação:
1
2
3
4
5
; Delegação para dev.example.com (apenas na view interna)
dev IN NS ns1.dev.example.com.
dev IN NS ns2.dev.example.com.
ns1.dev IN A 192.168.200.51
ns2.dev IN A 192.168.200.52
Arquivo de Zona Externa
No arquivo /var/named/zones/external/example.com.zone
, não inclua a delegação para manter o subdomínio invisível externamente.
Configuração no Servidor do Subdomínio
A configuração no servidor do subdomínio permanece a mesma, mas você pode adicionar controles de acesso para permitir consultas apenas de redes internas:
1
2
3
4
5
6
7
8
9
10
options {
// ...
allow-query { internal_clients; };
// ...
};
acl "internal_clients" {
localhost;
192.168.200.0/24;
};
Verificação da Delegação com Views
Teste a resolução de diferentes perspectivas:
1
2
3
4
5
# De um cliente interno
dig @192.168.200.49 dev.example.com NS
# De um cliente externo (não deve resolver)
dig @203.0.113.1 dev.example.com NS
Delegação Segura com DNSSEC
A delegação com DNSSEC adiciona uma camada de segurança, garantindo a autenticidade e integridade dos dados DNS através da cadeia de confiança.
Conceitos de DNSSEC na Delegação
Na delegação com DNSSEC, além dos registros NS e glue records, são necessários registros DS (Delegation Signer) que contêm hashes das chaves DNSSEC do subdomínio, criando uma cadeia de confiança.
Configuração de DNSSEC no Subdomínio
Geração de Chaves DNSSEC
No servidor do subdomínio:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Criar diretório para chaves
sudo mkdir -p /var/named/keys
sudo chown named:named /var/named/keys
sudo chmod 750 /var/named/keys
# Gerar chave de assinatura de zona (ZSK)
sudo dnssec-keygen -a ECDSAP256SHA256 -b 256 -n ZONE dev.example.com
# Gerar chave de assinatura de chave (KSK)
sudo dnssec-keygen -a ECDSAP256SHA256 -b 256 -f KSK -n ZONE dev.example.com
# Mover as chaves para o diretório apropriado
sudo mv K*.key K*.private /var/named/keys/
sudo chown named:named /var/named/keys/K*
sudo chmod 640 /var/named/keys/K*
Configuração de DNSSEC no named.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
options {
// ...
dnssec-validation auto;
dnssec-enable yes;
};
zone "dev.example.com" IN {
type master;
file "zones/dev.example.com.signed";
key-directory "/var/named/keys";
auto-dnssec maintain;
inline-signing yes;
};
Assinatura da Zona
Se não estiver usando inline-signing:
1
sudo dnssec-signzone -A -3 $(head -c 16 /dev/random | od -v -t x | head -1 | cut -d' ' -f2- | tr -d ' ') -N INCREMENT -o dev.example.com -t /var/named/zones/dev.example.com.zone
Geração de Registro DS
1
2
# Gerar registro DS a partir da KSK
sudo dnssec-dsfromkey /var/named/keys/Kdev.example.com.+013+xxxxx.key
O comando acima produzirá uma saída como:
1
dev.example.com. IN DS 12345 13 2 1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7
Configuração de DNSSEC no Domínio Principal
Adição do Registro DS
Edite o arquivo de zona do domínio principal:
1
sudo vi /var/named/zones/example.com.zone
Adicione o registro DS gerado:
1
2
3
4
5
6
; Delegação para dev.example.com com DNSSEC
dev IN NS ns1.dev.example.com.
dev IN NS ns2.dev.example.com.
dev IN DS 12345 13 2 1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T1U2V3W4X5Y6Z7
ns1.dev IN A 192.168.200.51
ns2.dev IN A 192.168.200.52
Incremente o número de série e assine a zona do domínio principal (se estiver usando DNSSEC).
Verificação da Delegação Segura
1
2
3
4
5
6
7
8
9
# Verificar a cadeia de confiança
dig +dnssec +trace www.dev.example.com
# Verificar registros DNSSEC específicos
dig DNSKEY dev.example.com
dig DS dev.example.com
# Usar ferramentas específicas de DNSSEC
dnssec-verify dev.example.com.signed
Delegação para Diferentes Tipos de Subdomínios
Vamos explorar diferentes cenários de delegação para casos de uso específicos.
Delegação para Subdomínios Departamentais
Neste cenário, cada departamento gerencia seu próprio subdomínio.
Exemplo: Subdomínio de Marketing
1
2
3
4
5
; No arquivo de zona example.com
marketing IN NS ns1.marketing.example.com.
marketing IN NS ns2.marketing.example.com.
ns1.marketing IN A 192.168.201.51
ns2.marketing IN A 192.168.201.52
Exemplo: Subdomínio de TI
1
2
3
4
5
; No arquivo de zona example.com
ti IN NS ns1.ti.example.com.
ti IN NS ns2.ti.example.com.
ns1.ti IN A 192.168.202.51
ns2.ti IN A 192.168.202.52
Delegação para Subdomínios Geográficos
Neste cenário, cada localidade geográfica gerencia seu próprio subdomínio.
Exemplo: Subdomínio de São Paulo
1
2
3
4
5
; No arquivo de zona example.com
sp IN NS ns1.sp.example.com.
sp IN NS ns2.sp.example.com.
ns1.sp IN A 192.168.210.51
ns2.sp IN A 192.168.210.52
Exemplo: Subdomínio do Rio de Janeiro
1
2
3
4
5
; No arquivo de zona example.com
rj IN NS ns1.rj.example.com.
rj IN NS ns2.rj.example.com.
ns1.rj IN A 192.168.220.51
ns2.rj IN A 192.168.220.52
Delegação para Subdomínios de Ambiente
Neste cenário, cada ambiente (desenvolvimento, teste, produção) tem seu próprio subdomínio.
Exemplo: Subdomínio de Desenvolvimento
1
2
3
4
5
; No arquivo de zona example.com
dev IN NS ns1.dev.example.com.
dev IN NS ns2.dev.example.com.
ns1.dev IN A 192.168.200.51
ns2.dev IN A 192.168.200.52
Exemplo: Subdomínio de Teste
1
2
3
4
5
; No arquivo de zona example.com
test IN NS ns1.test.example.com.
test IN NS ns2.test.example.com.
ns1.test IN A 192.168.200.61
ns2.test IN A 192.168.200.62
Delegação para Subdomínios de Projetos
Neste cenário, cada projeto importante tem seu próprio subdomínio.
Exemplo: Subdomínio do Projeto Alpha
1
2
3
4
5
; No arquivo de zona example.com
alpha IN NS ns1.alpha.example.com.
alpha IN NS ns2.alpha.example.com.
ns1.alpha IN A 192.168.230.51
ns2.alpha IN A 192.168.230.52
Delegação Reversa
A delegação reversa segue os mesmos princípios da delegação direta, mas para zonas de resolução reversa (PTR).
Cenário
- Zona reversa principal: 200.168.192.in-addr.arpa
- Subrede delegada: 192.168.201.0/24 (201.200.168.192.in-addr.arpa)
Configuração no Servidor da Zona Reversa Principal
Edite o arquivo de zona reversa:
1
sudo vi /var/named/zones/200.168.192.in-addr.arpa.zone
Adicione a delegação:
1
2
3
; Delegação reversa para 192.168.201.0/24
201 IN NS ns1.marketing.example.com.
201 IN NS ns2.marketing.example.com.
Configuração no Servidor do Subdomínio
1
2
3
4
5
6
7
zone "201.200.168.192.in-addr.arpa" IN {
type master;
file "zones/201.200.168.192.in-addr.arpa.zone";
allow-transfer { 192.168.201.52; };
also-notify { 192.168.201.52; };
notify yes;
};
Crie o arquivo de zona reversa:
1
sudo vi /var/named/zones/201.200.168.192.in-addr.arpa.zone
Adicione:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$TTL 86400
@ IN SOA ns1.marketing.example.com. admin.marketing.example.com. (
2025052401 ; Serial
10800 ; Refresh (3 hours)
3600 ; Retry (1 hour)
604800 ; Expire (1 week)
86400 ) ; Minimum TTL (1 day)
IN NS ns1.marketing.example.com.
IN NS ns2.marketing.example.com.
1 IN PTR router.marketing.example.com.
10 IN PTR server1.marketing.example.com.
11 IN PTR server2.marketing.example.com.
20 IN PTR printer1.marketing.example.com.
Verificação da Delegação Reversa
1
2
3
4
5
# Consultar os servidores NS da zona reversa delegada
dig NS 201.200.168.192.in-addr.arpa
# Consultar um registro PTR na zona delegada
dig -x 192.168.201.10
Troubleshooting de Delegação
A delegação pode apresentar diversos problemas. Vamos explorar os mais comuns e suas soluções.
Problema: Falha na Resolução de Nomes no Subdomínio
Sintomas:
- Consultas para o subdomínio retornam SERVFAIL ou NXDOMAIN
- O comando
dig +trace
não completa corretamente
Verificações:
1
2
3
4
5
6
7
8
# Verificar registros NS no domínio principal
dig NS dev.example.com
# Verificar se os servidores NS estão respondendo
dig @ns1.dev.example.com dev.example.com SOA
# Verificar glue records
dig dev.example.com NS +additional
Possíveis Causas e Soluções:
- Registros NS incorretos ou ausentes:
- Verifique se os registros NS estão corretamente configurados no domínio principal
- Verifique se o número de série foi incrementado e a zona recarregada
- Glue records ausentes ou incorretos:
- Verifique se os glue records estão presentes e corretos
- Certifique-se de que os IPs correspondem aos servidores reais
- Servidores do subdomínio não estão respondendo:
- Verifique se o serviço BIND está em execução nos servidores do subdomínio
- Verifique conectividade de rede e regras de firewall
- Configuração incorreta no servidor do subdomínio:
- Verifique se a zona está configurada corretamente no named.conf
- Verifique se o arquivo de zona existe e tem a sintaxe correta
Problema: Inconsistência entre Servidores
Sintomas:
- Diferentes respostas dependendo do servidor consultado
- Transferências de zona falham
Verificações:
1
2
3
4
5
6
7
8
9
# Comparar respostas de diferentes servidores
dig @ns1.dev.example.com www.dev.example.com
dig @ns2.dev.example.com www.dev.example.com
# Verificar configuração de transferência de zona
grep "allow-transfer" /etc/named.conf
# Verificar logs de transferência
grep "transfer" /var/log/named/general.log
Possíveis Causas e Soluções:
- Falha nas transferências de zona:
- Verifique se allow-transfer está configurado corretamente
- Verifique se as ACLs permitem transferências
- Se estiver usando TSIG, verifique se as chaves estão corretas
- Servidores secundários desatualizados:
- Force uma transferência de zona:
rndc retransfer dev.example.com
- Verifique se as notificações estão habilitadas:
notify yes;
- Force uma transferência de zona:
- Configurações inconsistentes:
- Compare os arquivos named.conf em todos os servidores
- Verifique se todos os servidores têm a mesma versão do BIND
Problema: Falhas com DNSSEC
Sintomas:
- Consultas com DNSSEC retornam SERVFAIL
- Validação DNSSEC falha
Verificações:
1
2
3
4
5
6
7
8
9
10
11
# Verificar cadeia de confiança
dig +dnssec +trace www.dev.example.com
# Verificar registros DS no domínio principal
dig DS dev.example.com
# Verificar registros DNSKEY no subdomínio
dig @ns1.dev.example.com DNSKEY dev.example.com
# Usar ferramentas de diagnóstico DNSSEC
dnssec-verify dev.example.com.signed
Possíveis Causas e Soluções:
- Registro DS ausente ou incorreto:
- Verifique se o registro DS está presente no domínio principal
- Regenere o registro DS e atualize o domínio principal
- Chaves DNSSEC expiradas ou inválidas:
- Verifique a validade das chaves:
dnssec-verify
- Regenere as chaves se necessário
- Verifique a validade das chaves:
- Assinatura da zona falhou:
- Verifique logs de erro durante a assinatura
- Tente assinar manualmente a zona
- Cadeia de confiança quebrada:
- Verifique se o domínio principal também está assinado
- Use ferramentas como DNSViz para visualizar a cadeia de confiança
Problema: Delegação Circular
Sintomas:
- Consultas entram em loop
- Respostas com referências circulares
Verificações:
1
2
# Verificar o caminho de resolução
dig +trace +additional www.dev.example.com
Possíveis Causas e Soluções:
- Configuração circular de servidores NS:
- Verifique se não há referências circulares entre domínios e subdomínios
- Certifique-se de que os servidores NS do subdomínio não dependem do próprio subdomínio para resolução
- Glue records ausentes:
- Adicione glue records para todos os servidores NS que estão dentro do domínio delegado
Script de Verificação de Delegação
Aqui está um script abrangente para verificar a configuração de delegação:
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
#!/bin/bash
# Script para verificar delegação de subdomínio
# Parâmetros
SUBDOMAIN=$1
DOMAIN=$2
if [ -z "$SUBDOMAIN" ] || [ -z "$DOMAIN" ]; then
echo "Uso: $0 subdominio dominio"
echo "Exemplo: $0 dev example.com"
exit 1
fi
FQDN="${SUBDOMAIN}.${DOMAIN}"
echo "=== Verificação de Delegação para ${FQDN} ==="
echo
echo "=== Verificando Registros NS no Domínio Principal ==="
dig NS ${FQDN} +short
echo
echo "=== Verificando Glue Records ==="
dig NS ${FQDN} +additional
echo
echo "=== Verificando Resposta Autoritativa do Subdomínio ==="
for ns in $(dig NS ${FQDN} +short); do
echo "Consultando $ns..."
dig @$ns SOA ${FQDN} +norec
echo
done
echo "=== Verificando Resolução Completa ==="
dig +trace ${FQDN}
echo
echo "=== Verificando DNSSEC (se aplicável) ==="
dig DS ${FQDN} +short
if [ -n "$(dig DS ${FQDN} +short)" ]; then
echo "Registros DS encontrados, verificando cadeia DNSSEC..."
dig +dnssec +trace ${FQDN}
echo "Verificando DNSKEY no subdomínio..."
for ns in $(dig NS ${FQDN} +short); do
echo "Consultando $ns..."
dig @$ns DNSKEY ${FQDN} +dnssec
echo
done
else
echo "Nenhum registro DS encontrado, DNSSEC não configurado ou cadeia quebrada."
fi
echo
echo "=== Verificação de Delegação Concluída ==="
Melhores Práticas para Delegação
Redundância e Disponibilidade
- Múltiplos servidores NS: Configure pelo menos dois servidores NS para cada subdomínio
- Diversidade geográfica: Distribua servidores em diferentes locais
- Diversidade de rede: Use diferentes provedores de rede
- Monitoramento: Implemente monitoramento contínuo de todos os servidores NS
Segurança
- Transferências de zona seguras: Use TSIG para proteger transferências de zona
- DNSSEC: Implemente DNSSEC em toda a hierarquia
- Controle de acesso: Restrinja consultas e transferências apenas a IPs autorizados
- Logging: Mantenha logs detalhados para auditoria e troubleshooting
Desempenho
- TTLs apropriados: Use TTLs adequados para balancear cache e atualização
- Servidores dimensionados: Garanta que os servidores tenham recursos suficientes
- Proximidade: Posicione servidores próximos aos usuários
- Balanceamento de carga: Distribua consultas entre múltiplos servidores
Administração
- Documentação: Mantenha documentação detalhada e atualizada
- Procedimentos: Estabeleça procedimentos claros para alterações
- Automação: Automatize tarefas repetitivas
- Testes: Teste regularmente a resolução e failover
Governança
- Políticas de nomeação: Estabeleça políticas claras para nomeação de subdomínios
- Processo de aprovação: Defina um processo para aprovação de novos subdomínios
- Revisões periódicas: Revise regularmente a estrutura de delegação
- Responsabilidades: Defina claramente as responsabilidades de cada equipe
Automação de Delegação
A automação pode simplificar significativamente o gerenciamento de delegação de subdomínios.
Script para Criar Novo Subdomínio
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
#!/bin/bash
# Script para criar e delegar novo subdomínio
# Parâmetros
SUBDOMAIN=$1
DOMAIN=$2
NS1_IP=$3
NS2_IP=$4
if [ -z "$SUBDOMAIN" ] || [ -z "$DOMAIN" ] || [ -z "$NS1_IP" ] || [ -z "$NS2_IP" ]; then
echo "Uso: $0 subdominio dominio ns1_ip ns2_ip"
echo "Exemplo: $0 dev example.com 192.168.200.51 192.168.200.52"
exit 1
fi
FQDN="${SUBDOMAIN}.${DOMAIN}"
ZONE_FILE="/var/named/zones/${DOMAIN}.zone"
NAMED_CONF="/etc/named.conf"
# Verificar se o subdomínio já existe
if grep -q "^${SUBDOMAIN}[[:space:]]\+IN[[:space:]]\+NS" $ZONE_FILE; then
echo "Erro: Subdomínio $FQDN já existe."
exit 1
fi
# Backup do arquivo de zona
cp $ZONE_FILE ${ZONE_FILE}.bak
# Incrementar o número de série
SERIAL=$(grep "Serial" $ZONE_FILE | head -1 | awk '{print $1}')
NEW_SERIAL=$(date +%Y%m%d01)
if [ $NEW_SERIAL -le $SERIAL ]; then
NEW_SERIAL=$((SERIAL + 1))
fi
sed -i "s/$SERIAL[[:space:]]*;[[:space:]]*Serial/$NEW_SERIAL ; Serial/" $ZONE_FILE
# Adicionar delegação
cat >> $ZONE_FILE << EOF
; Delegação para ${FQDN}
${SUBDOMAIN} IN NS ns1.${SUBDOMAIN}.${DOMAIN}.
${SUBDOMAIN} IN NS ns2.${SUBDOMAIN}.${DOMAIN}.
ns1.${SUBDOMAIN} IN A ${NS1_IP}
ns2.${SUBDOMAIN} IN A ${NS2_IP}
EOF
# Verificar sintaxe
named-checkzone $DOMAIN $ZONE_FILE
if [ $? -ne 0 ]; then
echo "Erro na sintaxe da zona. Revertendo alterações."
mv ${ZONE_FILE}.bak $ZONE_FILE
exit 1
fi
# Recarregar zona
rndc reload $DOMAIN
if [ $? -ne 0 ]; then
echo "Erro ao recarregar zona. Revertendo alterações."
mv ${ZONE_FILE}.bak $ZONE_FILE
exit 1
fi
echo "Delegação para $FQDN criada com sucesso."
echo "Não esqueça de configurar os servidores NS do subdomínio."
Automação com Ansible
Crie um playbook Ansible para automatizar a delegação:
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
---
- name: Configurar Delegação de Subdomínio
hosts: dns_servers
become: yes
vars:
subdomain: "dev"
domain: "example.com"
ns1_ip: "192.168.200.51"
ns2_ip: "192.168.200.52"
tasks:
- name: Verificar se o subdomínio já existe
shell: grep -q "^{{ subdomain }}[[:space:]]\+IN[[:space:]]\+NS" /var/named/zones/{{ domain }}.zone
register: subdomain_exists
ignore_errors: yes
changed_when: false
- name: Falhar se o subdomínio já existe
fail:
msg: "Subdomínio {{ subdomain }}.{{ domain }} já existe."
when: subdomain_exists.rc == 0
- name: Obter número de série atual
shell: grep "Serial" /var/named/zones/{{ domain }}.zone | head -1 | awk '{print $1}'
register: serial_result
changed_when: false
- name: Calcular novo número de série
set_fact:
current_serial: "{{ serial_result.stdout | int }}"
date_serial: "{{ '%Y%m%d01' | strftime | int }}"
- name: Definir número de série final
set_fact:
new_serial: "{{ date_serial if date_serial > current_serial else current_serial + 1 }}"
- name: Atualizar número de série
replace:
path: /var/named/zones/{{ domain }}.zone
regexp: '(\s+){{ current_serial }}(\s+;.*Serial)'
replace: '\1{{ new_serial }}\2'
- name: Adicionar delegação ao arquivo de zona
blockinfile:
path: /var/named/zones/{{ domain }}.zone
block: |
; Delegação para {{ subdomain }}.{{ domain }}
{{ subdomain }} IN NS ns1.{{ subdomain }}.{{ domain }}.
{{ subdomain }} IN NS ns2.{{ subdomain }}.{{ domain }}.
ns1.{{ subdomain }} IN A {{ ns1_ip }}
ns2.{{ subdomain }} IN A {{ ns2_ip }}
- name: Verificar sintaxe da zona
command: named-checkzone {{ domain }} /var/named/zones/{{ domain }}.zone
register: checkzone_result
changed_when: false
failed_when: checkzone_result.rc != 0
- name: Recarregar zona
command: rndc reload {{ domain }}
register: reload_result
failed_when: reload_result.rc != 0
- name: Notificar sucesso
debug:
msg: "Delegação para {{ subdomain }}.{{ domain }} criada com sucesso."
API REST para Gerenciamento de Delegação
Para ambientes maiores, considere implementar uma API REST para gerenciamento de delegação:
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
103
104
from flask import Flask, request, jsonify
import subprocess
import re
import os
app = Flask(__name__)
@app.route('/api/delegation', methods=['POST'])
def create_delegation():
data = request.json
# Validar parâmetros
required_params = ['subdomain', 'domain', 'ns1_ip', 'ns2_ip']
for param in required_params:
if param not in data:
return jsonify({'error': f'Parâmetro {param} ausente'}), 400
subdomain = data['subdomain']
domain = data['domain']
ns1_ip = data['ns1_ip']
ns2_ip = data['ns2_ip']
# Validar formato
if not re.match(r'^[a-z0-9-]+$', subdomain):
return jsonify({'error': 'Formato de subdomínio inválido'}), 400
zone_file = f'/var/named/zones/{domain}.zone'
# Verificar se o arquivo de zona existe
if not os.path.exists(zone_file):
return jsonify({'error': f'Arquivo de zona para {domain} não encontrado'}), 404
# Verificar se o subdomínio já existe
try:
result = subprocess.run(['grep', '-q', f'^{subdomain}[[:space:]]+IN[[:space:]]+NS', zone_file])
if result.returncode == 0:
return jsonify({'error': f'Subdomínio {subdomain}.{domain} já existe'}), 409
except Exception as e:
return jsonify({'error': str(e)}), 500
# Implementar lógica de delegação
try:
# Backup do arquivo de zona
subprocess.run(['cp', zone_file, f'{zone_file}.bak'], check=True)
# Obter e incrementar número de série
serial_cmd = f"grep 'Serial' {zone_file} | head -1 | awk '{{print $1}}'"
serial = subprocess.check_output(serial_cmd, shell=True).decode().strip()
date_serial = subprocess.check_output('date +%Y%m%d01', shell=True).decode().strip()
if int(date_serial) <= int(serial):
new_serial = int(serial) + 1
else:
new_serial = int(date_serial)
# Atualizar número de série
subprocess.run(['sed', '-i', f's/{serial}[[:space:]]*;[[:space:]]*Serial/{new_serial} ; Serial/', zone_file], check=True)
# Adicionar delegação
with open(zone_file, 'a') as f:
f.write(f'''
; Delegação para {subdomain}.{domain}
{subdomain} IN NS ns1.{subdomain}.{domain}.
{subdomain} IN NS ns2.{subdomain}.{domain}.
ns1.{subdomain} IN A {ns1_ip}
ns2.{subdomain} IN A {ns2_ip}
''')
# Verificar sintaxe
result = subprocess.run(['named-checkzone', domain, zone_file], capture_output=True)
if result.returncode != 0:
# Reverter alterações
subprocess.run(['mv', f'{zone_file}.bak', zone_file])
return jsonify({'error': f'Erro na sintaxe da zona: {result.stderr.decode()}'}), 400
# Recarregar zona
result = subprocess.run(['rndc', 'reload', domain], capture_output=True)
if result.returncode != 0:
# Reverter alterações
subprocess.run(['mv', f'{zone_file}.bak', zone_file])
return jsonify({'error': f'Erro ao recarregar zona: {result.stderr.decode()}'}), 500
return jsonify({
'status': 'success',
'message': f'Delegação para {subdomain}.{domain} criada com sucesso',
'subdomain': subdomain,
'domain': domain,
'fqdn': f'{subdomain}.{domain}',
'ns1': f'ns1.{subdomain}.{domain}',
'ns2': f'ns2.{subdomain}.{domain}',
'ns1_ip': ns1_ip,
'ns2_ip': ns2_ip
})
except Exception as e:
# Tentar reverter alterações
try:
subprocess.run(['mv', f'{zone_file}.bak', zone_file])
except:
pass
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Conclusão
Neste artigo final da nossa série sobre DNS BIND no Oracle Linux 9, exploramos a delegação e gerenciamento de subdomínios. Abordamos desde os conceitos fundamentais até implementações práticas, incluindo delegação em ambientes com views, delegação segura com DNSSEC, troubleshooting e automação.
A delegação de subdomínios é uma técnica poderosa que permite criar uma infraestrutura DNS escalável, bem organizada e descentralizada. Ao dominar esses conceitos e técnicas, você está preparado para implementar e gerenciar infraestruturas DNS complexas em ambientes corporativos e de provedores de serviço.
Recapitulação da Série
Ao longo desta série de oito artigos, cobrimos todos os aspectos da implementação e gerenciamento de servidores DNS BIND no Oracle Linux 9:
- Fundamentos do DNS e Preparação: Conceitos básicos, hierarquia DNS e planejamento
- Instalação e Configuração Básica: Instalação do BIND e configuração inicial
- Configuração de Zonas DNS: Criação e gerenciamento de zonas diretas e reversas
- Views e DNS Split-Horizon: Configuração de diferentes visões do DNS para diferentes clientes
- Segurança e Hardening: Proteção do servidor DNS contra ameaças
- Logging, Monitoramento e Troubleshooting: Diagnóstico e resolução de problemas
- Configurações Avançadas: Servidor secundário, chroot, alta disponibilidade e integração com DHCP
- Delegação e Subdomínios: Implementação e gerenciamento de delegação
Esperamos que esta série tenha fornecido o conhecimento e as ferramentas necessárias para implementar, configurar e gerenciar servidores DNS BIND com confiança e competência.
Referências e Recursos Adicionais
- Documentação oficial do BIND
- BIND 9 Administrator Reference Manual - Delegation
- RFC 1034 - Domain Names - Concepts and Facilities
- RFC 1035 - Domain Names - Implementation and Specification
- RFC 4033-4035 - DNSSEC
- DNS and BIND, 5th Edition - Cricket Liu & Paul Albitz
- Pro DNS and BIND - Ron Aitchison
- DNSViz - Ferramenta de visualização e análise de DNSSEC
- RIPE DNS Workbench - Ambiente de teste para DNS e DNSSEC