Como configurar um DNS Recursivo Master


O DNS recursivo é responsável por efetuar consultas quando você envia uma solicitação, por exemplo, para acessar um site. Graças ao serviço de DNS (Domain Name System), não precisamos ficar decorando o IP dos sites que precisamos acessar. Portanto quando digitamos o endereço de um site no navegador, o DNS recursivo é quem vai fazer as consultas necessárias na internet para encontrar o que você procura.
Este é o primeiro de uma série de artigos detalhando a configuração de servidores de DNS. Faremos a configuração de um servidor MASTER e um SLAVE com DNS Recursivo, Autoritativo e Reverso. Além de implementar a segurança do servidor com o Fail2ban + nftables.

Ex.: ASN – CIDR/22

Nesse exemplo vou usar um bloco /22, que seria o bloco público do nosso ASN da empresa fictícia XPTO.

Bloco recebido: IPv4 – 45.80.48.0/22 IPv6 – 2804:f123::/32
Domínio: xpto.com.br

Antes de mais nada o mínimo de conhecimento é saber realizar cálculos de sub-redes.

Address:   45.80.48.0            00101101.01010000.001100 00.00000000
Netmask:   255.255.252.0 = 22    11111111.11111111.111111 00.00000000
Wildcard:  0.0.3.255             00000000.00000000.000000 11.11111111
=>
Network:   45.80.48.0/22         00101101.01010000.001100 00.00000000 (Class A)
Broadcast: 45.80.51.255          00101101.01010000.001100 11.11111111
HostMin:   45.80.48.1            00101101.01010000.001100 00.00000001
HostMax:   45.80.51.254          00101101.01010000.001100 11.11111110
Hosts/Net: 1022

Para ilustrar “nossa rede” conto com os seguintes servidores:

ROUTER GW -> 45.80.48.1 / 2804:f123:bebe:cafe::1 (MIKROTIK)
SRV DNS MASTER -> 45.80.48.2 / 2804:f123:bebe:cafe::2 (DEBIAN 10)
SRV DNS SLAVE -> 45.80.48.3 / 2804:f123:bebe:cafe::3 (DEBIAN 10)
SRV WEB + FTP -> 45.80.48.4 / 2804:f123:bebe:cafe::4 (CENTOS 8)
SRV ZABBIX + phpIPam -> 45.80.48.5 / 2804:f123:bebe:cafe::5 (DEBIAN 10)
SRV E-MAIL -> 45.80.48.6 / 2804:f123:bebe:cafe::6 (mail,imap,pop,smtp) (CENTOS 8)

Dentro da rede ainda temos os blocos de IPs inválidos/internos 192.168.0.0/16, 172.16.0.0/12, 100.64.0.0/10 e 10.0.0.0/8 utilizando NAT que também precisam fazer consultas recursivas no servidores.

Quebrei meu bloco de IPs da seguinte forma, (adapte a sua realidade)
45.80.48.0/27   Servidores
45.80.48.32/27  Roteamento
45.80.48.64/26  Clientes com IP Fixo
45.80.48.128/25CGNAT
45.80.49.0/26   NOC (Gerência)
45.80.49.64/26  Clientes Delegação
45.80.49.128/25Clientes dinâmico
45.80.50.0/24   Clientes dinâmico
45.80.51.0/24   Clientes dinâmico

Tenha sua interface de rede configurada corretamente.

# vim /etc/network/interfaces

 

MASTER (NS1)

# su -
# apt install bind9 dnsutils
# echo "nameserver 127.0.0.1" > /etc/resolv.conf

Para descobrir se seu servidor esta resolvendo nomes use o comando dig.

Retornará algo como:

Os arquivos de configuração do bind ficam no diretório /etc/bind/ e agora no Debian 10 Buster também separando os root servers em /usr/share/dns/

Iremos alterar o named.conf.options, o próprio nome já se auto descreve o que vamos encontrar nele.

