Instalação e Configuração Básica do BIND no Oracle Linux 9
Este é o segundo artigo de nossa série sobre implementação e configuração do DNS BIND no Oracle Linux 9. No primeiro artigo, abordamos os conceitos fundamentais do DNS e a preparação do ambiente. Agora, vamos avançar para a instalação e configuração básica do servidor DNS.
Introdução
O BIND (Berkeley Internet Name Domain) é a implementação de servidor DNS mais utilizada na Internet, mantida pelo Internet Systems Consortium (ISC). Sua robustez, flexibilidade e conjunto completo de recursos o tornam a escolha preferida para administradores de sistemas em todo o mundo.
Neste artigo, vamos guiá-lo através do processo de instalação do BIND no Oracle Linux 9, explicar a estrutura de diretórios e arquivos, e configurar os componentes básicos necessários para um servidor DNS funcional. Ao final deste tutorial, você terá um servidor DNS básico em funcionamento, pronto para ser expandido com zonas e configurações avançadas nos próximos artigos da série.
Instalação do BIND no Oracle Linux 9
O BIND está disponível nos repositórios padrão do Oracle Linux 9, o que torna sua instalação bastante direta. Vamos começar com a instalação dos pacotes necessários.
Pacotes Necessários
Para uma instalação completa do servidor DNS, precisamos instalar dois pacotes principais:
- bind: O pacote principal do servidor DNS
- bind-utils: Ferramentas utilitárias como
dig
,host
,nslookup
e outras que são essenciais para testes e troubleshooting
Processo de Instalação
Abra um terminal e execute o seguinte comando com privilégios de superusuário:
1
sudo dnf install bind bind-utils -y
Este comando instala o BIND e suas ferramentas utilitárias, além de todas as dependências necessárias.
Verificação da Instalação
Após a instalação, podemos verificar a versão do BIND instalada:
1
named -v
Isso deve retornar algo como:
1
BIND 9.16.23 (Extended Support Version)
A versão exata pode variar dependendo das atualizações disponíveis no momento da instalação.
Pacotes Adicionais Opcionais
Dependendo das suas necessidades, você pode considerar a instalação destes pacotes adicionais:
- bind-chroot: Para executar o BIND em um ambiente chroot, aumentando a segurança
- bind-dnssec-utils: Ferramentas adicionais para gerenciamento de DNSSEC
- bind-devel: Bibliotecas e arquivos de cabeçalho para desenvolvimento
Para instalar qualquer um desses pacotes adicionais:
1
sudo dnf install bind-chroot bind-dnssec-utils -y
Estrutura de Diretórios e Arquivos do BIND
Antes de começar a configuração, é importante entender a estrutura de diretórios e arquivos utilizados pelo BIND no Oracle Linux 9. Isso nos ajudará a navegar e modificar os arquivos corretos durante a configuração.
Diretórios Principais
- /etc/named.conf: Arquivo principal de configuração
- /etc/named/: Diretório para arquivos de configuração adicionais
- /var/named/: Diretório para arquivos de zona
- /var/run/named/: Diretório para arquivos de runtime, como o PID do processo
- /var/log/: Diretório onde os logs serão armazenados (precisaremos criar um subdiretório específico)
Arquivos de Configuração Padrão
- /etc/named.conf: Arquivo principal de configuração
- /etc/named.rfc1912.zones: Definições de zonas padrão (localhost, etc.)
- /etc/named.root.key: Chave raiz para DNSSEC
- /etc/rndc.key: Chave para o utilitário rndc (Remote Name Daemon Control)
Arquivos de Zona Padrão
- /var/named/named.ca: Arquivo de dicas (hints) para servidores raiz
- /var/named/named.localhost: Zona para localhost
- /var/named/named.loopback: Zona reversa para 127.0.0.1
- /var/named/named.empty: Zona vazia para configurações específicas
Diretórios para Nossa Configuração
Vamos criar uma estrutura organizada para nossos arquivos de zona:
1
2
3
4
5
6
7
8
9
10
11
12
# Criar diretório para zonas
sudo mkdir -p /var/named/zones
# Criar diretórios para zonas internas e externas (para views)
sudo mkdir -p /var/named/zones/internal
sudo mkdir -p /var/named/zones/external
# Criar diretório para logs
sudo mkdir -p /var/log/named
# Criar diretório para dados dinâmicos
sudo mkdir -p /var/named/dynamic
/
|-- etc/
| |-- named.conf (Arquivo principal de configuração)
| |-- named/ (Arquivos de configuração adicionais)
| | |-- named.rfc1912.zones
| | `-- named.root.key
| `-- rndc.key (Chave RNDC)
|
|-- var/
| |-- named/ (Diretório de dados BIND)
| | |-- named.ca
| | |-- named.localhost
| | |-- named.loopback
| | |-- named.empty
| | |-- zones/ (Nossas zonas)
| | | |-- internal/
| | | `-- external/
| | |-- data/ (Arquivos de estatísticas, etc.)
| | `-- dynamic/ (Chaves dinâmicas, etc.)
| |
| |-- run/
| | `-- named/ (Arquivos de runtime)
| | |-- named.pid
| | `-- session.key
| |
| `-- log/
| `-- named/ (Nossos logs)
| |-- general.log
| |-- security.log
| `-- query.log
Figura 1: Estrutura de diretórios e arquivos do BIND
Permissões e Propriedade
É importante definir as permissões e propriedades corretas para esses diretórios:
1
2
3
4
5
6
7
8
9
10
11
# Definir propriedade para diretórios de zona
sudo chown -R root:named /var/named/zones
sudo chmod -R 750 /var/named/zones
# Definir propriedade para diretório de logs
sudo chown -R named:named /var/log/named
sudo chmod 770 /var/log/named
# Definir propriedade para diretório dinâmico
sudo chown -R named:named /var/named/dynamic
sudo chmod 770 /var/named/dynamic
Contextos SELinux
Como mencionamos no artigo anterior, o SELinux é uma parte importante da segurança no Oracle Linux 9. Precisamos configurar os contextos SELinux corretos para nossos diretórios:
1
2
3
4
5
6
7
8
9
10
11
# Configurar contexto SELinux para diretórios de zona
sudo semanage fcontext -a -t named_zone_t "/var/named/zones(/.*)?"
sudo restorecon -Rv /var/named/zones
# Configurar contexto SELinux para diretório de logs
sudo semanage fcontext -a -t named_log_t "/var/log/named(/.*)?"
sudo restorecon -Rv /var/log/named
# Configurar contexto SELinux para diretório dinâmico
sudo semanage fcontext -a -t named_cache_t "/var/named/dynamic(/.*)?"
sudo restorecon -Rv /var/named/dynamic
Backup da Configuração Padrão
Antes de realizar qualquer alteração, é uma boa prática fazer backup do arquivo de configuração original. Isso permite reverter facilmente caso algo dê errado:
1
sudo cp /etc/named.conf{,"_$(date +%Y-%m-%d)"}
Este comando cria uma cópia do arquivo /etc/named.conf
com um sufixo contendo a data atual, por exemplo: /etc/named.conf_2025-05-18
.
Configuração Básica do named.conf
O arquivo /etc/named.conf
é o coração da configuração do BIND. Vamos criar uma configuração básica que servirá como fundação para as configurações mais avançadas nos próximos artigos.
Estrutura do Arquivo de Configuração
O arquivo de configuração do BIND utiliza uma sintaxe específica com blocos delimitados por chaves {}
e instruções terminadas por ponto e vírgula ;
. A estrutura básica inclui:
- Definições de ACLs: Agrupamentos de endereços IP ou redes
- Bloco options: Configurações globais do servidor
- Configuração de logging: Definição de canais e categorias de log
- Definições de zonas: Configuração das zonas DNS gerenciadas pelo servidor
Configuração Inicial
Vamos criar uma configuração básica que inclui:
- ACLs para controle de acesso
- Opções globais
- Configuração de logging
- Zonas básicas
Abra o arquivo de configuração:
1
sudo vi /etc/named.conf
E substitua seu conteúdo pelo seguinte:
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
// named.conf for BIND DNS Server on Oracle Linux 9
// Basic configuration
// ================================================================================
// ACLs - Access Control Lists
// ================================================================================
acl "trusted" {
localhost;
192.168.200.0/24; // Substitua pela sua rede local
};
// ================================================================================
// Options
// ================================================================================
options {
// Directory for relative paths
directory "/var/named";
// Listen on specific interfaces and ports
listen-on port 53 {
127.0.0.1;
192.168.200.49; // Substitua pelo IP do seu servidor
};
listen-on-v6 port 53 { ::1; };
// Files for statistics, dump and dynamic managed keys
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";
// Hide version to prevent reconnaissance
version none;
hostname none;
server-id none;
// DNSSEC configuration
dnssec-validation auto;
// Directory for dynamic managed keys
managed-keys-directory "/var/named/dynamic";
// PID and session key files
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
// Access control
allow-query { trusted; };
allow-transfer { none; };
allow-update { none; };
// Recursion control
recursion yes;
allow-recursion { trusted; };
// Include crypto policies
include "/etc/crypto-policies/back-ends/bind.config";
};
// ================================================================================
// Logging Configuration
// ================================================================================
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
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;
};
category default { general_log; };
category general { general_log; };
category security { security_log; };
category queries { query_log; };
};
// ================================================================================
// Basic Zones
// ================================================================================
// Root hints zone
zone "." IN {
type hint;
file "named.ca";
};
// Include standard zones
include "/etc/named.rfc1912.zones";
// Include DNSSEC root key
include "/etc/named.root.key";
Explicação da Configuração
Vamos analisar cada seção da configuração:
ACLs (Access Control Lists)
1
2
3
4
acl "trusted" {
localhost;
192.168.200.0/24; // Substitua pela sua rede local
};
Esta ACL define quais redes são consideradas confiáveis. Neste caso, incluímos o localhost e a rede 192.168.200.0/24. Você deve substituir este endereço pela sua rede local.
Bloco Options
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
options {
directory "/var/named";
listen-on port 53 {
127.0.0.1;
192.168.200.49; // Substitua pelo IP do seu servidor
};
listen-on-v6 port 53 { ::1; };
// ... outras opções ...
allow-query { trusted; };
allow-transfer { none; };
allow-update { none; };
recursion yes;
allow-recursion { trusted; };
// ... outras opções ...
};
As principais opções configuradas são:
- directory: Define o diretório base para arquivos relativos
- listen-on e listen-on-v6: Definem as interfaces e portas em que o servidor escutará
- allow-query: Define quem pode fazer consultas ao servidor (usando a ACL “trusted”)
- allow-transfer: Define quem pode solicitar transferências de zona (neste caso, ninguém)
- allow-update: Define quem pode atualizar zonas dinamicamente (neste caso, ninguém)
- recursion e allow-recursion: Habilitam recursão apenas para clientes confiáveis
Configuração de Logging
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
channel general_log {
file "/var/log/named/general.log" versions 3 size 5m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
// ... outros canais ...
category default { general_log; };
category general { general_log; };
category security { security_log; };
category queries { query_log; };
};
Esta configuração define vários canais de log e associa categorias de eventos a esses canais:
- general_log: Para mensagens gerais
- security_log: Para eventos relacionados à segurança
- query_log: Para registrar consultas DNS
Zonas Básicas
1
2
3
4
5
6
7
8
9
10
11
// Root hints zone
zone "." IN {
type hint;
file "named.ca";
};
// Include standard zones
include "/etc/named.rfc1912.zones";
// Include DNSSEC root key
include "/etc/named.root.key";
Esta seção define:
- A zona de dicas (hints) para os servidores raiz
- Inclui as zonas padrão definidas em
/etc/named.rfc1912.zones
(localhost, etc.) - Inclui a chave raiz para DNSSEC
Verificação da Sintaxe da Configuração
Antes de iniciar o serviço, é crucial verificar a sintaxe da configuração para evitar problemas:
1
sudo named-checkconf
Se não houver saída, a sintaxe está correta. Caso contrário, o comando mostrará erros que precisam ser corrigidos.
Para uma verificação mais detalhada, que também carrega e verifica os arquivos de zona:
1
sudo named-checkconf -z
Configuração do Firewall
Para que o servidor DNS seja acessível pela rede, precisamos configurar o firewall para permitir o tráfego DNS:
1
2
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload
Verifique se a regra foi adicionada corretamente:
1
sudo firewall-cmd --list-all
Você deve ver “dns” listado nos serviços permitidos.
Inicialização e Gerenciamento do Serviço
Agora que temos uma configuração básica, podemos iniciar o serviço BIND.
Habilitando o Serviço
Para garantir que o serviço BIND inicie automaticamente na inicialização do sistema:
1
sudo systemctl enable named
Iniciando o Serviço
Para iniciar o serviço BIND:
1
sudo systemctl start named
Verificando o Status do Serviço
Para verificar se o serviço está em execução:
1
sudo systemctl status named
Isso mostrará o status atual do serviço, incluindo quaisquer erros recentes. A saída deve indicar que o serviço está ativo (running).
Verificando Logs
Verifique os logs para garantir que o serviço iniciou corretamente:
1
sudo tail -f /var/log/named/general.log
Verificando Portas
Verifique se o BIND está escutando nas portas e interfaces corretas:
1
sudo ss -tulpn | grep named
Você deve ver o processo named escutando na porta 53 (TCP e UDP) nos endereços IP configurados.
+-----------------------------+
| Início |
+-------------+---------------+
|
V
+-------------+---------------+
| Editar /etc/named.conf |
+-------------+---------------+
|
V
+-------------+---------------+
| Executar named-checkconf | ----> [Erro?] --(Sim)--> Corrigir named.conf
+-------------+---------------+
| (Não)
V
+-------------+---------------+
| Configurar Firewall (dns) |
| (firewall-cmd --add-service)|
+-------------+---------------+
|
V
+-------------+---------------+
| Habilitar Serviço |
| (systemctl enable named) |
+-------------+---------------+
|
V
+-------------+---------------+
| Iniciar Serviço |
| (systemctl start named) |
+-------------+---------------+
|
V
+-------------+---------------+
| Verificar Status |
| (systemctl status named) | ----> [Erro?] --(Sim)--> Analisar Logs/Erros
+-------------+---------------+
| (Não - Ativo)
V
+-------------+---------------+
| Verificar Logs |
| (tail /var/log/named/...) |
+-------------+---------------+
|
V
+-------------+---------------+
| Verificar Portas (ss) |
+-------------+---------------+
|
V
+-----------------------------+
| Configuração Básica OK |
+-----------------------------+
Figura 2: Fluxograma de Verificação de Configuração e Inicialização do BIND
Configuração do Resolver Local
Para testar o servidor DNS localmente, configure o resolver para usar o servidor local:
1
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
Para tornar esta configuração persistente (evitando que seja sobrescrita por NetworkManager):
1
sudo chattr +i /etc/resolv.conf
Nota: Em um ambiente de produção, você pode preferir configurar o NetworkManager para usar seu servidor DNS local de forma persistente, em vez de usar o comando
chattr
.
Testes Básicos
Vamos realizar alguns testes básicos para verificar se o servidor DNS está funcionando corretamente.
Teste de Resolução de Localhost
1
dig localhost
Você deve ver uma resposta como:
1
2
;; ANSWER SECTION:
localhost. 86400 IN A 127.0.0.1
Teste de Resolução Reversa
1
dig -x 127.0.0.1
Isso deve retornar:
1
2
;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 86400 IN PTR localhost.
Teste de Resolução Externa
1
dig google.com
Se a recursão estiver funcionando corretamente, você deve receber os endereços IP do Google.
Configuração de ACLs Avançadas
As ACLs (Access Control Lists) são uma ferramenta poderosa no BIND para controlar o acesso a diferentes funcionalidades. Vamos expandir nossa configuração de ACLs para um cenário mais realista.
Exemplo de ACLs Expandidas
Edite o arquivo /etc/named.conf
e substitua a seção de ACLs por:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ================================================================================
// ACLs - Access Control Lists
// ================================================================================
acl "internal_networks" {
localhost;
192.168.200.0/24; // Rede principal
10.10.0.0/16; // Rede VPN
};
acl "dmz_networks" {
172.16.0.0/24; // Rede DMZ
};
acl "dns_servers" {
192.168.200.49; // Este servidor (primário)
192.168.200.50; // Servidor secundário
};
Aplicando ACLs na Configuração
Agora, atualize o bloco options para usar estas ACLs:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
options {
// ... outras opções ...
// Access control
allow-query { internal_networks; dmz_networks; };
allow-transfer { dns_servers; };
allow-update { none; };
// Recursion control
recursion yes;
allow-recursion { internal_networks; };
// ... outras opções ...
};
Esta configuração:
- Permite consultas de redes internas e DMZ
- Permite transferências de zona apenas para servidores DNS específicos
- Restringe recursão apenas para redes internas
Configuração de Rate Limiting
O rate limiting é uma funcionalidade importante para proteger seu servidor DNS contra ataques de amplificação e outros tipos de abuso. Vamos adicionar configuração de rate limiting ao bloco options:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
options {
// ... outras opções ...
// Rate limiting configuration
rate-limit {
responses-per-second 10;
window 5;
qps-scale 250;
errors-per-second 5;
nxdomains-per-second 5;
slip 2;
};
// ... outras opções ...
};
Esta configuração:
- Limita o servidor a 10 respostas por segundo por cliente
- Define uma janela de 5 segundos para cálculo da média
- Escala o limite baseado na carga do servidor
- Limita respostas de erro e NXDOMAIN a 5 por segundo
- Define o valor “slip” para 2, o que significa que a cada 2 consultas acima do limite, 1 será respondida
Configuração de Estatísticas
O BIND pode gerar estatísticas detalhadas que são úteis para monitoramento e troubleshooting. Vamos habilitar esta funcionalidade:
1
2
3
4
5
6
7
8
9
options {
// ... outras opções ...
// Statistics configuration
statistics-file "/var/named/data/named_stats.txt";
zone-statistics yes;
// ... outras opções ...
};
Para gerar estatísticas a qualquer momento:
1
sudo rndc stats
As estatísticas serão escritas no arquivo /var/named/data/named_stats.txt
.
Configuração de RNDC (Remote Name Daemon Control)
O RNDC é uma ferramenta poderosa para controlar o servidor BIND remotamente. Vamos configurá-lo adequadamente:
1
2
3
4
5
6
7
8
9
10
11
12
// ================================================================================
// RNDC Configuration
// ================================================================================
controls {
inet 127.0.0.1 port 953
allow { localhost; } keys { "rndc-key"; };
};
key "rndc-key" {
algorithm hmac-sha256;
secret "base64-encoded-secret";
};
Para gerar uma chave RNDC segura:
1
sudo rndc-confgen -a -c /etc/rndc.key
Este comando gera uma chave aleatória e a salva em /etc/rndc.key
. Você pode então incluir este arquivo na sua configuração:
1
include "/etc/rndc.key";
Troubleshooting Comum
Mesmo com uma configuração cuidadosa, problemas podem surgir. Aqui estão algumas situações comuns e como resolvê-las:
Problema: O Serviço Não Inicia
Verificação:
1
sudo systemctl status named
Possíveis soluções:
- Verifique erros de sintaxe:
sudo named-checkconf
- Verifique permissões:
ls -la /var/named/
- Verifique logs:
sudo journalctl -xe
Problema: Erros de Permissão
Verificação:
1
sudo grep "permission denied" /var/log/named/general.log
Possíveis soluções:
- Corrigir permissões:
sudo chown -R named:named /var/log/named
- Verificar contextos SELinux:
sudo ls -Z /var/named/
- Ajustar boolean SELinux:
sudo setsebool -P named_write_master_zones 1
Problema: Servidor Não Responde a Consultas
Verificação:
1
dig @127.0.0.1 localhost
Possíveis soluções:
- Verificar configuração de firewall:
sudo firewall-cmd --list-all
- Verificar interfaces de escuta:
sudo ss -tulpn | grep named
- Verificar ACLs na configuração
Problema: Recursão Não Funciona
Verificação:
1
dig @127.0.0.1 google.com
Possíveis soluções:
- Verificar se recursão está habilitada:
grep recursion /etc/named.conf
- Verificar ACLs de recursão:
grep allow-recursion /etc/named.conf
- Verificar conectividade com a Internet:
ping 8.8.8.8
Monitoramento Básico
Para um servidor DNS em produção, é essencial configurar monitoramento básico:
Monitoramento de Logs
Configure rotação de logs para evitar que cresçam indefinidamente:
1
sudo vi /etc/logrotate.d/named
Adicione:
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
}
Monitoramento de Serviço
Configure verificações básicas de saúde:
1
2
3
4
5
# Verificar se o serviço está em execução
systemctl is-active named
# Verificar se o processo está respondendo
dig @127.0.0.1 localhost +short
Estas verificações podem ser incorporadas a sistemas de monitoramento como Nagios, Zabbix ou Prometheus.
Conclusão e Próximos Passos
Neste segundo artigo da série, instalamos o BIND no Oracle Linux 9, configuramos sua estrutura básica, definimos ACLs para controle de acesso, configuramos logging e realizamos testes iniciais. Agora temos um servidor DNS funcional, embora ainda sem zonas personalizadas.
A configuração que criamos serve como uma base sólida para as configurações mais avançadas que abordaremos nos próximos artigos da série.
O que vem a seguir?
No próximo artigo, “Configuração de Zonas DNS no BIND”, abordaremos:
- Criação de zonas diretas (forward zones)
- Configuração de zonas reversas (reverse zones)
- Sintaxe e estrutura de arquivos de zona
- Registros SOA, NS, A, AAAA, MX, CNAME, TXT
- Verificação e testes de zonas
Não perca! Nossa jornada para dominar o DNS BIND no Oracle Linux 9 continua.