DNS só IPv6
Introdução
O artigo a seguir apresenta de maneira ordenada as considerações e etapas a seguir para gerenciar um servidor DNS só IPv6.
Vamos tentar abranger vários aspectos básicos e as funcionalidades principais. No entanto, é importante lembrar que existem muitas funcionalidades adicionais a serem consideradas.
Este artigo trata da administração e operação de um servidor DNS no sistema operacional GNU/Linux, com instalação orientada ao servidor. Para este estudo vamos usar o servidor DNS BIND9 instalado sobre S.O. Debian.
O BIND9 é um dos servidores DNS mais amplamente usados ??em ambientes de rede de ISP e operadoras de rede.
O servidor BIND9 deve estar previamente instalado em seu Linux, preferencialmente em versão atualizada e/ou superior a v9.10. No entanto, os conceitos discutidos aqui são aplicáveis ??a qualquer servidor DNS em qualquer tipo de distribuição do Linux, e até mesmo em qualquer outro servidor DNS.
Da mesma forma, o leitor deve estar familiarizado com os conceitos básicos de operação e configuração de servidores em ambientes GNU/Linux e o funcionamento básico do BIND9, como a configuração de opções, configuração de zonas, entre outros.
Informações de endereçamento IPv6 da topologia:
- Prefixo de Rede Clientes: 2001:db8:abcd::/48
- Servidor DNS Recursivo: 2001:db8:123::2
- Servidores DNS Autoritativos: 2001:db8:cafe::2 e 2001:db8:cafe::3
Informações importantes para entender melhor este documento:
Arquivos de configuração que usaremos:/etc/bind/named.conf
/etc/bind/named.conf.options
/etc/bind/named.conf.default-zones
A. A primeira coisa é ter certeza de que temos o Bind9 instalado. Podemos verificá-lo com o seguinte comando no nosso console Linux:
#named -v
BIND 9.16.15-Debian (Stable Release)
Além disso, podemos executar o seguinte comando para validar que o servidor Bind9 esteja ativo e funcionando normalmente:
#systemctl status named
? named.service - BIND Domain Name Server
Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-MM-DD HH:MM:SS UTC; 1 day 8h ago
Docs: man:named(8)
Main PID: 2779031 (named)
Tasks: 26 (limit: 9507)
Memory: 156.5M
CPU: 2min 8.314s
CGroup: /system.slice/named.service
??2779031 /usr/sbin/named -f -u bind
Este comando mostra não apenas o estado da operação do servidor Bind9, mas também parâmetros como PID, memória, uptime, etc.
B. Em seguida, precisamos verificar a configuração do endereçamento IPv6 do servidor. Para isso, é importante saber quais interfaces o servidor Linux e seus endereços IP possuem. É fundamental conhecer com antecedência o endereço IPv6 onde queremos que o Bind9 escute as conexões de entrada e aqueles a partir dos quais as conexões de saída serão feitas.
Inclusive é comum usar interfaces 'bridge' no Linux para configurar o endereçamento IPv6 para uso do Bind9. Essa prática é recomendada para evitar flapping e aumentar a estabilidade do serviço DNS.
Existem muitas formas de gerenciar as interfaces e o endereçamento IPv6 de um servidor Debian Linux; a seguir, lembramos algumas das mais usadas:
Ver as interfaces de rede do servidor:
#ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 9e:11:7b:f0:98:b9 brd ff:ff:ff:ff:ff:ff
altname enp0s18
3: loopback: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 4e:c0:be:49:cb:23 brd ff:ff:ff:ff:ff:ff
Ver os endereços IPv6 configurados no servidor:
#ip -6 address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2001:db8:cafe::2/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::9c11:7bff:fef0:98b9/64 scope link
valid_lft forever preferred_lft forever
Os comandos acima permitem observar o endereçamento IPv6 e as interfaces de rede do servidor. No nosso caso, vamos usar a interface ens18 com a IPv6 2001:db8:cafe::2/64 (GUA). Adicionalmente, podemos observar o endereçamento LLA (LLA: Link Local Address) das interfaces.
Conhecer com precisão as interfaces de rede do servidor e o endereçamento IPv6 de cada uma delas é um input importante na hora de solucionar problemas, tanto do servidor Linux quanto do Bind9.
Lembre-se de que existem muitos tipos de servidores DNS, sendo os mais comuns os servidores recursivos e os servidores autoritativos.
Segundo dnslookup.es [2]:
Um servidor DNS autoritativo é aquele que possui uma resposta em seu banco de dados local para um domínio sobre o qual é questionado.
Um servidor DNS recursivo é aquele que, quando não encontra uma resposta no seu banco de dados local para um domínio, tenta consultá-lo com outros servidores DNS para tentar resolver o pedido que lhe for feito.
Se voltarmos para o nosso exemplo (ver topologia) vai ser:
- O Servidor DNS recursivo lhe oferece serviço DNS aos clientes da rede: 2001:db8:abcd::/48
- Os Servidores autoritativos têm a autoridade para o domínio example.com.
- Adicionalmente, o servidor 2001:db8:cafe::3 cópia a zona via “zone transfer” o 2001:db8:cafe::2
Passo 1:
Uma vez conferida e garantida a questão das interfaces de rede, do endereçamento IPv6 do servidor Linux e do funcionamento normal do Bind9, devemos começar a configuração do Bind9 para garantir em primeira instância que este escute no IPv6 e permita conexões de entrada desde a rede 2001:db8:abcd::/48.
O arquivo de configuração principal do servidor Bind9 é ‘/etc/bind/named.conf’. O que fazemos é configurar os parâmetros IPv6 apropriados na seção ‘options{ …};’ localizada na primeira parte deste arquivo. É possível usar a diretiva 'include' dentro do arquivo de configuração para citar outros arquivos e programar as configurações em sua totalidade de forma mais organizada, usando vários arquivos e segmentando a configuração conforme sua conveniência.
A configuração da seção ‘options { … };’ para operação IPv6 é ilustrada abaixo:
options {
directory "/var/cache/bind";
forwarders {
2001:db8:db8::8888;
2001:db8:db8::8844;
};
listen-on-v6 { any; };
query-source-v6 address 2001:db8:cafe::2;
listen-on-v6 { ::1; 2001:db8:cafe::2; };
recursion yes;
…;
};
Para simplificar, e apenas para focar na configuração para o IPv6, colocamos somente os parâmetros do IPv6.
A seguir, uma breve explicação dos parâmetros de configuração IPv6 mais importantes:
- A opção ‘forwarders { 2001:db8:db8::8888; 2001:db8:db8::8844; };’ é opcional e a colocamos apenas se quisermos fazer forwarding de todas as consultas DNS para outro servidor DNS. Neste caso configuramos dois servidores de encaminhamento no IPv6.
- A opção ‘listen-on-v6 { any; };’ permite especificar ao Bind9 os endereços IPv6 nos quais eu quero que escute pedidos DNS IPv6. Podemos configurá-la com a diretiva ‘any’ especificando para o Bind9 que escutará em todos os endereços IPv6 configurados no servidor Linux, até mesmo no localhost6 ‘::1’. Também, podemos especificar os endereços IPv6 nos quais quero que o Bind9 escute, colocando os endereços IPv6 separados por ‘;’. Por exemplo: listen-on-v6 { ::1; 2001;db8:cafe::2; };
Claramente, qualquer endereço IPv6 especificado aqui já deve estar configurado em uma interface do servidor Linux. - A opção ‘query-source-v6 address 2001:db8:cafe::2;’ permite especificar o(s) endereço(s) IPv6 a partir dos quais o Bind9 estabelecerá conexões de saída. As conexões de saída são essenciais para resolver o DNS, seja por meio de 'forwarding' ou de forma recursiva.
É importante observar que, uma vez feitas as atualizações da configuração do arquivo ‘/etc/bind/named.conf’ devemos aplicar essas mudanças reiniciando o servidor Bind9 ou recarregando sua configuração; a seguir, os comandos:
#systemctl reload named
#systemctl restart named
Após aplicar as mudanças, podemos executar os seguintes comandos para validar que o Bind9 está escutando nos endereços IPv6 configurados:
#netstat -puan | grep named
Passo 2:
Devemos permitir a recursão para nossos clientes, especificamente para clientes da rede 2001:db8:abcd::/48. Para permitir a recursão, é usada a diretiva 'allow-recursion', leve em consideração que o comportamento dessa diretiva mudou nas versões mais recentes do Bind. O que fazemos neste caso é criar um ACL com o endereçamento IPv6 da rede cliente e lhe aplicamos a diretiva, conforme abaixo:
;;;Configuración de Bind9, archivo /etc/bind/named.conf, para recursión.
acl my_ipv6_net {
2001:db8:abcd::/48;
};
options {
…
recursion yes;
allow-recursion { my_ipv6_net; };
…
};
Com o exemplo anterior estamos criando um ACL chamado ‘my_ipv6_net’ e subsequentemente permitindo a recursão para esse ACL. Quer dizer, que os nossos clientes poderão usar o servidor perfeitamente.
Como recomendação de segurança importante: nunca usar a opção ‘allow-recursion { any; }’, pois fazendo isso estaríamos criando um servidor 'Open Resolver' com tudo o que isso implica.
Passo 1: configuração geral e básica.
Da mesma forma que fizemos para um servidor DNS recursivo, precisamos garantir que o Bind9 escute e permita conexões corretamente no IPv6. Isto é, a configuração de rede IPv6 do servidor e a configuração geral e básica do Bind9 são mantidas.
Passo 2: configuração para ‘só’ autoritativo.
Se quisermos que o Bind9 seja 'só' autoritativo e não permita recursão, devemos configurar o arquivo ‘/etc/bind/named.conf’ com as seguintes opções:
options {
directory "/var/cache/bind";
forwarders {
2001:db8:db8::8888;
2001:db8:db8::8844;
};
listen-on-v6 { any; };
query-source-v6 address 2001:db8:cafe::2;
listen-on-v6 { ::1; 2001:db8:cafe::2; };
recursion no;
…;
};
Passo 3:
Como o servidor DNS é autoritativo, devemos estabelecer a configuração da zona ‘example.com’ no arquivo ‘/etc/bind/named.conf’. Isto é feito assim:
options {
…;
};
zone "example.com" {
type master;
file "/etc/bind/example.com.db";
};
Nota importante: um servidor DNS pode ser autoritativo e recursivo ao mesmo tempo, mas tal configuração deve contemplar uma análise mais rigorosa dos aspectos de segurança.
Configuração no servidor DNS Primário (Master)
Na configuração do arquivo ‘/etc/bind/named.conf’ do Servidor DNS Primário, indicamos que é master e definimos o endereçamento IPv6 daqueles que estão autorizados a solicitar zone-transfer.
A seguir, a configuração correspondente:
options {
…;
};
zone "example.com" {
type master;
file "/etc/bind/zones/example.com.db";
allow-transfer { 2001:db8:cafe::3; };
};
Configuração no servidor DNS Secundário (Slave)
Na configuração do arquivo ‘/etc/bind/named.conf’ do Servidor DNS Secundário, especificamos que é slave e definimos o endereçamento IPv6 dos servidores master.
A seguir, a configuração correspondente:
options {
…;
};
zone "example.com" {
type slave;
file "example.com.db";
masters { 2001:db8:cafe::2; };
};
|
|
Gerenciamento de interfaces e endereçamento IPv6
ip link show
ifconfig -a
ip -6 address show
ip -6 route show
Gerenciamento do Bind9
systemctl status named
systemctl reload named
systemctl restart named
Ver processos e Binding do Bind9
netstat -puan | grep named
Testar o DNS IPv6 no nível local
nslookup www.google.com ::1
nslookup www.google.com 2001:db8:cafe::2
nslookup -type=AAAA www.google.com ::1
dig @::1 AAAA www.google.com
- Erros de digitação na configuração do arquivo ‘/etc/bind/named.conf’, principalmente nas opções que terminam ou usam o símbolo ‘;’. Portanto, recomenda-se ter muito cuidado ao editar e criar configurações.
- Usar de forma inapropriada as opções de recursão e de servidor autoritativo do Bind9, colocando-o como um 'Open Resolver' com todas as implicâncias de segurança associadas.
- Não validar corretamente os endereços IPv6 do servidor e não fazê-los corresponder nas configurações do Bind9.
- Fazer que o servidor Bind9 escute em endereços IPv6 configurados em interfaces flapping. Isso faz com que o serviço DNS seja intermitente.
- Editar incorretamente o nome dos arquivos das zonas.