Explicação comentada no arquivo.

Caso você não queria seu servidor sendo recursivo altere na ACL autorizados deixando apenas 127.0.0.1 e ::1.

Se seu servidor não tiver IPv6? (Que triste rsrsrs) Recomendo que desative o ipv6 no bind.

Adicione um -4 em OPTIONS.

Toda alteração feita no bind para ter efeito é necessário restartar o serviço.

Se nada retornar é porque não tem nenhum erro. Verifique também o status do bind para ver se o mesmo era rodando.

Fail2Ban + nftables

Fail2Ban é uma estrutura de software de prevenção de intrusões que protege os servidores de computadores contra ataques de força bruta, que opera monitorando arquivos de logs. Sendo o mais comum usado para bloquear endereços IPs selecionados que podem pertencer a hosts que estão tentando violar a segurança.

# apt install nftables fail2ban

Como o iptables está sendo substituído por nftables começando com o Debian Buster, vamos configurar o Fail2Ban para usar o nftables como padrão.
Mas vou ir além em vez de usar o filtro multiport vou setar allports e modifica-lo para que quando uma tentativa de violação acontecer o Fail2Ban crie uma regra de firewall que dropa definitivamente o IP e não apenas fechando a porta do serviço para “invasor”.

Procure por “banaction = iptables-multiport” e “banaction_allports = iptables-allports” e altere seu valor para “nftables-allports”:

Altere o modo de bloqueio em nftables-allports.conf para fazer que ele de um “drop all”.

Procure por nftables_mode = meta l4proto e altere deixando seu valor vazio:

Em nftables-common.conf alteraremos o padrão de reject para drop

Procure por “blocktype = reject” e altere seu valor para “drop”.

#blocktype = reject
blocktype = drop

Melhorias feitas, precisamos ativar o filtro para ler os logs do bind, porém ao ativar o filtro named-refused me deparei com seu não funcionamento, e quebrando a cabeça descobri que os logs do bind estão diferente e a expressão regular do filtro está errada. Os desenvolvedores do fail2ban já fizeram a correção, mas acredito que irá levar um tempo para o pessoal do Debian fazer um novo empacotamento.
A correção pode ser feita editando o arquivo /etc/fail2ban/filter.d/named-refused.conf

Porém como eu vou ser mais “bruto” no filtro. Vou criar nosso próprio filtro bind9, vamos lá!

# vim /etc/fail2ban/filter.d/bind9.conf

Ajustei o tempo de banimento por 24h, você pode ajustar para mais se achar necessário. E “maxretry” que é a quantidade de tentativas para 1.

Vale lembrar que o filtro de SSH já vem ativo por padrão em “/etc/fail2ban/jail.d/defaults-debian.conf”.

Precisamos fazer o bind gerar os logs com tentativas de consultas negadas (denied), incluído logging {…} no arquivo named.conf.

Crie o diretório onde o bind vai registrar seus logs e de permissão para que possa gravar nesta pasta.

É importante ativar o nftables na inicialização e restartar os serviços para que nossas configurações sejam interpretadas.

Para visualizar seu firewall use o comando:

Alguns comandos legais do fail2ban

Veja quais filtros estão ativos

Exemplo:

Para remover um IP que foi bloqueado:

Pronto agora já temos um servidor DNS com um nível de segurança bem elevado!

Atualizando ROOT SERVERS

Para finalizar o master vamos fazer uma atualização no root server que na versão do debian 10 buster passou a ser /usr/share/dns/root.hints. A vesão instalada é de 13/03/2019 “last update: March 13, 2019”

Para obter uma versão mais recente, iremos mover nosso arquivo root.hints e baixar um novo.

Pode editar o arquivo /usr/share/dns/root.hints e verificar qual é a ultima atualização. Reinicie o serviço para ter efeito.

Parabéns! Seu servidor master está pronto!

Fonte
wiki.debian.org/Bind9
blog.remontti.com.br