Views e DNS Split-Horizon no BIND
Este é o quarto 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 e a configuração de zonas DNS. Agora, vamos explorar um dos recursos mais poderosos do BIND: as views e a implementação de DNS Split-Horizon.
Introdução
Em muitos ambientes de rede, especialmente em organizações com presença na Internet, é comum a necessidade de apresentar diferentes respostas DNS dependendo da origem da consulta. Por exemplo, um servidor web pode ser acessado internamente pelo endereço IP privado 192.168.200.10, mas externamente pelo endereço IP público 203.0.113.10.
O BIND oferece um recurso poderoso chamado “views” (visões) que permite configurar exatamente esse comportamento. Com views, você pode definir diferentes “visões” do seu espaço DNS, apresentando informações diferentes para consultas internas e externas. Esta técnica é conhecida como DNS Split-Horizon ou Split-View DNS.
Neste artigo, vamos explorar em detalhes como implementar views no BIND, configurar DNS Split-Horizon e garantir que as consultas sejam respondidas corretamente dependendo de sua origem.
Conceito e Benefícios das Views no BIND
As views no BIND permitem definir diferentes conjuntos de zonas e opções de configuração que serão apresentados a diferentes clientes com base em critérios como endereço IP de origem, porta, TSIG key ou outros atributos.
O que são Views?
Uma view é essencialmente um contexto de resolução DNS. Cada view pode conter:
- Seu próprio conjunto de zonas
- Suas próprias opções de configuração
- Suas próprias ACLs (Access Control Lists)
- Suas próprias regras de recursão
O BIND processa as views na ordem em que aparecem no arquivo de configuração, e a primeira view que corresponde aos critérios do cliente é a que será usada para responder à consulta.
Benefícios das Views
A implementação de views oferece diversos benefícios:
1. Segurança e Privacidade
- Oculta informações internas de consultas externas
- Limita a exposição da topologia de rede interna
- Reduz a superfície de ataque ao expor apenas o necessário
2. Flexibilidade Operacional
- Permite manter servidores internos e externos em uma única infraestrutura DNS
- Facilita a migração e manutenção de serviços
- Permite implementar políticas diferentes para diferentes redes
3. Otimização de Tráfego
- Direciona usuários para servidores mais próximos ou menos carregados
- Implementa balanceamento de carga baseado na origem da consulta
- Otimiza o roteamento de tráfego para diferentes datacenters
4. Conformidade e Requisitos Específicos
- Atende a requisitos regulatórios de separação de ambientes
- Implementa políticas específicas para diferentes departamentos ou filiais
- Adapta respostas DNS para diferentes provedores de serviços
DNS Split-Horizon: Conceito e Casos de Uso
O DNS Split-Horizon (também conhecido como Split-View DNS, Split-Brain DNS ou Horizon Splitting) é uma técnica que utiliza views para fornecer diferentes respostas DNS dependendo da origem da consulta.
Conceito Básico
No DNS Split-Horizon, o mesmo nome de domínio é resolvido para diferentes endereços IP ou recursos, dependendo de onde a consulta se origina:
- Consultas de redes internas recebem respostas com endereços IP privados e informações completas sobre recursos internos
- Consultas de redes externas (Internet) recebem respostas com endereços IP públicos e apenas informações sobre recursos acessíveis externamente
Casos de Uso Comuns
1. Acesso a Serviços Internos e Externos
Um cenário típico é um servidor web que precisa ser acessível tanto interna quanto externamente:
- Internamente: www.example.com → 192.168.200.10 (acesso direto via rede local)
- Externamente: www.example.com → 203.0.113.10 (acesso via Internet)
Isso otimiza o tráfego, evitando que usuários internos saiam para a Internet e voltem para acessar um servidor local.
2. Serviços Exclusivamente Internos
Alguns serviços devem ser acessíveis apenas internamente, como servidores de banco de dados, sistemas de gerenciamento interno, etc.:
- Internamente: db.example.com → 192.168.200.30
- Externamente: db.example.com → NXDOMAIN (domínio inexistente)
Isso aumenta a segurança ao ocultar completamente serviços internos de consultas externas.
3. Ambientes de Desenvolvimento e Teste
Organizações com ambientes de desenvolvimento, teste e produção podem usar Split-Horizon para direcionar usuários para o ambiente apropriado:
- Desenvolvedores: api.example.com → servidor de desenvolvimento
- Testadores: api.example.com → servidor de teste
- Usuários externos: api.example.com → servidor de produção
4. Filiais e Escritórios Remotos
Empresas com múltiplas filiais podem implementar views específicas para cada localidade:
- Filial A: intranet.example.com → servidor local da Filial A
- Filial B: intranet.example.com → servidor local da Filial B
- Sede: intranet.example.com → servidor central da Sede
Planejamento para Implementação de Views
Antes de começar a configuração, é essencial planejar cuidadosamente a implementação de views. Um bom planejamento evita problemas futuros e facilita a manutenção.
Identificação de Redes e Clientes
Primeiro, identifique as diferentes redes e grupos de clientes que precisarão de views específicas:
- Redes Internas: LANs, VPNs, redes de gerenciamento
- Redes DMZ: Servidores expostos parcialmente
- Redes Externas: Internet e parceiros externos
- Redes Especiais: Ambientes de desenvolvimento, teste, etc.
Definição de ACLs
Para cada grupo de clientes, defina ACLs (Access Control Lists) que serão usadas para identificá-los:
1
2
3
4
5
6
7
8
9
10
11
12
13
acl "internal_networks" {
localhost;
192.168.0.0/16; // Redes corporativas
10.0.0.0/8; // Redes VPN
};
acl "dmz_networks" {
172.16.0.0/24; // Rede DMZ
};
acl "external_networks" {
any; // Qualquer endereço não correspondente às ACLs anteriores
};
Planejamento de Zonas
Para cada view, determine quais zonas serão incluídas e como serão configuradas:
- View Interna:
- Zonas diretas com endereços IP privados
- Zonas reversas para redes internas
- Zonas para serviços exclusivamente internos
- View DMZ:
- Zonas diretas com mix de endereços privados e públicos
- Zonas reversas para a rede DMZ
- Acesso limitado a serviços internos
- View Externa:
- Zonas diretas apenas com endereços IP públicos
- Zonas reversas para endereços IP públicos
- Sem acesso a serviços exclusivamente internos
Considerações de Segurança
Planeje aspectos de segurança como:
- Quais views terão recursão habilitada
- Quais views permitirão transferências de zona
- Como serão implementadas atualizações dinâmicas em cada view
- Se DNSSEC será implementado e como será gerenciado em diferentes views
Configuração Básica de Views no BIND
Agora que temos um plano, vamos implementar a configuração básica de views no BIND.
Estrutura do Arquivo named.conf com Views
A estrutura básica do arquivo named.conf com views é a 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
// ACLs globais
acl "internal_networks" { ... };
acl "dmz_networks" { ... };
// Opções globais (aplicadas a todas as views)
options {
directory "/var/named";
// Outras opções globais
};
// View interna
view "internal" {
match-clients { internal_networks; };
// Opções específicas da view interna
recursion yes;
// Zonas da view interna
zone "example.com" { ... };
zone "168.192.in-addr.arpa" { ... };
};
// View DMZ
view "dmz" {
match-clients { dmz_networks; };
// Opções específicas da view DMZ
recursion yes;
// Zonas da view DMZ
zone "example.com" { ... };
zone "16.172.in-addr.arpa" { ... };
};
// View externa
view "external" {
match-clients { any; };
// Opções específicas da view externa
recursion no;
// Zonas da view externa
zone "example.com" { ... };
zone "113.0.203.in-addr.arpa" { ... };
};
Diretiva match-clients
A diretiva match-clients
é o coração da configuração de views. Ela determina quais clientes correspondem a cada view:
1
2
3
4
view "internal" {
match-clients { internal_networks; };
// ...
};
Além de ACLs, você pode usar endereços IP individuais, blocos CIDR, e até mesmo a negação com “!”:
1
2
3
4
view "special" {
match-clients { 192.168.10.0/24; !192.168.10.100; };
// ...
};
Ordem das Views
A ordem das views no arquivo de configuração é crucial. O BIND processa as views na ordem em que aparecem, e a primeira view que corresponde aos critérios do cliente é a que será usada.
Por isso, é importante definir as views mais específicas primeiro, e as mais genéricas por último:
- Views para redes ou hosts específicos
- View para redes internas
- View para redes DMZ
- View externa (geralmente usando
match-clients { any; }
)
Implementação de DNS Split-Horizon
Vamos implementar um DNS Split-Horizon completo para o domínio example.com, com views interna e externa.
+-----------------+ Consulta www.example.com +-----------------------+
| Cliente Interno | ---------------------------> | Servidor BIND |
| (192.168.200.5) | | (IP: 192.168.200.49 / |
+-----------------+ | 203.0.113.49) |
+-----------+-----------+
| match-clients { internal_networks; }
V
+-------------+
| View: |
| "internal" |
+-------------+
| Lê /var/named/zones/internal/example.com.zone
V
+-------------+
| Resposta: |
| 192.168.200.10 |
+-------------+
|
V
+-----------------+ Consulta www.example.com +-----------+-----------+
| Cliente Externo | ---------------------------> | Servidor BIND |
| (8.8.8.8) | | (IP: 192.168.200.49 / |
+-----------------+ | 203.0.113.49) |
+-----------+-----------+
| match-clients { any; } (Não correspondeu a "internal")
V
+-------------+
| View: |
| "external" |
+-------------+
| Lê /var/named/zones/external/example.com.zone
V
+-------------+
| Resposta: |
| 203.0.113.10 |
+-------------+
Figura 1: Diagrama detalhado de DNS Split-Horizon com Views
Estrutura de Diretórios
Primeiro, vamos garantir que temos a estrutura de diretórios adequada:
1
2
3
4
5
6
sudo mkdir -p /var/named/zones/internal
sudo mkdir -p /var/named/zones/external
sudo chown -R root:named /var/named/zones
sudo chmod -R 750 /var/named/zones
sudo restorecon -Rv /var/named/zones
Configuração do named.conf
Agora, vamos editar o arquivo /etc/named.conf
:
1
sudo vi /etc/named.conf
Substitua o conteúdo por:
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
// named.conf for BIND DNS Server on Oracle Linux 9
// Configuration with Split-Horizon DNS
// ================================================================================
// ACLs - Access Control Lists
// ================================================================================
acl "internal_networks" {
localhost;
192.168.200.0/24; // Rede principal
10.10.0.0/16; // Rede VPN
};
acl "dns_servers" {
192.168.200.49; // Este servidor (primário)
192.168.200.50; // Servidor secundário
};
// ================================================================================
// 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; // IP interno
203.0.113.49; // IP público
};
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";
// 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; };
};
// ================================================================================
// View for Internal Networks
// ================================================================================
view "internal" {
match-clients { internal_networks; };
// Access control for internal view
allow-query { internal_networks; };
allow-transfer { dns_servers; };
allow-update { none; };
// Recursion settings
recursion yes;
allow-recursion { internal_networks; };
// Forward zone for example.com (internal view)
zone "example.com" IN {
type master;
file "zones/internal/example.com.zone";
allow-transfer { dns_servers; };
allow-update { none; };
};
// Reverse zone for 192.168.200.0/24 (internal network)
zone "200.168.192.in-addr.arpa" IN {
type master;
file "zones/internal/200.168.192.in-addr.arpa.zone";
allow-transfer { dns_servers; };
allow-update { none; };
};
// Reverse zone for 10.10.0.0/16 (VPN network)
zone "10.10.in-addr.arpa" IN {
type master;
file "zones/internal/10.10.in-addr.arpa.zone";
allow-transfer { dns_servers; };
allow-update { none; };
};
// Include standard zones
include "/etc/named.rfc1912.zones";
// Root hints zone
zone "." IN {
type hint;
file "named.ca";
};
// Include DNSSEC root key
include "/etc/named.root.key";
};
// ================================================================================
// View for External Networks
// ================================================================================
view "external" {
match-clients { any; };
// Access control for external view
allow-query { any; };
allow-transfer { dns_servers; };
allow-update { none; };
// Recursion settings (disabled for external clients)
recursion no;
// Forward zone for example.com (external view)
zone "example.com" IN {
type master;
file "zones/external/example.com.zone";
allow-transfer { dns_servers; };
allow-update { none; };
};
// Reverse zone for 203.0.113.0/24 (public IP range)
zone "113.0.203.in-addr.arpa" IN {
type master;
file "zones/external/113.0.203.in-addr.arpa.zone";
allow-transfer { dns_servers; };
allow-update { none; };
};
// Root hints zone
zone "." IN {
type hint;
file "named.ca";
};
// Include DNSSEC root key
include "/etc/named.root.key";
};
Explicação da Configuração
Vamos analisar os principais elementos desta configuração:
ACLs
1
2
3
4
5
acl "internal_networks" {
localhost;
192.168.200.0/24; // Rede principal
10.10.0.0/16; // Rede VPN
};
Esta ACL define quais redes são consideradas internas. Consultas dessas redes serão respondidas pela view “internal”.
View Interna
1
2
3
4
5
6
7
8
9
10
11
12
13
14
view "internal" {
match-clients { internal_networks; };
// Access control for internal view
allow-query { internal_networks; };
allow-transfer { dns_servers; };
allow-update { none; };
// Recursion settings
recursion yes;
allow-recursion { internal_networks; };
// Zonas...
};
Esta view:
- Corresponde a clientes das redes internas
- Permite consultas apenas de redes internas
- Permite transferências de zona apenas para servidores DNS específicos
- Habilita recursão para clientes internos
View Externa
1
2
3
4
5
6
7
8
9
10
11
12
13
view "external" {
match-clients { any; };
// Access control for external view
allow-query { any; };
allow-transfer { dns_servers; };
allow-update { none; };
// Recursion settings (disabled for external clients)
recursion no;
// Zonas...
};
Esta view:
- Corresponde a qualquer cliente que não corresponda a views anteriores
- Permite consultas de qualquer origem
- Permite transferências de zona apenas para servidores DNS específicos
- Desabilita recursão para clientes externos (importante para segurança)
Criação dos Arquivos de Zona para a View Interna
Agora, vamos criar os arquivos de zona para a view interna.
Zona Direta (example.com) - View Interna
1
sudo vi /var/named/zones/internal/example.com.zone
Adicione o seguinte conteúdo:
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
; Zone file for example.com - INTERNAL VIEW
$TTL 86400 ; 1 day default TTL
$ORIGIN example.com.
; SOA Record
@ IN SOA ns1.example.com. admin.example.com. (
2025052001 ; Serial
10800 ; Refresh (3 hours)
3600 ; Retry (1 hour)
604800 ; Expire (1 week)
86400 ; Minimum TTL (1 day)
)
; NS Records
IN NS ns1.example.com.
IN NS ns2.example.com.
; MX Records
IN MX 10 mail.example.com.
IN MX 20 mail2.example.com.
; A Records for Name Servers
ns1 IN A 192.168.200.49
ns2 IN A 192.168.200.50
; A Records for Mail Servers
mail IN A 192.168.200.20
mail2 IN A 192.168.200.21
; A Records for Web Servers
www IN A 192.168.200.10
IN A 192.168.200.11 ; Round-robin DNS for load balancing
; A Records for Internal Services
intranet IN A 192.168.200.15
db IN A 192.168.200.30
ldap IN A 192.168.200.31
kdc IN A 192.168.200.32
monitor IN A 192.168.200.40
; AAAA Records (IPv6)
ns1 IN AAAA 2001:db8::49
ns2 IN AAAA 2001:db8::50
www IN AAAA 2001:db8::10
mail IN AAAA 2001:db8::20
; CNAME Records
ftp IN CNAME www
webmail IN CNAME mail
; TXT Records
@ IN TXT "v=spf1 mx ip4:192.168.200.0/24 -all"
_dmarc IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com"
; SRV Records
_ldap._tcp IN SRV 0 1 389 ldap.example.com.
_kerberos._udp IN SRV 0 1 88 kdc.example.com.
Zona Reversa (192.168.200.0/24) - View Interna
1
sudo vi /var/named/zones/internal/200.168.192.in-addr.arpa.zone
Adicione o seguinte conteúdo:
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
; Reverse zone file for 192.168.200.0/24 - INTERNAL VIEW
$TTL 86400 ; 1 day default TTL
$ORIGIN 200.168.192.in-addr.arpa.
; SOA Record
@ IN SOA ns1.example.com. admin.example.com. (
2025052001 ; Serial
10800 ; Refresh (3 hours)
3600 ; Retry (1 hour)
604800 ; Expire (1 week)
86400 ; Minimum TTL (1 day)
)
; NS Records
IN NS ns1.example.com.
IN NS ns2.example.com.
; PTR Records
10 IN PTR www.example.com.
11 IN PTR www.example.com.
15 IN PTR intranet.example.com.
20 IN PTR mail.example.com.
21 IN PTR mail2.example.com.
30 IN PTR db.example.com.
31 IN PTR ldap.example.com.
32 IN PTR kdc.example.com.
40 IN PTR monitor.example.com.
49 IN PTR ns1.example.com.
50 IN PTR ns2.example.com.
Zona Reversa (10.10.0.0/16) - View Interna
1
sudo vi /var/named/zones/internal/10.10.in-addr.arpa.zone
Adicione o seguinte conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; Reverse zone file for 10.10.0.0/16 - INTERNAL VIEW
$TTL 86400 ; 1 day default TTL
$ORIGIN 10.10.in-addr.arpa.
; SOA Record
@ IN SOA ns1.example.com. admin.example.com. (
2025052001 ; Serial
10800 ; Refresh (3 hours)
3600 ; Retry (1 hour)
604800 ; Expire (1 week)
86400 ; Minimum TTL (1 day)
)
; NS Records
IN NS ns1.example.com.
IN NS ns2.example.com.
; PTR Records for VPN clients
1.0 IN PTR vpn-client1.example.com.
2.0 IN PTR vpn-client2.example.com.
3.0 IN PTR vpn-client3.example.com.
Criação dos Arquivos de Zona para a View Externa
Agora, vamos criar os arquivos de zona para a view externa.
Zona Direta (example.com) - View Externa
1
sudo vi /var/named/zones/external/example.com.zone
Adicione o seguinte conteúdo:
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
; Zone file for example.com - EXTERNAL VIEW
$TTL 86400 ; 1 day default TTL
$ORIGIN example.com.
; SOA Record
@ IN SOA ns1.example.com. admin.example.com. (
2025052001 ; Serial
10800 ; Refresh (3 hours)
3600 ; Retry (1 hour)
604800 ; Expire (1 week)
86400 ; Minimum TTL (1 day)
)
; NS Records
IN NS ns1.example.com.
IN NS ns2.example.com.
; MX Records
IN MX 10 mail.example.com.
IN MX 20 mail2.example.com.
; A Records for Name Servers
ns1 IN A 203.0.113.49
ns2 IN A 203.0.113.50
; A Records for Mail Servers
mail IN A 203.0.113.20
mail2 IN A 203.0.113.21
; A Records for Web Servers
www IN A 203.0.113.10
IN A 203.0.113.11 ; Round-robin DNS for load balancing
; AAAA Records (IPv6)
ns1 IN AAAA 2001:db8:1::49
ns2 IN AAAA 2001:db8:1::50
www IN AAAA 2001:db8:1::10
mail IN AAAA 2001:db8:1::20
; CNAME Records
ftp IN CNAME www
webmail IN CNAME mail
; TXT Records
@ IN TXT "v=spf1 mx ip4:203.0.113.0/24 -all"
_dmarc IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com"
Note que esta zona contém apenas serviços que devem ser acessíveis externamente, e todos os endereços IP são públicos.
Zona Reversa (203.0.113.0/24) - View Externa
1
sudo vi /var/named/zones/external/113.0.203.in-addr.arpa.zone
Adicione o seguinte conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
; Reverse zone file for 203.0.113.0/24 - EXTERNAL VIEW
$TTL 86400 ; 1 day default TTL
$ORIGIN 113.0.203.in-addr.arpa.
; SOA Record
@ IN SOA ns1.example.com. admin.example.com. (
2025052001 ; Serial
10800 ; Refresh (3 hours)
3600 ; Retry (1 hour)
604800 ; Expire (1 week)
86400 ; Minimum TTL (1 day)
)
; NS Records
IN NS ns1.example.com.
IN NS ns2.example.com.
; PTR Records
10 IN PTR www.example.com.
11 IN PTR www.example.com.
20 IN PTR mail.example.com.
21 IN PTR mail2.example.com.
49 IN PTR ns1.example.com.
50 IN PTR ns2.example.com.
Definição de Permissões e Contexto SELinux
Defina as permissões e o contexto SELinux corretos para todos os arquivos de zona:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo chown root:named /var/named/zones/internal/example.com.zone
sudo chown root:named /var/named/zones/internal/200.168.192.in-addr.arpa.zone
sudo chown root:named /var/named/zones/internal/10.10.in-addr.arpa.zone
sudo chown root:named /var/named/zones/external/example.com.zone
sudo chown root:named /var/named/zones/external/113.0.203.in-addr.arpa.zone
sudo chmod 640 /var/named/zones/internal/example.com.zone
sudo chmod 640 /var/named/zones/internal/200.168.192.in-addr.arpa.zone
sudo chmod 640 /var/named/zones/internal/10.10.in-addr.arpa.zone
sudo chmod 640 /var/named/zones/external/example.com.zone
sudo chmod 640 /var/named/zones/external/113.0.203.in-addr.arpa.zone
sudo restorecon -v /var/named/zones/internal/example.com.zone
sudo restorecon -v /var/named/zones/internal/200.168.192.in-addr.arpa.zone
sudo restorecon -v /var/named/zones/internal/10.10.in-addr.arpa.zone
sudo restorecon -v /var/named/zones/external/example.com.zone
sudo restorecon -v /var/named/zones/external/113.0.203.in-addr.arpa.zone
Verificação da Sintaxe
Antes de recarregar o servidor DNS, verifique a sintaxe da configuração e dos arquivos de zona:
1
2
3
4
5
6
sudo named-checkconf
sudo named-checkzone example.com /var/named/zones/internal/example.com.zone
sudo named-checkzone example.com /var/named/zones/external/example.com.zone
sudo named-checkzone 200.168.192.in-addr.arpa /var/named/zones/internal/200.168.192.in-addr.arpa.zone
sudo named-checkzone 10.10.in-addr.arpa /var/named/zones/internal/10.10.in-addr.arpa.zone
sudo named-checkzone 113.0.203.in-addr.arpa /var/named/zones/external/113.0.203.in-addr.arpa.zone
Recarregando o Servidor DNS
Após verificar a sintaxe, recarregue o servidor DNS:
1
sudo rndc reload
Ou, se preferir reiniciar o serviço:
1
sudo systemctl restart named
Testes e Validação de Views
Agora que configuramos o DNS Split-Horizon, precisamos testar se as views estão funcionando corretamente.
Teste da View Interna
Para testar a view interna, execute consultas a partir de um host na rede interna:
1
2
3
4
5
6
7
8
# Teste de resolução direta
dig @192.168.200.49 www.example.com
# Teste de resolução reversa
dig @192.168.200.49 -x 192.168.200.10
# Teste de serviço interno
dig @192.168.200.49 intranet.example.com
Você deve receber respostas com endereços IP internos (192.168.200.x).
Teste da View Externa
Para testar a view externa, você pode:
- Executar consultas a partir de um host na Internet
- Simular consultas externas usando o endereço IP público do servidor
- Usar a opção -b do dig para simular consultas de um endereço IP externo
1
2
3
4
5
# Simular consulta externa especificando o endereço IP público
dig @203.0.113.49 www.example.com
# Simular consulta externa usando a opção -b
dig @192.168.200.49 -b 8.8.8.8 www.example.com
Você deve receber respostas com endereços IP públicos (203.0.113.x).
Teste de Serviços Exclusivamente Internos
Verifique se serviços exclusivamente internos não são expostos externamente:
1
2
3
4
5
# Consulta interna (deve retornar um endereço IP)
dig @192.168.200.49 db.example.com
# Consulta externa (deve retornar NXDOMAIN)
dig @192.168.200.49 -b 8.8.8.8 db.example.com
Teste de Recursão
Verifique se a recursão está habilitada apenas para clientes internos:
1
2
3
4
5
# Consulta interna (deve resolver domínios externos)
dig @192.168.200.49 google.com
# Consulta externa (deve falhar ou retornar REFUSED)
dig @192.168.200.49 -b 8.8.8.8 google.com
Configurações Avançadas de Views
Agora que temos uma configuração básica de DNS Split-Horizon funcionando, vamos explorar algumas configurações avançadas.
Views Baseadas em Outros Critérios
Além de endereços IP, as views podem ser baseadas em outros critérios, como:
Views Baseadas em Porta
1
2
3
4
5
view "special" {
match-clients { 192.168.200.0/24; };
match-destinations { 192.168.200.49 port 53; };
// ...
};
Views Baseadas em TSIG Key
1
2
3
4
5
6
7
8
9
key "example-key" {
algorithm hmac-sha256;
secret "your-base64-encoded-secret-key";
};
view "secure" {
match-clients { key example-key; };
// ...
};
Configuração de Múltiplas Views
Em ambientes complexos, você pode precisar de mais de duas views. Por exemplo:
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
// View para rede de desenvolvimento
view "development" {
match-clients { 192.168.10.0/24; };
// ...
};
// View para rede de teste
view "testing" {
match-clients { 192.168.20.0/24; };
// ...
};
// View para rede de produção interna
view "production_internal" {
match-clients { 192.168.30.0/24; };
// ...
};
// View para DMZ
view "dmz" {
match-clients { 172.16.0.0/24; };
// ...
};
// View externa
view "external" {
match-clients { any; };
// ...
};
Compartilhamento de Zonas entre Views
Em alguns casos, você pode querer compartilhar zonas entre views. Isso pode ser feito usando a opção in-view
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
view "internal" {
match-clients { internal_networks; };
zone "example.com" IN {
type master;
file "zones/internal/example.com.zone";
};
zone "shared.example.com" IN {
in-view "shared";
};
};
view "shared" {
match-clients { none; }; // Esta view não corresponde diretamente a nenhum cliente
zone "shared.example.com" IN {
type master;
file "zones/shared/shared.example.com.zone";
};
};
Configuração de Response Policy Zones (RPZ) em Views
As Response Policy Zones (RPZ) permitem implementar políticas de resposta DNS, como bloqueio de domínios maliciosos. Você pode configurar RPZs diferentes para cada view:
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
view "internal" {
match-clients { internal_networks; };
// RPZ para clientes internos
response-policy {
zone "rpz.internal";
};
zone "rpz.internal" IN {
type master;
file "zones/rpz/internal.rpz";
allow-query { none; };
};
// ... outras zonas ...
};
view "external" {
match-clients { any; };
// RPZ para clientes externos
response-policy {
zone "rpz.external";
};
zone "rpz.external" IN {
type master;
file "zones/rpz/external.rpz";
allow-query { none; };
};
// ... outras zonas ...
};
Considerações sobre DNSSEC com Views
A implementação de DNSSEC em um ambiente com views requer considerações especiais, pois as assinaturas DNSSEC são específicas para cada conjunto de registros.
Desafios do DNSSEC com Views
Quando você tem views diferentes com conteúdo diferente para o mesmo domínio, surgem alguns desafios:
- Assinaturas Diferentes: Cada view terá assinaturas DNSSEC diferentes para o mesmo domínio
- Chaves Diferentes: Você pode precisar de conjuntos de chaves diferentes para cada view
- Delegação: A zona pai precisa ter os registros DS corretos, mas só pode ter um conjunto
Estratégias para DNSSEC com Views
Existem algumas estratégias para implementar DNSSEC com views:
1. DNSSEC Apenas na View Externa
A abordagem mais comum é implementar DNSSEC apenas na view externa, mantendo a view interna sem DNSSEC:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
view "internal" {
match-clients { internal_networks; };
// Desabilitar validação DNSSEC para clientes internos
dnssec-validation no;
// ... zonas ...
};
view "external" {
match-clients { any; };
// Habilitar validação DNSSEC para clientes externos
dnssec-validation auto;
// ... zonas ...
};
2. DNSSEC em Todas as Views com Chaves Separadas
Outra abordagem é implementar DNSSEC em todas as views, mas com conjuntos de chaves separados:
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
view "internal" {
match-clients { internal_networks; };
// Habilitar validação DNSSEC
dnssec-validation auto;
// Zona com DNSSEC
zone "example.com" IN {
type master;
file "zones/internal/example.com.signed";
key-directory "keys/internal";
auto-dnssec maintain;
inline-signing yes;
};
};
view "external" {
match-clients { any; };
// Habilitar validação DNSSEC
dnssec-validation auto;
// Zona com DNSSEC
zone "example.com" IN {
type master;
file "zones/external/example.com.signed";
key-directory "keys/external";
auto-dnssec maintain;
inline-signing yes;
};
};
Esta abordagem requer gerenciamento cuidadoso das chaves e registros DS.
Troubleshooting de Views
Mesmo com uma configuração cuidadosa, problemas podem surgir. Aqui estão algumas situações comuns e como resolvê-las:
Problema: View Incorreta Sendo Selecionada
Verificação:
1
dig @192.168.200.49 www.example.com
Se você receber uma resposta inesperada (por exemplo, um endereço IP público quando deveria receber um endereço IP privado), a view incorreta pode estar sendo selecionada.
Possíveis soluções:
- Verifique a ordem das views no named.conf (lembre-se que a primeira view correspondente é usada)
- Verifique as ACLs match-clients para garantir que estão corretas
- Use a opção +subnet do dig para testar consultas de diferentes redes:
1
dig @192.168.200.49 www.example.com +subnet=192.168.200.0/24
Problema: Zonas Não Carregam em Views Específicas
Verificação:
1
sudo rndc zonestatus example.com in internal
Possíveis soluções:
- Verifique a sintaxe da definição da zona na view
- Verifique permissões e contexto SELinux dos arquivos de zona
- Verifique logs:
sudo tail -f /var/log/named/general.log
Problema: Recursão Não Funciona em Uma View
Verificação:
1
dig @192.168.200.49 google.com
Possíveis soluções:
- Verifique se recursion está definido como yes na view
- Verifique allow-recursion na view
- Verifique se o servidor tem conectividade com a Internet
Problema: Transferência de Zona Falha entre Views
Verificação:
1
dig @primary_server example.com AXFR
Possíveis soluções:
- Verifique allow-transfer na definição da zona na view
- Verifique se o servidor secundário está na ACL correta
- Verifique logs em ambos os servidores
Melhores Práticas para Views e DNS Split-Horizon
Para finalizar, aqui estão algumas melhores práticas para implementação de views e DNS Split-Horizon:
1. Planejamento e Documentação
- Documente claramente quais redes correspondem a quais views
- Mantenha um registro de quais serviços estão disponíveis em cada view
- Documente as diferenças entre as zonas nas diferentes views
2. Organização de Arquivos
- Use uma estrutura de diretórios clara para separar arquivos de zona de diferentes views
- Use nomes de arquivo consistentes e descritivos
- Mantenha os números de serial sincronizados entre as diferentes versões da mesma zona
3. Segurança
- Desabilite recursão para clientes externos
- Implemente rate limiting para prevenir ataques de amplificação
- Considere usar TSIG para transferências de zona entre servidores
- Oculte informações sensíveis da view externa
4. Manutenção
- Automatize a atualização de zonas para garantir consistência entre views
- Implemente monitoramento para detectar discrepâncias entre views
- Teste regularmente a resolução de nomes em todas as views
5. Desempenho
- Considere a carga adicional que múltiplas views podem impor ao servidor
- Monitore o uso de recursos e ajuste conforme necessário
- Em ambientes de alto tráfego, considere servidores dedicados para diferentes views
Conclusão e Próximos Passos
Neste quarto artigo da série, exploramos o poderoso recurso de views do BIND e implementamos um DNS Split-Horizon completo. Configuramos views internas e externas, criamos zonas específicas para cada view e aprendemos a testar e validar a configuração.
As views são uma ferramenta poderosa que permite apresentar diferentes respostas DNS dependendo da origem da consulta, aumentando a segurança, otimizando o tráfego e proporcionando flexibilidade operacional.
O que vem a seguir?
No próximo artigo, “Segurança e Hardening de Servidores DNS BIND no Oracle Linux 9”, abordaremos:
- Configuração de permissões de arquivos e diretórios
- Implementação e configuração do SELinux para BIND
- Configuração de TSIG para transferências de zona seguras
- Implementação de DNSSEC
- Melhores práticas de segurança para servidores DNS
Não perca! Nossa jornada para dominar o DNS BIND no Oracle Linux 9 continua.