Logging, Monitoramento e Troubleshooting de Servidores DNS BIND
Este é o sexto 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 e a segurança e hardening. Agora, vamos explorar técnicas avançadas de logging, monitoramento e troubleshooting.
Introdução
Um servidor DNS bem configurado e seguro é apenas o começo. Para garantir operações confiáveis e de alta disponibilidade, é essencial implementar logging adequado, monitoramento contínuo e conhecer técnicas eficazes de troubleshooting.
O logging fornece visibilidade sobre o funcionamento do servidor, ajudando a identificar problemas, detectar atividades suspeitas e entender padrões de uso. O monitoramento permite acompanhar o desempenho e a disponibilidade em tempo real, alertando sobre problemas antes que afetem os usuários. E o troubleshooting eficaz permite resolver rapidamente problemas quando eles ocorrem, minimizando o impacto nos serviços.
Neste artigo, abordaremos técnicas avançadas de logging, monitoramento e troubleshooting para servidores DNS BIND no Oracle Linux 9. Vamos explorar desde a configuração detalhada de logging até ferramentas de monitoramento e métodos sistemáticos para diagnóstico e resolução de problemas.
Configuração Avançada de Logging no BIND
O BIND oferece um sistema de logging flexível e poderoso que permite direcionar diferentes tipos de mensagens para diferentes destinos e com diferentes níveis de detalhamento.
Conceitos Fundamentais de Logging no BIND
O sistema de logging do BIND é baseado em dois conceitos principais:
- Canais (Channels): Definem para onde as mensagens de log são enviadas (arquivos, syslog, stderr) e como são formatadas
- Categorias (Categories): Definem quais tipos de mensagens são registradas em quais canais
Configuração de Canais de Log
Os canais de log definem o destino e o formato das mensagens. Vamos explorar diferentes tipos de canais:
Canais de Arquivo
Os canais de arquivo direcionam mensagens para arquivos específicos:
1
2
3
4
5
6
7
channel file_channel {
file "/var/log/named/example.log" versions 3 size 5m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
Parâmetros importantes:
- file: Caminho do arquivo de log
- versions: Número de versões antigas a manter
- size: Tamanho máximo antes da rotação
- severity: Nível mínimo de severidade a registrar
- print-time: Incluir timestamp nas mensagens
- print-severity: Incluir nível de severidade nas mensagens
- print-category: Incluir categoria nas mensagens
Canais Syslog
Os canais syslog direcionam mensagens para o sistema de log do sistema operacional:
1
2
3
4
5
channel syslog_channel {
syslog daemon;
severity notice;
print-category yes;
};
Parâmetros importantes:
- syslog: Facility do syslog (kern, user, mail, daemon, auth, etc.)
- severity: Nível mínimo de severidade a registrar
Canal Null
O canal null descarta mensagens, útil para silenciar categorias específicas:
1
2
3
channel null_channel {
null;
};
Canal stderr
O canal stderr envia mensagens para a saída de erro padrão:
1
2
3
4
5
channel stderr_channel {
stderr;
severity error;
print-time yes;
};
Níveis de Severidade
O BIND suporta os seguintes níveis de severidade, em ordem decrescente de gravidade:
- critical: Condições críticas que exigem atenção imediata
- error: Condições de erro que podem afetar a funcionalidade
- warning: Condições que podem indicar problemas futuros
- notice: Eventos normais, mas significativos
- info: Informações gerais sobre o funcionamento
- debug [level]: Mensagens de depuração (com níveis de 1 a 3)
- dynamic: Ajusta automaticamente o nível baseado na carga do servidor
Configuração de Categorias de Log
As categorias de log definem quais tipos de eventos são registrados em quais canais:
1
2
3
4
category default { default_channel; };
category general { general_channel; };
category queries { query_channel; };
category security { security_channel; };
+-----------------------+
| Evento DNS Ocorre |
| (e.g., Consulta, Erro)|
+-----------+-----------+
|
V
+-----------+-----------+
| BIND Determina Categoria |
| (e.g., queries, security)|
+-----------+-----------+
|
V
+-----------+-----------+
| BIND Verifica Configuração |
| logging { category ... } |
+-----------+-----------+
|
V
+-----------+-----------+
| Mensagem Enviada para |
| Canais Associados |
| (e.g., query_log, |
| security_log) |
+-----+-----+-----+-----+
| |
V V
+-----+-----+ +-----+-----+
| Canal A | Canal B |
| (e.g., file)| (e.g., syslog)|
+-----+-----+ +-----+-----+
| |
V V
+-----+-----+ +-----+-----+
| Destino A | Destino B |
| (Arquivo) | (Syslog) |
+-------------+-------------+
Figura 1: Fluxo de Logging no BIND (Categorias e Canais)
O BIND suporta muitas categorias, incluindo:
- default: Mensagens que não se encaixam em outras categorias
- general: Mensagens gerais sobre o funcionamento do servidor
- config: Mensagens relacionadas à configuração
- client: Mensagens sobre clientes específicos
- database: Mensagens sobre o banco de dados interno
- dnssec: Mensagens relacionadas a DNSSEC
- network: Mensagens sobre operações de rede
- queries: Consultas DNS recebidas
- resolver: Mensagens sobre o processo de resolução
- security: Eventos relacionados à segurança
- update: Atualizações dinâmicas
- xfer-in: Transferências de zona recebidas
- xfer-out: Transferências de zona enviadas
Configuração Completa de Logging
Vamos criar uma configuração de logging abrangente para um servidor DNS em produçã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
logging {
// Canal para mensagens gerais
channel general_log {
file "/var/log/named/general.log" versions 5 size 20m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
// Canal para mensagens de segurança
channel security_log {
file "/var/log/named/security.log" versions 5 size 20m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
// Canal para consultas
channel query_log {
file "/var/log/named/query.log" versions 5 size 50m;
severity info;
print-time yes;
};
// Canal para erros
channel error_log {
file "/var/log/named/error.log" versions 5 size 20m;
severity error;
print-time yes;
print-severity yes;
print-category yes;
};
// Canal para depuração (ativado apenas quando necessário)
channel debug_log {
file "/var/log/named/debug.log" versions 2 size 50m;
severity dynamic;
print-time yes;
print-severity yes;
print-category yes;
};
// Canal para syslog (mensagens críticas)
channel syslog_critical {
syslog daemon;
severity critical;
};
// Canal null para silenciar categorias específicas
channel null {
null;
};
// Atribuição de categorias a canais
category default { general_log; };
category general { general_log; };
category config { general_log; };
category client { general_log; };
category network { general_log; };
category queries { query_log; };
category security { security_log; syslog_critical; };
category dnssec { security_log; };
category update { security_log; };
category update-security { security_log; };
category xfer-in { security_log; };
category xfer-out { security_log; };
category resolver { error_log; };
category edns-disabled { error_log; };
category rate-limit { error_log; };
category lame-servers { error_log; };
category database { debug_log; };
category unmatched { debug_log; };
// Silenciar categorias muito verbosas em produção
category notify { null; };
};
Rotação de Logs
Embora o BIND tenha recursos internos de rotação de logs (parâmetros versions
e size
), é uma boa prática configurar também o logrotate para garantir que os logs não consumam espaço em disco excessivo:
1
sudo vi /etc/logrotate.d/named
Adicione a seguinte configuração:
1
2
3
4
5
6
7
8
9
10
11
12
13
/var/log/named/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 named named
sharedscripts
postrotate
/usr/bin/systemctl reload named.service > /dev/null 2>&1 || true
endscript
}
Esta configuração:
- Rotaciona os logs diariamente
- Mantém 30 versões antigas
- Comprime logs antigos
- Preserva permissões e propriedade
- Recarrega o serviço named após a rotação
Análise de Logs DNS
Os logs do DNS são uma fonte valiosa de informações para diagnóstico, monitoramento e segurança. Vamos explorar técnicas para extrair insights desses logs.
Ferramentas Básicas de Análise de Logs
Análise com Grep
O grep é uma ferramenta poderosa para filtrar logs:
1
2
3
4
5
6
7
8
# Encontrar erros
grep "error" /var/log/named/general.log
# Encontrar tentativas de transferência de zona não autorizadas
grep "denied" /var/log/named/security.log | grep "transfer"
# Encontrar consultas para um domínio específico
grep "example.com" /var/log/named/query.log
Análise com Awk
O awk é útil para extrair e processar campos específicos:
1
2
3
4
5
6
7
8
# Contar consultas por domínio
awk '{print $6}' /var/log/named/query.log | sort | uniq -c | sort -nr | head -10
# Identificar clientes que fazem muitas consultas
awk '{print $4}' /var/log/named/query.log | sort | uniq -c | sort -nr | head -10
# Calcular a taxa de consultas por minuto
awk '{print substr($1,1,14)}' /var/log/named/query.log | uniq -c
Análise com Sed
O sed é útil para transformar e filtrar texto:
1
2
3
4
5
# Extrair apenas a parte da mensagem de erro
sed -n 's/.*error: \(.*\)/\1/p' /var/log/named/error.log
# Converter timestamps para um formato específico
sed 's/\([0-9]\{2\}-[A-Za-z]\{3\}-[0-9]\{4\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\).\{4\}/\1/' /var/log/named/general.log
Ferramentas Avançadas de Análise de Logs
ELK Stack (Elasticsearch, Logstash, Kibana)
O ELK Stack é uma solução poderosa para análise centralizada de logs:
- Elasticsearch: Armazena e indexa logs
- Logstash: Coleta, processa e encaminha logs
- Kibana: Interface web para visualização e análise
Configuração básica do Filebeat para enviar logs do BIND para o ELK:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/named/*.log
tags: ["bind", "dns"]
fields:
server_role: "dns"
environment: "production"
fields_under_root: true
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
output.elasticsearch:
hosts: ["elasticsearch-server:9200"]
index: "filebeat-dns-%{+yyyy.MM.dd}"
Graylog
O Graylog é outra solução popular para gerenciamento centralizado de logs:
1
2
# Instalar e configurar rsyslog para enviar logs para Graylog
sudo vi /etc/rsyslog.d/90-graylog.conf
Adicione:
1
2
3
4
5
# Enviar logs do BIND para Graylog
if $programname == 'named' then {
action(type="omfwd" target="graylog-server" port="514" protocol="tcp")
stop
}
DNSViz
O DNSViz é uma ferramenta para análise e visualização de configurações DNSSEC:
1
2
3
4
5
6
7
# Instalar DNSViz
sudo dnf install python3-pip -y
sudo pip3 install dnsviz
# Analisar um domínio
dnsviz probe example.com
dnsviz graph -Tpng -o example.com.png example.com
Padrões Comuns em Logs DNS
Conhecer padrões comuns em logs DNS ajuda a identificar problemas rapidamente:
Padrões de Consulta Normal
1
client 192.168.200.10#54321 (example.com): query: example.com IN A +E(0)K (192.168.200.49)
Componentes:
- client IP#port: Endereço IP e porta do cliente
- query: Tipo de operação
- domain name: Nome consultado
- IN: Classe (Internet)
- A: Tipo de registro
- +E(0)K: Flags (EDNS, DNSSEC OK)
- (server IP): Endereço IP do servidor que recebeu a consulta
Padrões de Erro
1
error (no valid RRSIG) resolving 'example.com/DNSKEY/IN': 2001:db8::53#53
Este erro indica um problema com a validação DNSSEC.
1
client 192.168.200.10#54321: query (cache) 'example.com/A/IN' denied
Este erro indica que uma consulta foi negada devido a restrições de ACL.
Padrões de Segurança
1
client 203.0.113.10#54321 (example.com): zone transfer 'example.com/AXFR/IN' denied
Este log indica uma tentativa não autorizada de transferência de zona.
1
client 203.0.113.10#54321: update 'example.com/IN' denied
Este log indica uma tentativa não autorizada de atualização dinâmica.
Monitoramento de Servidores DNS
O monitoramento contínuo é essencial para garantir a disponibilidade, desempenho e segurança dos servidores DNS.
Métricas Importantes para Monitoramento
Métricas de Disponibilidade
- Tempo de atividade do serviço: Porcentagem de tempo em que o serviço está disponível
- Latência de resposta: Tempo para responder a consultas
- Taxa de sucesso: Porcentagem de consultas respondidas com sucesso
Métricas de Desempenho
- Consultas por segundo (QPS): Número de consultas processadas por segundo
- Utilização de CPU e memória: Recursos consumidos pelo processo named
- Tamanho do cache: Utilização do cache de DNS
- Taxa de acertos de cache: Porcentagem de consultas respondidas a partir do cache
Métricas de Segurança
- Tentativas de transferência de zona não autorizadas: Possíveis tentativas de reconhecimento
- Consultas recusadas: Consultas negadas devido a restrições de ACL
- Taxa de consultas por cliente: Identificar possíveis ataques de DoS
- Consultas para domínios inexistentes (NXDOMAIN): Possíveis tentativas de DNS tunneling
Ferramentas de Monitoramento
Monitoramento com RNDC Stats
O RNDC (Remote Name Daemon Control) permite gerar estatísticas do BIND:
1
2
3
4
5
# Gerar estatísticas
sudo rndc stats
# Visualizar estatísticas
cat /var/named/data/named_stats.txt
Para automatizar a coleta de estatísticas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# Script para coletar estatísticas do BIND periodicamente
STATS_DIR="/var/named/data/stats_history"
mkdir -p $STATS_DIR
# Gerar estatísticas
sudo rndc stats
# Copiar para arquivo com timestamp
TIMESTAMP=$(date +%Y%m%d%H%M%S)
cp /var/named/data/named_stats.txt $STATS_DIR/named_stats_$TIMESTAMP.txt
# Manter apenas os últimos 100 arquivos
ls -t $STATS_DIR/named_stats_*.txt | tail -n +101 | xargs rm -f
Monitoramento com Prometheus e Grafana
O Prometheus é uma plataforma de monitoramento de código aberto, e o Grafana é uma plataforma de visualização.
Primeiro, instale e configure o exportador BIND para Prometheus:
1
2
3
4
5
6
7
8
9
# Instalar Go
sudo dnf install golang -y
# Instalar o exportador BIND
sudo go install github.com/prometheus-community/bind_exporter@latest
sudo cp ~/go/bin/bind_exporter /usr/local/bin/
# Criar serviço systemd
sudo vi /etc/systemd/system/bind_exporter.service
Adicione:
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=BIND Exporter
After=network.target
[Service]
Type=simple
User=named
ExecStart=/usr/local/bin/bind_exporter --bind.stats-url=http://localhost:8080/
Restart=always
[Install]
WantedBy=multi-user.target
Configure o BIND para expor estatísticas:
1
2
3
4
5
6
options {
// ...
statistics-channels {
inet 127.0.0.1 port 8080 allow { 127.0.0.1; };
};
};
Inicie e habilite o serviço:
1
sudo systemctl enable --now bind_exporter
Configure o Prometheus para coletar métricas do exportador:
1
2
3
4
5
# /etc/prometheus/prometheus.yml
scrape_configs:
- job_name: 'bind'
static_configs:
- targets: ['localhost:9119']
Crie um dashboard no Grafana para visualizar as métricas.
Monitoramento com Nagios/Icinga
O Nagios e o Icinga são plataformas de monitoramento populares que podem monitorar servidores DNS.
Exemplo de comando de verificação para o Nagios:
1
2
3
4
5
6
7
8
9
10
11
define command {
command_name check_dns
command_line $USER1$/check_dns -H example.com -s $HOSTADDRESS$
}
define service {
use generic-service
host_name dns-server
service_description DNS Service
check_command check_dns
}
Para monitoramento mais avançado, você pode usar scripts personalizados:
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
#!/bin/bash
# Script para verificar a saúde do servidor DNS
# Verificar se o serviço está em execução
systemctl is-active named > /dev/null
if [ $? -ne 0 ]; then
echo "CRITICAL: Serviço named não está em execução"
exit 2
fi
# Verificar resolução de um domínio interno
dig @localhost example.com +short > /dev/null
if [ $? -ne 0 ]; then
echo "CRITICAL: Falha ao resolver domínio interno"
exit 2
fi
# Verificar resolução de um domínio externo
dig @localhost google.com +short > /dev/null
if [ $? -ne 0 ]; then
echo "WARNING: Falha ao resolver domínio externo"
exit 1
fi
# Verificar carga do servidor
LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk -F, '{print $1}' | tr -d ' ')
if (( $(echo "$LOAD > 5.0" | bc -l) )); then
echo "WARNING: Carga do servidor alta: $LOAD"
exit 1
fi
echo "OK: Servidor DNS funcionando normalmente"
exit 0
Alertas e Notificações
Configure alertas para ser notificado sobre problemas antes que afetem os usuários:
Alertas Baseados em Logs
Use ferramentas como Logwatch ou scripts personalizados para gerar alertas baseados em logs:
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
#!/bin/bash
# Script para alertar sobre eventos de segurança nos logs do BIND
LOG_FILE="/var/log/named/security.log"
ALERT_EMAIL="admin@example.com"
TEMP_FILE="/tmp/dns_security_alerts.txt"
# Verificar tentativas de transferência de zona não autorizadas
XFER_ATTEMPTS=$(grep "denied" $LOG_FILE | grep "transfer" | wc -l)
if [ $XFER_ATTEMPTS -gt 10 ]; then
echo "ALERTA: $XFER_ATTEMPTS tentativas de transferência de zona não autorizadas detectadas" >> $TEMP_FILE
fi
# Verificar tentativas de atualização dinâmica não autorizadas
UPDATE_ATTEMPTS=$(grep "denied" $LOG_FILE | grep "update" | wc -l)
if [ $UPDATE_ATTEMPTS -gt 5 ]; then
echo "ALERTA: $UPDATE_ATTEMPTS tentativas de atualização dinâmica não autorizadas detectadas" >> $TEMP_FILE
fi
# Enviar alerta se houver eventos
if [ -s $TEMP_FILE ]; then
mail -s "Alertas de Segurança DNS" $ALERT_EMAIL < $TEMP_FILE
fi
rm -f $TEMP_FILE
Alertas Baseados em Métricas
Configure alertas no Prometheus/Grafana ou Nagios/Icinga baseados em métricas:
Exemplo de regra de alerta no Prometheus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
groups:
- name: dns_alerts
rules:
- alert: HighDNSQueryRate
expr: rate(bind_incoming_queries_total[5m]) > 1000
for: 5m
labels:
severity: warning
annotations:
summary: "Alta taxa de consultas DNS"
description: "O servidor DNS está processando mais de 1000 consultas por segundo por 5 minutos"
- alert: DNSServiceDown
expr: up{job="bind"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Serviço DNS inativo"
description: "O serviço DNS está inativo ou não responde"
Troubleshooting de Servidores DNS
O troubleshooting eficaz é essencial para resolver problemas rapidamente e minimizar o impacto nos serviços.
Metodologia de Troubleshooting
Uma abordagem sistemática para troubleshooting de DNS inclui:
- Identificar o problema: Definir claramente o que está errado
- Coletar informações: Logs, configurações, saída de comandos de diagnóstico
- Analisar dados: Identificar padrões e possíveis causas
- Formular hipóteses: Desenvolver teorias sobre a causa do problema
- Testar hipóteses: Verificar cada teoria metodicamente
- Implementar solução: Aplicar a correção
- Verificar resolução: Confirmar que o problema foi resolvido
- Documentar: Registrar o problema, causa e solução
+-----------------------------+
| Problema Detectado |
| (e.g., Falha na Resolução) |
+-------------+---------------+
|
V
+-------------+---------------+
| 1. Definir Problema |
| (Sintomas Exatos) |
+-------------+---------------+
|
V
+-------------+---------------+
| 2. Coletar Informações |
| (Logs, Status, Testes) |
+-------------+---------------+
|
V
+-------------+---------------+
| 3. Formular Hipóteses |
| (Possíveis Causas) |
+-------------+---------------+
|
V
+-------------+---------------+
| 4. Testar Hipótese 1 | ----> [Resolveu?] --(Não)--> Testar Hipótese 2...
+-------------+---------------+
| (Sim)
V
+-------------+---------------+
| 5. Implementar Solução |
+-------------+---------------+
|
V
+-------------+---------------+
| 6. Verificar Solução |
| (Problema Resolvido?) |
+-------------+---------------+
| (Sim)
V
+-------------+---------------+
| 7. Documentar |
| (Problema, Causa, Solução)|
+-----------------------------+
Figura 2: Fluxograma de Troubleshooting Sistemático
Ferramentas de Troubleshooting
Ferramentas de Diagnóstico
Ferramentas Básicas
dig (Domain Information Groper)
O dig é uma ferramenta versátil para consultas DNS:
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
# Consulta básica
dig example.com
# Especificar servidor DNS
dig @192.168.200.49 example.com
# Especificar tipo de registro
dig example.com MX
# Consulta reversa
dig -x 192.168.200.10
# Consulta com rastreamento (+trace)
dig +trace example.com
# Consulta com estatísticas (+stats)
dig +stats example.com
# Consulta com resposta curta (+short)
dig +short example.com
# Consulta com todas as informações (+all)
dig +all example.com
# Consulta com DNSSEC (+dnssec)
dig +dnssec example.com
# Transferência de zona (AXFR)
dig @192.168.200.49 example.com AXFR
host
O host é uma ferramenta simples para consultas DNS:
1
2
3
4
5
6
7
8
9
10
11
# Consulta básica
host example.com
# Especificar servidor DNS
host example.com 192.168.200.49
# Consulta reversa
host 192.168.200.10
# Consulta detalhada (-v)
host -v example.com
nslookup
O nslookup é outra ferramenta para consultas DNS:
1
2
3
4
5
6
7
8
9
10
11
# Consulta básica
nslookup example.com
# Especificar servidor DNS
nslookup example.com 192.168.200.49
# Modo interativo
nslookup
> server 192.168.200.49
> set type=MX
> example.com
rndc (Remote Name Daemon Control)
O rndc permite controlar o servidor BIND:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Verificar status
sudo rndc status
# Recarregar configuração
sudo rndc reload
# Recarregar zona específica
sudo rndc reload example.com
# Limpar cache
sudo rndc flush
# Limpar cache de um domínio específico
sudo rndc flushname example.com
# Gerar estatísticas
sudo rndc stats
# Parar o servidor
sudo rndc stop
# Iniciar o servidor
sudo rndc start
Ferramentas Avançadas
named-checkconf
O named-checkconf verifica a sintaxe do arquivo de configuração:
1
2
3
4
5
6
7
8
# Verificar sintaxe
sudo named-checkconf
# Verificar sintaxe e carregar zonas
sudo named-checkconf -z
# Imprimir configuração processada
sudo named-checkconf -p
named-checkzone
O named-checkzone verifica a sintaxe de arquivos de zona:
1
2
3
4
5
# Verificar zona
sudo named-checkzone example.com /var/named/zones/example.com.zone
# Verificar zona com opções adicionais
sudo named-checkzone -i local -S warn example.com /var/named/zones/example.com.zone
dnstap
O dnstap é um sistema de captura e registro de tráfego DNS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Configurar dnstap no BIND
options {
// ...
dnstap { client; auth; resolver; forwarder; };
dnstap-output file "/var/named/data/dnstap.log";
dnstap-identity "ns1.example.com";
dnstap-version "BIND 9";
};
# Instalar ferramenta de análise dnstap
sudo dnf install dnstap-utils -y
# Analisar arquivo dnstap
dnstap-read /var/named/data/dnstap.log
tcpdump
O tcpdump pode capturar e analisar tráfego DNS:
1
2
3
4
5
# Capturar tráfego DNS
sudo tcpdump -i any -s0 -w /tmp/dns.pcap port 53
# Analisar tráfego DNS capturado
sudo tcpdump -r /tmp/dns.pcap -n port 53
Wireshark
O Wireshark oferece análise detalhada de pacotes DNS:
1
2
3
4
5
6
7
8
9
10
# Instalar Wireshark
sudo dnf install wireshark -y
# Capturar tráfego DNS
sudo tshark -i any -w /tmp/dns.pcap port 53
# Filtrar tráfego DNS no Wireshark
dns
dns.qry.name contains "example.com"
dns.flags.rcode == 3 # NXDOMAIN
Problemas Comuns e Soluções
Problema: Servidor DNS Não Inicia
Sintomas:
- O serviço named não inicia
- Mensagens de erro no journalctl
Verificações:
1
2
3
4
5
6
7
8
# Verificar status do serviço
sudo systemctl status named
# Verificar logs
sudo journalctl -u named
# Verificar sintaxe da configuração
sudo named-checkconf
Possíveis Causas e Soluções:
- Erro de sintaxe na configuração:
- Corrija os erros identificados pelo named-checkconf
- Verifique se todos os blocos têm chaves de fechamento e ponto e vírgula
- Permissões incorretas:
- Verifique permissões de arquivos e diretórios
- Corrija com
chown
echmod
- Problemas com SELinux:
- Verifique mensagens de negação do SELinux
- Corrija contextos com
restorecon
- Ajuste booleans com
setsebool
- Porta 53 já em uso:
- Verifique se outro processo está usando a porta 53
sudo ss -tulpn | grep :53
- Pare o processo conflitante ou reconfigure o BIND para usar outra porta
Problema: Falha na Resolução de Nomes
Sintomas:
- Consultas DNS falham
- Mensagens “SERVFAIL” ou “NXDOMAIN” inesperadas
Verificações:
1
2
3
4
5
6
7
8
# Testar resolução
dig @localhost example.com
# Verificar logs
sudo tail -f /var/log/named/general.log
# Verificar zona
sudo named-checkzone example.com /var/named/zones/example.com.zone
Possíveis Causas e Soluções:
- Arquivo de zona com erros:
- Corrija erros no arquivo de zona
- Verifique se o serial foi incrementado após alterações
- Problemas de permissão:
- Verifique se o named pode ler os arquivos de zona
- Corrija permissões com
chown
echmod
- Problemas de recursão:
- Verifique se a recursão está habilitada para o cliente
- Verifique conectividade com a Internet para consultas externas
- Problemas de DNSSEC:
- Verifique se há erros de validação DNSSEC
- Considere desabilitar temporariamente a validação DNSSEC para diagnóstico
Problema: Transferências de Zona Falham
Sintomas:
- Servidores secundários não recebem atualizações
- Mensagens de erro relacionadas a transferências de zona
Verificações:
1
2
3
4
5
6
7
8
# Verificar logs no servidor primário
sudo grep "transfer" /var/log/named/security.log
# Verificar logs no servidor secundário
sudo grep "transfer" /var/log/named/general.log
# Testar transferência manualmente
dig @primary_server example.com AXFR
Possíveis Causas e Soluções:
- Restrições de ACL:
- Verifique se o servidor secundário está na ACL allow-transfer
- Corrija a configuração e recarregue
- Problemas com TSIG:
- Verifique se as chaves TSIG estão corretas em ambos os servidores
- Verifique se o horário está sincronizado entre os servidores
- Problemas de rede:
- Verifique conectividade entre os servidores
- Verifique firewall e regras de roteamento
- Problemas de permissão:
- Verifique se o servidor secundário pode escrever no diretório de zonas
- Corrija permissões com
chown
echmod
Problema: Desempenho Lento
Sintomas:
- Consultas DNS demoram para ser respondidas
- Alta utilização de CPU ou memória
Verificações:
1
2
3
4
5
6
7
8
9
# Verificar estatísticas
sudo rndc stats
cat /var/named/data/named_stats.txt
# Verificar utilização de recursos
top -p $(pidof named)
# Verificar conexões
sudo ss -anp | grep named
Possíveis Causas e Soluções:
- Cache insuficiente:
- Aumente o tamanho do cache na configuração
max-cache-size 256M;
- Muitas consultas recursivas:
- Implemente caching forwarders
- Restrinja recursão apenas a clientes autorizados
- Ataques DoS:
- Implemente rate limiting
- Bloqueie IPs ofensores no firewall
- Problemas de hardware:
- Verifique se o servidor tem recursos suficientes
- Considere atualizar hardware ou distribuir carga
Problema: Problemas de DNSSEC
Sintomas:
- Falhas de validação DNSSEC
- Mensagens “SERVFAIL” para domínios assinados
Verificações:
1
2
3
4
5
6
7
8
# Verificar validação DNSSEC
dig @localhost example.com +dnssec
# Verificar logs
sudo grep "DNSSEC" /var/log/named/security.log
# Verificar configuração DNSSEC
sudo named-checkconf | grep dnssec
Possíveis Causas e Soluções:
- Chaves DNSSEC expiradas:
- Gere novas chaves e assine a zona novamente
- Atualize registros DS na zona pai
- Problemas de validação:
- Verifique se a cadeia de confiança está completa
- Use ferramentas como DNSViz para diagnóstico
- Configuração incorreta:
- Verifique se dnssec-validation está configurado corretamente
- Verifique se as chaves estão no diretório correto
- Problemas temporários:
- Considere desabilitar temporariamente a validação DNSSEC para diagnóstico
- Reative após resolver o problema
Scripts de Diagnóstico
Aqui está um script abrangente para diagnóstico de servidores DNS:
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
105
106
107
108
109
110
111
112
113
#!/bin/bash
# Script de diagnóstico para servidores DNS BIND
echo "=== Diagnóstico de Servidor DNS BIND ==="
echo "Data: $(date)"
echo "Hostname: $(hostname)"
echo
echo "=== Informações do Sistema ==="
uname -a
echo
echo "=== Versão do BIND ==="
named -v
echo
echo "=== Status do Serviço ==="
systemctl status named
echo
echo "=== Configuração do BIND ==="
echo "Verificando sintaxe da configuração:"
named-checkconf
if [ $? -eq 0 ]; then
echo "Sintaxe da configuração OK"
else
echo "ERRO na sintaxe da configuração"
fi
echo
echo "=== Zonas Configuradas ==="
named-checkconf -z
echo
echo "=== Verificação de Portas ==="
ss -tulpn | grep named
echo
echo "=== Verificação de Processos ==="
ps aux | grep named
echo
echo "=== Utilização de Recursos ==="
echo "CPU e Memória:"
top -b -n 1 -p $(pidof named) | tail -n +7
echo
echo "Espaço em Disco:"
df -h /var/named
echo
echo "=== Verificação de Logs ==="
echo "Últimas 10 linhas de logs gerais:"
tail -n 10 /var/log/named/general.log
echo
echo "Últimas 10 linhas de logs de segurança:"
tail -n 10 /var/log/named/security.log
echo
echo "Últimas 10 linhas de logs de erro:"
tail -n 10 /var/log/named/error.log
echo
echo "=== Estatísticas do BIND ==="
rndc stats
echo "Últimas 20 linhas de estatísticas:"
tail -n 20 /var/named/data/named_stats.txt
echo
echo "=== Testes de Resolução ==="
echo "Teste de resolução local:"
dig @localhost localhost
echo
echo "Teste de resolução interna:"
dig @localhost example.com
echo
echo "Teste de resolução externa:"
dig @localhost google.com
echo
echo "Teste de resolução reversa:"
dig @localhost -x 127.0.0.1
echo
echo "=== Verificação de DNSSEC ==="
echo "Configuração DNSSEC:"
grep -i dnssec /etc/named.conf
echo
echo "Teste de validação DNSSEC:"
dig @localhost dnssec-tools.org +dnssec
echo
echo "=== Verificação de Rede ==="
echo "Interfaces de rede:"
ip addr
echo
echo "Tabela de roteamento:"
ip route
echo
echo "Regras de firewall:"
firewall-cmd --list-all
echo
echo "=== Verificação de SELinux ==="
echo "Status do SELinux:"
sestatus
echo
echo "Contextos SELinux para arquivos do BIND:"
ls -Z /etc/named.conf
ls -Z /var/named/zones
echo
echo "Booleans SELinux relacionados ao BIND:"
getsebool -a | grep named
echo
echo "=== Diagnóstico Concluído ==="
Otimização de Desempenho
Além de monitorar e resolver problemas, é importante otimizar o desempenho do servidor DNS.
Otimização de Cache
O cache é um componente crítico para o desempenho do DNS:
1
2
3
4
5
6
7
8
9
10
11
options {
// Configuração de cache
max-cache-size 256M;
max-cache-ttl 86400; // 1 dia
max-ncache-ttl 3600; // 1 hora
// Prefetch para melhorar desempenho
prefetch 2 9;
// ...
};
O parâmetro prefetch
faz com que o BIND renove automaticamente registros populares antes que expirem, reduzindo a latência para consultas frequentes.
Otimização de Consultas
Configure o BIND para otimizar o processamento de consultas:
1
2
3
4
5
6
7
8
9
10
11
options {
// Otimização de consultas
minimal-responses yes;
minimal-any yes;
// Limitar recursão
max-recursion-depth 10;
max-recursion-queries 100;
// ...
};
Otimização de Transferências de Zona
Para servidores com muitas zonas ou zonas grandes:
1
2
3
4
5
6
7
8
9
10
11
options {
// Otimização de transferências de zona
transfers-in 10;
transfers-out 10;
transfers-per-ns 2;
// Compressão de transferências
transfer-format many-answers;
// ...
};
Otimização de Sistema
Além da configuração do BIND, otimize o sistema operacional:
1
2
# Aumentar limites de arquivos abertos
sudo vi /etc/security/limits.conf
Adicione:
1
2
named soft nofile 16384
named hard nofile 32768
Ajuste parâmetros de rede:
1
sudo vi /etc/sysctl.conf
Adicione:
1
2
3
4
5
6
7
8
9
10
11
12
13
# Aumentar tamanho do buffer de recepção UDP
net.core.rmem_max = 8388608
net.core.rmem_default = 262144
# Aumentar tamanho do buffer de envio UDP
net.core.wmem_max = 8388608
net.core.wmem_default = 262144
# Aumentar número máximo de conexões pendentes
net.core.somaxconn = 4096
# Aumentar intervalo de portas efêmeras
net.ipv4.ip_local_port_range = 1024 65535
Aplique as alterações:
1
sudo sysctl -p
Automação e Gerenciamento
A automação é essencial para gerenciar servidores DNS de forma eficiente, especialmente em ambientes com múltiplos servidores ou muitas zonas.
Automação com Scripts
Crie scripts para tarefas comuns:
Script para Adicionar Nova 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
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
#!/bin/bash
# Script para adicionar nova zona DNS
# Parâmetros
DOMAIN=$1
IP_PRIMARY=$2
IP_SECONDARY=$3
ADMIN_EMAIL=$4
# Verificar parâmetros
if [ -z "$DOMAIN" ] || [ -z "$IP_PRIMARY" ] || [ -z "$IP_SECONDARY" ] || [ -z "$ADMIN_EMAIL" ]; then
echo "Uso: $0 dominio ip_primario ip_secundario email_admin"
exit 1
fi
# Criar arquivo de zona
cat > /var/named/zones/$DOMAIN.zone << EOF
\$TTL 86400
@ IN SOA ns1.$DOMAIN. $ADMIN_EMAIL. (
$(date +%Y%m%d01) ; Serial
10800 ; Refresh (3 hours)
3600 ; Retry (1 hour)
604800 ; Expire (1 week)
86400 ) ; Minimum TTL (1 day)
IN NS ns1.$DOMAIN.
IN NS ns2.$DOMAIN.
ns1 IN A $IP_PRIMARY
ns2 IN A $IP_SECONDARY
www IN A $IP_PRIMARY
EOF
# Definir permissões
chown root:named /var/named/zones/$DOMAIN.zone
chmod 640 /var/named/zones/$DOMAIN.zone
restorecon -v /var/named/zones/$DOMAIN.zone
# Adicionar zona ao named.conf
cat >> /etc/named.conf << EOF
zone "$DOMAIN" IN {
type master;
file "zones/$DOMAIN.zone";
allow-transfer { dns_servers; };
allow-update { none; };
};
EOF
# Verificar configuração
named-checkconf
if [ $? -ne 0 ]; then
echo "Erro na configuração. Revertendo alterações."
sed -i "/zone \"$DOMAIN\"/,/};/d" /etc/named.conf
rm -f /var/named/zones/$DOMAIN.zone
exit 1
fi
# Verificar zona
named-checkzone $DOMAIN /var/named/zones/$DOMAIN.zone
if [ $? -ne 0 ]; then
echo "Erro no arquivo de zona. Revertendo alterações."
sed -i "/zone \"$DOMAIN\"/,/};/d" /etc/named.conf
rm -f /var/named/zones/$DOMAIN.zone
exit 1
fi
# Recarregar configuração
rndc reload
echo "Zona $DOMAIN adicionada com sucesso."
Script para Monitoramento Diário
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
#!/bin/bash
# Script para monitoramento diário do servidor DNS
# Diretório para relatórios
REPORT_DIR="/var/log/dns_reports"
mkdir -p $REPORT_DIR
# Nome do arquivo de relatório
REPORT_FILE="$REPORT_DIR/dns_report_$(date +%Y%m%d).txt"
# Função para adicionar seção ao relatório
add_section() {
echo "=== $1 ===" >> $REPORT_FILE
echo >> $REPORT_FILE
eval "$2" >> $REPORT_FILE
echo >> $REPORT_FILE
}
# Iniciar relatório
echo "Relatório de Monitoramento DNS - $(date)" > $REPORT_FILE
echo "Servidor: $(hostname)" >> $REPORT_FILE
echo >> $REPORT_FILE
# Coletar informações
add_section "Status do Serviço" "systemctl status named | head -10"
add_section "Utilização de Recursos" "ps aux | grep named | grep -v grep"
add_section "Espaço em Disco" "df -h /var/named"
add_section "Estatísticas DNS" "rndc stats && cat /var/named/data/named_stats.txt"
add_section "Consultas por Domínio" "grep 'query:' /var/log/named/query.log | awk '{print \$6}' | sort | uniq -c | sort -nr | head -20"
add_section "Clientes Mais Ativos" "grep 'client' /var/log/named/query.log | awk '{print \$4}' | cut -d'#' -f1 | sort | uniq -c | sort -nr | head -20"
add_section "Erros Recentes" "grep 'error' /var/log/named/error.log | tail -20"
add_section "Eventos de Segurança" "grep -E 'denied|refused' /var/log/named/security.log | tail -20"
# Enviar relatório por email
mail -s "Relatório DNS Diário - $(hostname)" admin@example.com < $REPORT_FILE
# Manter apenas os últimos 30 relatórios
find $REPORT_DIR -name "dns_report_*.txt" -type f -mtime +30 -delete
Automação com Ansible
O Ansible é uma ferramenta poderosa para automação de infraestrutura:
Playbook para Configuração de Servidor DNS
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
105
106
107
108
109
110
111
112
113
114
115
---
- name: Configurar Servidor DNS BIND
hosts: dns_servers
become: yes
vars:
bind_listen_ipv4:
- "127.0.0.1"
- "192.168.200.49"
bind_allow_query:
- "localhost"
- "192.168.200.0/24"
bind_zones:
- name: "example.com"
type: "master"
file: "zones/example.com.zone"
allow_transfer:
- "192.168.200.50"
- name: "200.168.192.in-addr.arpa"
type: "master"
file: "zones/200.168.192.in-addr.arpa.zone"
allow_transfer:
- "192.168.200.50"
tasks:
- name: Instalar pacotes BIND
dnf:
name:
- bind
- bind-utils
state: present
- name: Criar diretórios para zonas
file:
path: "/var/named/{{ item }}"
state: directory
owner: root
group: named
mode: '0750'
loop:
- zones
- data
- name: Criar diretório para logs
file:
path: /var/log/named
state: directory
owner: named
group: named
mode: '0770'
- name: Configurar contextos SELinux
sefcontext:
target: "{{ item.target }}"
setype: "{{ item.setype }}"
state: present
loop:
- { target: '/var/named/zones(/.*)?', setype: 'named_zone_t' }
- { target: '/var/log/named(/.*)?', setype: 'named_log_t' }
- { target: '/var/named/data(/.*)?', setype: 'named_cache_t' }
notify: Restaurar contextos SELinux
- name: Configurar named.conf
template:
src: templates/named.conf.j2
dest: /etc/named.conf
owner: root
group: named
mode: '0640'
notify: Reiniciar BIND
- name: Configurar arquivos de zona
template:
src: "templates/{{ item.file | basename }}.j2"
dest: "/var/named/{{ item.file }}"
owner: root
group: named
mode: '0640'
loop: "{{ bind_zones }}"
notify: Recarregar BIND
- name: Configurar logrotate para BIND
template:
src: templates/named-logrotate.j2
dest: /etc/logrotate.d/named
owner: root
group: root
mode: '0644'
- name: Configurar firewall
firewalld:
service: dns
permanent: yes
state: enabled
notify: Recarregar firewall
- name: Habilitar e iniciar serviço BIND
systemd:
name: named
enabled: yes
state: started
handlers:
- name: Restaurar contextos SELinux
command: restorecon -Rv /var/named/zones /var/log/named /var/named/data
- name: Reiniciar BIND
systemd:
name: named
state: restarted
- name: Recarregar BIND
command: rndc reload
- name: Recarregar firewall
command: firewall-cmd --reload
Template para 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
// named.conf gerado por Ansible
options {
directory "/var/named";
listen-on port 53 {
{% for ip in bind_listen_ipv4 %}
{% raw %}{{ ip }};
{% endfor %}
};
listen-on-v6 port 53 { ::1; };
allow-query {
{% for net in bind_allow_query %}
{{ net }};
{% endfor %}
};
recursion yes;
allow-recursion {
{% for net in bind_allow_query %}
{{ net }};
{% endfor %}
};
dnssec-validation auto;
// Logging configuration
logging {
channel general_log {
file "/var/log/named/general.log" versions 3 size 5m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
channel security_log {
file "/var/log/named/security.log" versions 3 size 5m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
channel query_log {
file "/var/log/named/query.log" versions 3 size 10m;
severity info;
print-time yes;
};
channel error_log {
file "/var/log/named/error.log" versions 3 size 5m;
severity error;
print-time yes;
print-severity yes;
print-category yes;
};
category default { general_log; };
category general { general_log; };
category security { security_log; };
category queries { query_log; };
category client { general_log; };
category network { general_log; };
category dnssec { security_log; };
category resolver { error_log; };
};
};
// ACLs
acl "dns_servers" {
localhost;
{% for server in groups['dns_servers'] %}
{{ hostvars[server]['ansible_default_ipv4']['address'] }};
{% endfor %}
};
// Zone definitions
{% for zone in bind_zones %}
zone "{{ zone.name }}" IN {
type {{ zone.type }};
file "{{ zone.file }}";
{% if zone.allow_transfer is defined %}
allow-transfer {
{% for server in zone.allow_transfer %}
{{ server }};
{% endfor %}
};
{% else %}
allow-transfer { dns_servers; };
{% endif %}
allow-update { none; };
};
{% endfor %}
// Include standard zones
include "/etc/named.rfc1912.zones";
// Include DNSSEC root key
include "/etc/named.root.key";
Conclusão e Próximos Passos
Neste sexto artigo da série, exploramos técnicas avançadas de logging, monitoramento e troubleshooting para servidores DNS BIND no Oracle Linux 9. Abordamos desde a configuração detalhada de logging até ferramentas de monitoramento e métodos sistemáticos para diagnóstico e resolução de problemas.
Um servidor DNS bem monitorado e mantido é essencial para a confiabilidade e segurança da infraestrutura de rede. As técnicas e ferramentas apresentadas neste artigo ajudarão você a identificar e resolver problemas rapidamente, garantindo alta disponibilidade e desempenho para seus serviços DNS.
O que vem a seguir?
No próximo artigo, “Configurações Avançadas do BIND: Secundário, Chroot e Alta Disponibilidade”, abordaremos:
- Configuração de servidor DNS secundário (slave)
- Implementação de BIND em ambiente chroot
- Configuração de alta disponibilidade com DNS
- Otimização de desempenho para ambientes de alto tráfego
- Integração com DHCP para atualizações dinâmicas
- Configuração de views para diferentes VLANs/redes
- Implementação de políticas de resposta (RPZ)
- Estratégias de backup e recuperação
- Automação de configuração com ferramentas como Ansible
Não perca! Nossa jornada para dominar o DNS BIND no Oracle Linux 9 continua.
Referências e Recursos Adicionais
- Documentação oficial do BIND
- BIND 9 Administrator Reference Manual - Logging
- BIND 9 Administrator Reference Manual - Troubleshooting
- DNS and BIND, 5th Edition - Cricket Liu & Paul Albitz
- Pro DNS and BIND - Ron Aitchison
- Monitoring DNS with Prometheus and Grafana
- DNS Best Practices, Network Protections, and Attack Identification - CISA