Servidor DNS Bind9 – Recursivo + Autoritativo DNSSEC + Reverso + RPZ + Fail2ban + nftables + Zabbix no Debian 11/12


BIND (Berkeley Internet Name Domain ou, como chamado previamente, Berkeley Internet Name Daemon) é o servidor para o protocolo DNS mais utilizado na Internet, especialmente em sistemas do tipo Unix, onde ele pode ser considerado um padrão de fato.

Ante de iniciar a instalação é preciso saber como funciona um DNS:

DNS Recursivo
O DNS recursivo é responsável pela resolução de nomes, começando sempre com consultas recursivas nos servidores raízes. Para melhorar a eficiência, reduzir o tráfego DNS na Internet e aumentar o desempenho em aplicativos de usuário final, utilizamos o cache de DNS, armazenando resultados das consulta DNS por um período de tempo determinado na configuração (tempo de vida determinado pelo autoritativo do domínio consultado).

DNS Autoritativo
É o serviço DNS que possui autoridade sob um domínio. Assim, como o servidor ns1.remontti.com.br é o DNS autoritativo de meu domínio remontti.com.br, é ele que sempre vai responder qualquer subdomínio ou “hosts” (por exemplo: blog.remontti.com.br).
É nesse servidor que você vai apontar nas configurações de um domínio registrado no registro.br, por exemplo.

DNS Reverso
DNS atua resolvendo o nome do domínio/subdomínio para um endereço IP correspondente. Já o DNS Reverso, como o próprio nome diz, resolve o endereço IP para o nome de domínio associado ao host. Ou seja, quando temos disponível o endereço IP de um host e não sabemos o endereço do domínio (nome dado à máquina ou outro equipamento que acesse uma rede), tentamos resolver o endereço IP através do DNS reverso que procura qual nome de domínio está associado aquele endereço.
Os servidores que utilizam o DNS Reverso conseguem verificar a autenticidade de endereços, verificando se o endereço IP atual corresponde ao endereço IP informado pelo servidor DNS.
Isto evita que alguém utilize um domínio que não lhe pertence para enviar spam, por exemplo (por isso que ele é importante para servidores de e-mail).

Correção dos dados de geolocalização
É muito importante que sua geolocalização estaja correta no maxmind.com, verifique alguns de de seus IPs.
https://www.maxmind.com/en/geoip-demo

Para correção temos dois formulários.
Correct a GeoIP Location
https://support.maxmind.com/geoip-data-correction-request/correct-a-geoip-location/
Correct a GeoIP ISP or Organization
https://support.maxmind.com/geoip-data-correction-request/correct-a-geoip-isp-or-organization/

Instalação do Debian

Requesitos:
Debian 12 Bookworm – Instalação Limpa (Recomendado)
Debian 11 Bullseye – Instalação Limpa

Leitura obrigatória:
Configurando interface de rede no Debian
Como melhorar a produtividade no seu Debian após instalação

Vire root com o comando correto!

# su - 

No Debian 12 o rsyslog foi abandonado como sistema de logs e esta usando systemd-journald. Como o bind salva alguns logs em arquivo e o fail2ban lê os mesmo vamos precisar dele, para isso instale o mesmo:

# apt install rsyslog

Instalação fail2ban e nftables (Master/Slave)

Fail2Ban é uma estrutura de software de prevenção de intrusões que protege os servidores contra ataques de força bruta. Ele opera monitorando arquivos de logs, sendo o mais comum seu uso para bloquear endereços IPs que podem pertencer à hosts que estão tentando violar a segurança do seu servidor.
nftables é um firewall baseado no iptables que agora no Debian 11 já vem instalado por padrão subistituindo o antigo iptables.

# apt install fail2ban

Entendo o funcionamento do fail2ban:

# fail2ban-client status

Por padrão o filtro de SSH já vem habilitado, então seu SSH (porta 22) já está “protegida”, se alguém errar a senha por 5 vezes terá seu IP bloqueado por 10 minutos.

Status
|- Number of jail:      1
`- Jail list:   sshd

Para alterar esses padrões de tempo e número de tentativas edite: (este arquivo é muito bem comentado o que cada variável faz!)

# vim /etc/fail2ban/jail.conf

Localize as linhas, e ajuste de acordo com suas necessidades

# vim /etc/fail2ban/jail.d/defaults-debian.conf

Altere para false

[sshd]
enabled = false

Porém como eu sempre altero a porta do SSH de todo o servidor bem como tempo para digitar a senha, é natural que o fail2ban não ira poteger caso você tenha alterado a mesma. Inclusive recomendo você adotar essa boa pratica.

# vim /etc/ssh/sshd_config

Em Port defina a nova porta, e LoginGraceTime defina o tempo em segundos para digitar a senha, e nunca seja ignorante de permitir o acesso root direto no SSH em PermitRootLogin, a não ser que tenha uma forte motivo para isso (Me conte nos comentários, até hoje não tive motivo para tal!)

Port 60002
LoginGraceTime 10
#PermitRootLogin prohibit-password # Nao seja burro de colocar um yes aqui!

Com a porta alterada do SSH (como no exemplo 60002) vamos ajusta no fail2ban para proteger essa nova porta

# vim /etc/fail2ban/jail.conf

Localize e adicione 60002:

[sshd]
Port = ssh,60002

Por padrão de segurança do fail2ban usa o iptables e faz o bloquei apenas da porta do serviço que esta sofrendo o “ataque”, vamos subistituir o iptables pelo nftables ou por route. Vou deixar os dois modelos a baixo de exemplo.

nftables: Em vez de usar o filtro multiport, vou setar allports e modificá-lo para que tentativas de violação crie uma regra de firewall de drop e não reject definitivamente o IP e não apenas fechando a porta do serviço. Para isso edite:

# vim /etc/fail2ban/jail.conf

Localize banaction e banaction_allports e altere para nftables-allports:

banaction = nftables-allports
banaction_allports = nftables-allports

Para bloquear tudo e não apenas a porta do serviço atacada:

# vim /etc/fail2ban/action.d/nftables.conf

Localize rule_match-allports e remova o meta l4proto \{ \} ficando:

rule_match-allports =

Ainda no altere o blocktype de reject para drop

blocktype = drop

Habilite o nftblaes para o boot do sistema, em seguida reinicie os serviços

# systemctl enable nftables
# systemctl restart nftables fail2ban

Verifique se mesmo estão rodando sem nenhum erro:

# systemctl status nftables fail2ban

route: Com o método route iremos em vezes de criar uma regra de firewall para o IP que esta “atacando” vamos coloca-lo em blackhole, assim se você possuir algum roteamento já poderá exportar o IP para sua borda para matar lá já (gosto + dessa).

# vim /etc/fail2ban/jail.conf

Localize banaction e banaction_allports e altere para route:

banaction = route
banaction_allports = route

Vamos ajustar agora para ação ser blackhole

# vim /etc/fail2ban/action.d/route.conf

Em blocktype altere para blackhole

blocktype = blackhole
# systemctl restart fail2ban

Se tiver acesso a outro servidor externo tente fazer uma conexão SSH, e erre varias vezes a senha para ser bloqueado, assim você pode validar seu fail2ban.

Para visualizar seu firewall nftables use o comando:

# nft list ruleset

Ou se usou route para mostra a tabela de rotas:

# ip route list
# ip -6 route list

Alguns comandos úteis do fail2ban
Visulizar os filtros

# fail2ban-client status

Visualizar detalhe de um filtro

# fail2ban-client status NOME_FILTRO
# fail2ban-client status sshd

Remover um IP de um determinado filtro

# fail2ban-client set sshd unbanip IPADDRESS
# fail2ban-client set sshd unbanip 200.200.200.200

Exemplo de script para remover todos os IPs banidos uma a um.

#!/bin/bash
BANIDOS=`fail2ban-client status bind9 | grep "Banned IP list" | awk '{$1=$2=$3=$4=$5=""; print $0}'`
IPS=$(echo $BANIDOS | tr " " "\n")
for IP in $IPS
 do
  #echo "Removendo: ${IP}"
  fail2ban-client set bind9 unbanip ${IP} ;
  #ip route del ${IP}
done

Se desejar adicionar algum prefixo a uma lista branca você pode editar:

# vim /etc/fail2ban/jail.conf

Localize ignoreip, desomente a linha (remova o # da frete) e adicione os prefixo que deseja ignorar, para não cair bloqueio.

ignoreip = 127.0.0.1/8 ::1 200.200.200.0/22 2000:2000::/32

Reinicie o serviço

# systemctl restart fail2ban

Instalação do Bind9 (Master/Slave)

Instalação dos pacotes

# apt install bind9 dnsutils

Arquitetura de arquivos e diretórios do bind9 no Debian 11:

/etc/bind/
├── bind.keys
├── db.0
├── db.127
├── db.255
├── db.empty
├── db.local
├── named.conf
├── named.conf.default-zones
├── named.conf.local
├── named.conf.options
├── rndc.key
└── zones.rfc1918
/usr/share/dns/
├── root.ds
├── root.hints
├── root.hints.sig
└── root.key
/var/cache/bind/
├── managed-keys.bind
└── managed-keys.bind.jnl

Configuração do Recursivo

Alteramos o DNS do servidor fazendo com que ele consulte em si próprio, através dos IPs de loopback. Essa alteração deve ser feita no arquivo /etc/resolv.conf.

# echo "nameserver 127.0.0.1" > /etc/resolv.conf
# echo "nameserver ::1" >> /etc/resolv.conf

Para validar se seu servidor conseguer resolver nomes nele próprio, use o comando dig e host. Alguns comandos de Ex:

# dig @localhost google.com.br 
# dig @127.0.0.1 google.com.br 
# dig @::1 google.com.br +short
# host google.com.br

Como identificar o problema com resoluções de nomes, famoso: “Meu DNS não está resolvendo nomes!”. Use o atributo +trace, assim o mesmo mostrará todo o caminho feito para a resolução, assim você ira identificar onde “parou” e não obteve a informação necessária. Ex:

# dig @localhost google.com.br +trace

Observe as linhas em destaque.

; <<>> DiG 9.16.15-Debian <<>> @localhost google.com.br +trace
; (2 servers found)
;; global options: +cmd
.                       517911  IN      NS      b.root-servers.net.
.                       517911  IN      NS      c.root-servers.net.
.                       517911  IN      NS      m.root-servers.net.
.                       517911  IN      NS      a.root-servers.net.
.                       517911  IN      NS      l.root-servers.net.
.                       517911  IN      NS      k.root-servers.net.
.                       517911  IN      NS      e.root-servers.net.
.                       517911  IN      NS      i.root-servers.net.
.                       517911  IN      NS      d.root-servers.net.
.                       517911  IN      NS      f.root-servers.net.
.                       517911  IN      NS      g.root-servers.net.
.                       517911  IN      NS      h.root-servers.net.
.                       517911  IN      NS      j.root-servers.net.
.                       517911  IN      RRSIG   NS 8 0 518400 20211107...
;; Received 1137 bytes from ::1#53(localhost) in 0 ms

br.                     172800  IN      NS      f.dns.br.
br.                     172800  IN      NS      e.dns.br.
br.                     172800  IN      NS      b.dns.br.
br.                     172800  IN      NS      c.dns.br.
br.                     172800  IN      NS      d.dns.br.
br.                     172800  IN      NS      a.dns.br.
br.                     86400   IN      DS      2471 13 2 5E4F35...
br.                     86400   IN      RRSIG   DS 8 1 86400 202...
;; Received 741 bytes from 198.41.0.4#53(a.root-servers.net) in 140 ms

google.com.br.          3600    IN      NS      ns1.google.com.
google.com.br.          3600    IN      NS      ns2.google.com.
google.com.br.          3600    IN      NS      ns3.google.com.
google.com.br.          3600    IN      NS      ns4.google.com.
uh3thc9qu1qbt25pspmqnbuvm420ur2e.com.br. 900 IN NSEC3 1 1 10 A8A465B84D7...
uh3thc9qu1qbt25pspmqnbuvm420ur2e.com.br. 900 IN RRSIG NSEC3 13 3 900 202...
hekajlrgmga91msd4es7bmhol7dbtbbi.com.br. 900 IN NSEC3 1 1 10 A8A465B84D7...
hekajlrgmga91msd4es7bmhol7dbtbbi.com.br. 900 IN RRSIG NSEC3 13 3 900 202...
;; Received 507 bytes from 2001:12f8:a::10#53(c.dns.br) in 140 ms

google.com.br.          300     IN      A       142.250.219.195
;; Received 58 bytes from 2001:4860:4802:38::a#53(ns4.google.com) in 144 ms

Primeiramente consultamos os root servers, que estão em nosso servidor essa info, logo perceba que ele fez a consulta dos root servers em localhost, em seguida um dos root servers falou para ele que é são os DNS responsáveis do .br e no exemplo ele escolheu o a.root-servers.net, que falou para ele quem são os DNS fo google, e o DNS do google, neste cado o c.dns.br falou qual é o IPv4 (A) do google.com.br = 42.250.219.195, o valor 300 é o tempo que seu servidor irá armazenar essa resposta em cache. Eu levaria muito tempo para explicar aqui, então quando tiver um curso meu de DNS não fique de fora 🙂

Configurando Recursivo no DNS Master

Nesse cenário vou usar os prefixos 45.80.48.0/22 e 2804:f123::/32 (desculpe caso seja de alguém)

Edite:

# vim /etc/bind/named.conf.options

A explicação de todos os campos e variáveis estão nos comentários do arquivo:

// ACL "autorizados" essa colocamos os IPs que são autorizados a fazer consultas recursivas neste servidor.
// Neste caso vou incluir os IPs que foram nos delegados bem como de localhost e todos IPs privados.
acl autorizados {
        127.0.0.1;
        ::1;
        192.168.0.0/16;
        172.16.0.0/12;
        100.64.0.0/10;
        10.0.0.0/8;
        2001:db8::/32; 
        fd00::/8; 
        fe80::/10; 
        fc00::/8;        
        45.80.48.0/22;
        2804:f123::/32;
}; 

options {
    // O diretório de trabalho do servidor
    // Quaisquer caminho não informado será tomado como padrão este diretório
    directory "/var/cache/bind";
 
    //Suporte a DNSSEC
    dnssec-validation auto;
 
    // Conforme RFC1035
    // https://www.ietf.org/rfc/rfc1035.txt
    // Se o servidor deve responder negativamente (NXDOMAIN) para consultas de domínios que não existem.
    auth-nxdomain no;
 
    // Respondendo para IPv4 e IPv6
    // Porta 53 estará aberta para ambos v4 e v6 (pode ser informar apenas os IPs que ficarão ouvindo)
    // ex listen-on { 127.0.0.1; 45.80.48.2; }; 
    // ex listen-on-v6 { ::1; 2804:f123:bebe:cafe::2; };
    // ou any para todos os IPs das interfaces (recomendado, pricipalmente em anycast)
    listen-on { any; };
    listen-on-v6 { any; };
 
    // Serve como uma ferramenta de mitigação para o problema de ataques de amplificação de DNS
    // No momento, a implementação de RRL (Response Rate Limiting)é recomendada apenas para servidores autoritativos
    // Se seu servidor será apenas autoritativo descomente as linhas a baixo. (https://kb.isc.org/docs/aa-00994)
    //rate-limit {
    //    responses-per-second 15;
    //    window 5;
    //};
 
    // Informações adicionais em suas respostas DNS
    // Melhora o desempenho do servidor, reduzindo os volumes de dados de saída.
    // O padrão BIND é (no) não.
    minimal-responses yes;

    // Reduzir o tráfego da rede e aumentar o desempenho, o servidor armazena respostas negativas.
    // é usado para definir um tempo máximo de retenção para essas respostas no servidor. (segundos)
    // Determina por quanto tempo o servidor irá acreditar nas informações armazenadas em cache de 
    // respostas negativas (NXDOMAIN) antes de buscar novamente informações.
    max-ncache-ttl 300;

    // Desativar recursão. Por padrão já é yes.
    // recursion no;
 
    // Especifica quais hosts estão autorizados a fazer consultas
    // recursivas através deste servidor.
    // Aqui que você vai informar os IPs da sua rede que você irá permitir consultar os DNS.
    allow-recursion { autorizados; };
 
    // Endereço estão autorizados a emitir consultas ao cache local,
    // sem acesso ao cache local as consultas recursivas são inúteis.
    allow-query-cache { autorizados; };
 
    // Especifica quais hosts estão autorizados a “fazer perguntas” ao seu DNS. 
    // Se for apenas recursivo pode informa a ACL “autorizados” 
    // allow-query { autorizados; };
    allow-query { any; };
 
    // Especifica quais hosts estão autorizados a receber transferências de zona a partir do servidor.
    // Seu servidor Secundário, no nosso ex vou deixar então o ips dos dois servidores v4 e v6.
    allow-transfer {
        45.80.48.3;
        2804:f123:bebe:cafe::3;
    };
    also-notify {
        45.80.48.3;
        2804:f123:bebe:cafe::3;
    };
 
    // Esta opção faz com que o servidor slave ao fazer a transferência de zonas
    // mastes deste servidor no formato binário (raw) do arquivo ou texto (text)
    // text será legível por humanos, já raw formato é mais eficiente em termos de desempenho.
    // masterfile-format raw;
    masterfile-format text;

    // Para evitar que vase a versao do Bind, definimos um nome
    // Reza a lenda que deixar RR DNS Server seu servidor nunca sofrerá ataques.
    version "RR DNS Server – Do good";

    // Define a quant. máxima de memória a ser usada para o cache do servidor (bytes ou porcentagem)
    // Por padrão no debian 10/bind9 ele reserva 90% da memoria física. Então não se apavore com log ex.:
    // Servidor com 2GB: none:106: 'max-cache-size 90%' - setting to 1795MB (out of 1994MB)
    // Recomendo não alterar
    // max-cache-size 512M;
    // max-cache-size 50%;

    // Isso define o tempo mínimo para o qual o servidor armazena 
    // em cache as respostas positivas, em segundos.
    // Ex o tiktok.com manda tempo de ttl de 20 segundos, 
    // e você quer ignorar esse valor 20 e setar que o minimo seja 90.
    // que é o máximo permitido.
    min-cache-ttl 90;

    // Não recomendado alterar para menos que 24h.
    // Define o tempo máximo durante o qual o servidor armazena (informado pelo dono do domínio)
    // em cache as respostas positivas, em segundos. O max-cache-ttl padrão é 604800 (uma semana) 
    // max-cache-ttl 86400; // 24h 

};

Leitura recomendada:
https://bind9.readthedocs.io/en/latest/reference.html
https://downloads.isc.org/isc/bind9/9.11.24/doc/arm/Bv9ARM.ch06.html

Para verificar se seu arquivo tem algum erro use o comando named-checkconf

# named-checkconf /etc/bind/named.conf.options

Imprime todas as configurações

# named-checkconf -p

Bem útil para você mandar suas conf quando esta com algum problema lá no grupo do telegram 🙂

Reinicie o bind9 para que as novas configurações sejam carregadas, e verifique se o serviço subiu sem erros.

# systemctl restart bind9
# systemctl status bind9
# systemctl restart bind9
# systemctl status bind9

Configurando Recursivo (Slave)

Não esqueça da parte do fail2ban e nftables.

# vim /etc/bind/named.conf.options

Já explicado no master, a diferença aqui aqui não temos os campos allow-transfer e also-notify, já que ele é o servidor secundário.

acl autorizados {
        127.0.0.1;
        ::1;
        192.168.0.0/16;
        172.16.0.0/12;
        100.64.0.0/10;
        10.0.0.0/8;
        2001:db8::/32; 
        fd00::/8; 
        fe80::/10; 
        fc00::/8;        
        45.80.48.0/22;
        2804:f123::/32;
}; 

options {
    directory "/var/cache/bind";
    dnssec-validation auto;
    auth-nxdomain no;
    listen-on { any; };
    listen-on-v6 { any; };
    minimal-responses yes;
    max-ncache-ttl 300;
    allow-recursion { autorizados; };
    allow-query-cache { autorizados; };
    //allow-query { autorizados; }; //Se apenas for recursivo
    allow-query { any; };
    allow-transfer { none; };
    masterfile-format text;
    version "RR DNS Server";
};

Reinicie o bind9 para que as novas configurações sejam lidas, e verifique se o serviço subiu sem erros.

# systemctl restart bind9
# systemctl status bind9

Colocando o fail2ban para protege seu DNS (Master/Slave)

Ele irá ler os logs do bind com tentativas de consultas negadas (denied), para isso precisamos configurar nosso bind para gerar tal logs.Faça isso no Mastere Slave.

# vim /etc/bind/named.conf

Adicione logging { … }:

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the 
// structure of BIND configuration files in Debian, *BEFORE* you customize 
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

logging {
 
    channel security_file {
        file "/var/log/named/security.log" versions 3 size 30m;
        severity dynamic;
        print-time yes;
    };
 
    channel file_log {
        file "/var/log/named/bind.log" versions 3 size 1m;
        severity info;
        #severity debug 3;
        print-time yes;
        print-severity yes;
        print-category yes;
    };
 
    channel dnssec_log {
        file "/var/log/named/dnssec.log" versions 3 size 1m;
        severity warning;
        print-time yes;
    };
 
    category security { security_file; };
    category default { file_log; };
    category dnssec { dnssec_log; };
    category lame-servers { null; };
    category edns-disabled { null; };
    category resolver { null; };
    category unmatched { null; };
 
};

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

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

# mkdir /var/log/named/
# chown bind: /var/log/named/

Reinicie o serviço

# systemctl restart bind9

Iremos criar um filtro para ler os logs do bind

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

Adicione:

# Fail2Ban filter file for named (bind9).
# v9.18.x

# This filter blocks attacks against named (bind9) however it requires special
# configuration on bind.
#
# By default, logging is off with bind9 installation.
#
# You will need something like this in your named.conf to provide proper logging.
#
# logging {
#     channel security_file {
#         file "/var/log/named/security.log" versions 3 size 30m;
#         severity dynamic;
#         print-time yes;
#     };
#     category security {
#         security_file;
#     };
# };

[Definition]

# Daemon name
_daemon=named(?:-\w+)?

# Shortcuts for easier comprehension of the failregex

__pid_re=(?:\[\d+\])
__daemon_re=\(?%(_daemon)s(?:\(\S+\))?\)?:?
__daemon_combs_re=(?:%(__pid_re)s?:\s+%(__daemon_re)s|%(__daemon_re)s%(__pid_re)s?:)

_category = (?!error|info)[\w-]+
_category_re = (?:%(_category)s: )?

#       hostname       daemon_id         spaces
# this can be optional (for instance if we match named native log files)
__line_prefix=\s*(?:\S+ %(__daemon_combs_re)s\s+)?%(_category_re)s

prefregex = ^%(__line_prefix)s(?:(?:error|info):\s*)?client(?: @\S*)? #\S+(?: \([\S.]+\))?: .+\s(?:denied|denied \(allow-query-cache did not match\)|\(NOTAUTH\))\s*$

failregex = ^(?:view (?:internal|external): )?query(?: \(cache\))?
            ^zone transfer
            ^bad zone transfer request: '\S+/IN': non-authoritative zone

ignoreregex =

# DEV Notes: Debian 12
# Author: Rudimar Remontti

Ativamos o filtro que criamos, e definimos o tempo de banimento para 12h, se você desejar pode ajustar para mais ou menos se achar necessário. E “maxretry” que é a quantidade de tentativas usaremos 1, limitando a 1 tentativa (não recomendo alterar) apenas para já ser bloqueado.

# vim /etc/fail2ban/jail.d/bind9.conf
[bind9]
enabled  = true
port     = domain,953
protocol = tcp
logpath  = /var/log/named/security.log
bantime  = 12h
maxretry = 1

Em seguida ativamos reinciamos os serviços.

# systemctl restart fail2ban
# systemctl status fail2ban

Consulte se o filtro bind9 foi carregado

# fail2ban-client status
Status
|- Number of jail:      2
`- Jail list:   bind9, sshd

Para validar realize um teste de um servidor externo não autorizado à resolver nomes em seu servidor com o comando dig, ex:

# dig @ip_so_seu_dns google.com.br

Deixe rodando o comando para visualizar os logs.

# tail -f /var/log/named/security.log

Log como ira aparecer, onde 192.168.254.198 é o IP que tentou resolver nomes e google.com.br foi o dóminio.

25-Oct-2021 17:57:09.284 client @0x7f79e80104c8 192.168.254.198#63239 (google.com.br): query (cache) 'google.com.br/A/IN' denied

Verificando agora o fail2ban vamos encontrar o IP 192.168.254.198 em Banned IP list.

# fail2ban-client status bind9
Status for the jail: bind9
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     1
|  `- File list:        /var/log/named/security.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   192.168.254.198

Verificando as regras do firewall nftables também iremos encontra-lo.

# nft list ruleset
table inet filter {
        chain input {
                type filter hook input priority filter; policy accept;
        }

        chain forward {
                type filter hook forward priority filter; policy accept;
        }

        chain output {
                type filter hook output priority filter; policy accept;
        }
}
table inet f2b-table {
        set addr-set-bind9 {
                type ipv4_addr
                elements = { 192.168.254.198 }
        }

        chain f2b-chain {
                type filter hook input priority filter - 1; policy accept;
                ip saddr @addr-set-bind9 drop
        }
}

Para remover o IP basta:

# fail2ban-client set bind9 unbanip 192.168.254.198

Atualização dos Roots servers

Não é comum os Roots Servers terem alguma alteração, mas é algo que ao logo desses anos vi acontecer já, então caso um dia precise atualiza-los. Primeiramente renomei o arquivo atual root.hints

# mv /usr/share/dns/root.hints /usr/share/dns/root.hints.`date +%Y%m%d`

Agora vamos baixar a versão mais recente.

# apt install wget 
# wget https://www.internic.net/domain/named.root -O /usr/share/dns/root.hints

Para visualizar se tem alguma diferença entre os arquivos execute o comando:

# diff /usr/share/dns/root.hints /usr/share/dns/root.hints.`date +%Y%m%d`

Perceba que o que mudou apenas foi a data em last update. Resto do arquivo continua igual.

11,13c11,13
< ;
< ;       last update:     October 14, 2021
< ;       related version of root zone:     2021101401
---
> ; 
> ;       last update:     January 11, 2021 
> ;       related version of root zone:     2021011101

Desativar IPv6 do bind 🙁

Se por algum motivo precisar desabilitar faça:

# vim /etc/default/named
OPTIONS="-u bind"

Para

OPTIONS="-4 -u bind"
# vim /etc/bind/named.conf.options
listen-on-v6 { any; };

Para

listen-on-v6 { none; };

Reinicie o serviço

# systemctl restart bind

Configurando um proxy do DNS recursivo

Está confiuração deixará de usar os Root Serves e irá fazer as consultar em outros servidores DNS, e armazenar no seu cache local.

# vim /etc/bind/named.conf.options

Adicione dentro de options { ….. }

  recursion yes;
  forwarders {
      8.8.8.8;
      1.1.1.1;
      1.0.0.1;
      8.8.4.4;
  };
  forward only;

Comando dig

Algumas coisas que você precisa saber, ex:

# dig google.com.br @localhost
; <<>> DiG 9.16.15-Debian <<>> google.com.br @localhost
; <<>> DiG 9.16.15-Debian <<>> google.com.br @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49083
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 595c2c7eb1d62205010000006177f1e2e08119b0ec4133aa (good)
;; QUESTION SECTION:
;google.com.br.                 IN      A

;; ANSWER SECTION:
google.com.br.          300     IN      A       172.217.173.67

;; AUTHORITY SECTION:
google.com.br.          3599    IN      NS      ns1.google.com.
google.com.br.          3599    IN      NS      ns4.google.com.
google.com.br.          3599    IN      NS      ns3.google.com.
google.com.br.          3599    IN      NS      ns2.google.com.

;; ADDITIONAL SECTION:
ns1.google.com.         172800  IN      AAAA    2001:4860:4802:32::a
ns2.google.com.         172800  IN      AAAA    2001:4860:4802:34::a
ns3.google.com.         172800  IN      AAAA    2001:4860:4802:36::a
ns4.google.com.         172800  IN      AAAA    2001:4860:4802:38::a
ns1.google.com.         172800  IN      A       216.239.32.10
ns2.google.com.         172800  IN      A       216.239.34.10
ns3.google.com.         172800  IN      A       216.239.36.10
ns4.google.com.         172800  IN      A       216.239.38.10

;; Query time: 1560 msec
;; SERVER: ::1#53(::1)
;; WHEN: ter out 26 09:17:38 -03 2021
;; MSG SIZE  rcvd: 344

O resultado retornará algumas seções, porém como configuramos no named.conf.options minimal-responses yes, iremos ter apenas 3. Isso deixa seu DNS mais otimizado, além do mais yes é o padrão agora na versão 9.16 do bind, caso queira testar experimente setar em: no.

; <<>> DiG 9.16.15-Debian <<>> google.com.br @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13858
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 38763b6c79757a2a010000006177f255c6a6a6d3e4833e77 (good)
;; QUESTION SECTION:
;google.com.br.                 IN      A

;; ANSWER SECTION:
google.com.br.          300     IN      A       172.217.173.67

;; Query time: 1524 msec
;; SERVER: ::1#53(::1)
;; WHEN: ter out 26 09:19:33 -03 2021
;; MSG SIZE  rcvd: 86

HEADER: Ela contém diversas informações a respeito da consulta.

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49083
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9

- status indica o tratamento de erro nas consultas, sendo eles:
-- NOERROR: Nenhum erro encontrado, ou seja, sucesso.
-- SERVFAIL: Houve algum problema com o servidor, que não conseguiu processar a query.
-- NXDOMAIN: Significa que o domínio pesquisado não existe.
-- REFUSED: O servidor rejeitou a solicitação.
-flags: indicador das opções de recursividade e de autoridade, em resumo este conjunto de “letrinhas” (aa, rd, ra, etc), indica o estado ligado/desligado RFC1035
-- qr: se a mensagem é uma query (0) ou uma resposta (1). Como estamos avaliando somente as respostas, este bit sempre estará ligado (consequentemente, sempre veremos a string “qr” no campo “flags“).
-- aa: que o servidor que respondeu à solicitação é autoritativo do domínio.
-- rd: que a query é recursiva, que as requisições devem ser encaminhadas a outros servidores até que o servidor autoritativo seja encontrado.
-- ra: que o servidor que respondeu à requisição suporta consultas recursivas.
-- tc: que a mensagem de resposta está truncada.
-- z: reservado para uso futuro.
- contadores: na mesma linha das flags, econtramos quantos resultados vieram nas sessões.

QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9

QUESTION
Replica a query que foi enviada para consulta, por padão quando não passa A = IPv4

;; QUESTION SECTION:
;google.com.br.                 IN      A

Outros exemplos:

# dig AAAA google.com.br @localhost
# dig MX google.com.br @localhost
# dig NS google.com.br @localhost
# dig TXT google.com.br @localhost
# dig ANY google.com.br @localhost

ANSWER
Contém a resposta para a consulta que foi enviada.

;; ANSWER SECTION:
google.com.br.          86400   IN      CAA     0 issue "pki.goog"
google.com.br.          60      IN      SOA     ns1.google.com. dns-admin.google.com. 405356128 900 900 1800 60
google.com.br.          300     IN      AAAA    2800:3f0:4001:819::2003
google.com.br.          300     IN      A       172.217.173.67
google.com.br.          300     IN      MX      0 smtp.google.com.
google.com.br.          300     IN      TXT     "v=spf1 -all"
google.com.br.          2774    IN      NS      ns4.google.com.
google.com.br.          2774    IN      NS      ns2.google.com.
google.com.br.          2774    IN      NS      ns1.google.com.
google.com.br.          2774    IN      NS      ns3.google.com.

AUTHORITY
Servidores que respondem com “autoridade” pelo domínio (os NS)

;; AUTHORITY SECTION:
google.com.br.          3599    IN      NS      ns1.google.com.
google.com.br.          3599    IN      NS      ns4.google.com.
google.com.br.          3599    IN      NS      ns3.google.com.
google.com.br.          3599    IN      NS      ns2.google.com.

ADDITIONAL
Informações auxiliares ou adicionais à pesquisa, no exemplo IPs dos servidores DNS

;; ADDITIONAL SECTION:
ns1.google.com.         172800  IN      AAAA    2001:4860:4802:32::a
ns2.google.com.         172800  IN      AAAA    2001:4860:4802:34::a
ns3.google.com.         172800  IN      AAAA    2001:4860:4802:36::a
ns4.google.com.         172800  IN      AAAA    2001:4860:4802:38::a
ns1.google.com.         172800  IN      A       216.239.32.10
ns2.google.com.         172800  IN      A       216.239.34.10
ns3.google.com.         172800  IN      A       216.239.36.10
ns4.google.com.         172800  IN      A       216.239.38.10

E na ultima sessão entrosamos podemos dizer mais 4 sub sessões:

;; Query time: 1560 msec
;; SERVER: ::1#53(::1)
;; WHEN: ter out 26 09:17:38 -03 2021
;; MSG SIZE  rcvd: 344

- QUERY TIME: vai informar o tempo que levou para realizar a consulta solicitada, quando esse tempo retora 0 é porque a consulta ele pegou do cache.
- SERVER: Qual servidor ele realizou a consulta
- WHEN: dara e hora da consulta + UTC
- MSG SIZE: tamanho do pacote

😉 Um pouquinho de dig para vocês!

Seu DNS recursivo já está pronto, se seu intuito é apenas um DNS recursivo pode pular a parte do autoritativo/reverso, e eu recomendo que você crie uma regra extra no seu nftables (firewall) para fechar a porta 53 externamente, então vou deixar um modelo dessa configuração:
ISSO SÓ DEVER SER FEITO SE SEU DNS FOR APENAS RECURSIVO!

# vim /etc/nftables.conf

Em elements, altere para os seus IPs que terão permissão, o arquivo é quase que auto explicativo. Eu vou aproveitar e criar uma proteção para o SSH e o Zabbix agent

#!/usr/sbin/nft -f
  
flush ruleset

table inet filter {

    set acesso-total4 {
        type ipv4_addr
        flags interval
        elements = { 200.200.200.0/26, 200.200.200.128/29 }
    }
    set acesso-total6 {
        type ipv6_addr
        flags interval
        elements = { 2001:db8:f0da::/48 }
    }
    set acesso-dns4 {
        flags interval
        type ipv4_addr
        elements = { 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, 200.200.200.0/22 }
    }
    set acesso-dns6 {
        flags interval
        type ipv6_addr
        elements = { ::1, 2001:db8::/32 }
    }
    chain input {
        type filter hook input priority 0;

        #ip saddr  @acesso-total4 accept
        #ip6 saddr @acesso-total6 accept

        # Permite acesso SSH na porta 22 (alterada para 60002), a 22 eu fecho só de sacanagem, para aparecer filtrada nos scanners
        ip saddr  @acesso-total4 tcp dport 22 counter accept
        ip6 saddr @acesso-total6 tcp dport 22 counter accept
        ip saddr  @acesso-total4 tcp dport 60002 counter accept
        ip6 saddr @acesso-total6 tcp dport 60002 counter accept
        tcp dport 22 counter drop
        tcp dport 60002 counter drop

        # Permite coleta de dados pelo Zabbix-Agent na porta 10050
        ip saddr  @acesso-total4 tcp dport 10050 counter accept
        ip6 saddr @acesso-total6 tcp dport 10050 counter accept
        tcp dport 10050 counter drop   

        # Permite Acesso DNS na porta 53
        ip saddr  @acesso-dns4 udp dport 53 counter accept
        ip saddr  @acesso-dns4 tcp dport 53 counter accept
        ip6 saddr @acesso-dns6 udp dport 53 counter accept
        ip6 saddr @acesso-dns6 tcp dport 53 counter accept
        udp dport 53 counter drop
        tcp dport 53 counter drop

        type filter hook input priority 0;
    }
    chain forward {
        type filter hook forward priority 0;
    }
    chain output {
        type filter hook output priority 0;
    }
}

Reinicie os serviços

# systemctl restart nftables fail2ban

Autoritativo

Valorize os domínios.br registrados no https://registro.br/ o memos financia todo o projeto NIC.BR, que na internet brasileira tem uma papel fundament

Configuração do Autoritativo (Master)

Para ficar organizado criaremos alguns diretórios em /var/cache/bind/. Primeiramente a pasta master-aut que se é referencia onde vai ficar nossa configuração do DNS Master autoritativo, e dentro desta pasta uma com o nome do nosso domínio no exemplo remontti.net.br, assim se você tiver vários dominios criamos uma pasta para cada ficando bem organizado.

# mkdir /var/cache/bind/master-aut
# mkdir /var/cache/bind/master-aut/remontti.net.br

Agora vamos criar um em /var/cache/bind/master-aut/remontti.net.br/ para que conter toda a configuração do mesmo, e para ficar objetivo adotei em usar o nome do próprio domínio.hosts ex: remontti.net.br.hosts

# vim /var/cache/bind/master-aut/remontti.net.br/remontti.net.br.hosts

É importante que o serial (2021102601) seja alterado toda vez que for o aruquivo sofrer qualquer alteração, assim o servidor slave saberá que precisa importar novamente as configurações. Ele segue o padrão [ano-mes-dia-sequencial] não que seja uma regra.

$ORIGIN .
$TTL 86400 ; 1 day
remontti.net.br        IN SOA  ns1.remontti.net.br. hostmaster.remontti.net.br. (
                            2023020101 ; serial
                            14400      ; refresh (4 hours)
                            3600       ; retry (1 hour)
                            2419200    ; expire (4 weeks)
                            300        ; minimum (5 minutes)
                            )
 
                        NS      ns1.remontti.net.br.
                        NS      ns2.remontti.net.br.
 
                        A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4

$ORIGIN remontti.net.br.
$TTL 10800   ; 3 hours
 
ns1                     A       45.80.48.2
                        AAAA    2804:f123:bebe:cafe::2
hostmaster              A       45.80.48.2
                        AAAA    2804:f123:bebe:cafe::2

ns2                     A       45.80.48.3
                        AAAA    2804:f123:bebe:cafe::3

www                     A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4

No exemplo estou confiurando apenas alguns subdomínos básicos, como ns1, ns2, www e apontando ele para seus respectivos endereços IPv4 e IPv6, os ipos mais comuns de registros:
- A: Associa um nome a um endereço IPv4.
- AAAA: Associa um nome a um endereço IPv6.
- NS: Name Server. Define quais servidores são os servidores autoritativos do domínio
- SOA: Start-Of-Authority. Detalhes da autoridade do domínio. Descreve o servidor que tem autoridade sobre a zona, além do contato técnico, número serial e outros campos.
- MX: Mail eXchanger. Define os servidores de e-mail.
- PTR: Pointer. Retorna o nome associado a um endereço IP. (reverso)
- CNAME: Canonical NAME. Usados para criar apelidos para o domínio.
- TXT: TeXT. Usados para descrições, comentários, observações de um domínio. Também usado para definir configurações de SPF.

Vamos criar um diretório para gerar nossas keys do DNSSEC.

# mkdir /var/cache/bind/master-aut/remontti.net.br/keys

Entre no diretório:

# cd /var/cache/bind/master-aut/remontti.net.br/keys

Agora vamos a criação das chaves:

# dnssec-keygen -a ECDSAP256SHA256 remontti.net.br
Generating key pair.
Kremontti.net.br.+007+29298
# dnssec-keygen -a ECDSAP256SHA256 -f KSK remontti.net.br
Generating key pair.
Kremontti.net.br.+007+26883

Os comandos acima irão gerar 4 arquivos com extensões .key e .private

├── Kremontti.net.br.+007+26883.key
├── Kremontti.net.br.+007+26883.private
├── Kremontti.net.br.+007+29298.key
└── Kremontti.net.br.+007+29298.private

Altere as permissões de diretórios/arquivos para que o bind consiga criar as assinaturas de forma automaticamente.

# chown bind: /var/cache/bind/master-aut/ -R

Em /etc/bind/named.conf.local "chamaremos" a zona remontti.net.br

# vim /etc/bind/named.conf.local

Adicione ao final do arquivo:

zone "remontti.net.br" {
        type master;
        file "/var/cache/bind/master-aut/remontti.net.br/remontti.net.br.hosts";
        key-directory "/var/cache/bind/master-aut/remontti.net.br/keys/";
        dnssec-policy default;
        inline-signing yes;
        serial-update-method unixtime;
};

Para facilitar farei um atalho da pasta /var/cache/bind/master-aut em /etc/bind/master-aut.

Se você é da turma do mimi você pode subistiruir `type master` por `type primary` e `type slave` por `type secondary` bem como nome das pastas. 😛

# ln -s /var/cache/bind/master-aut /etc/bind/master-aut

Reinicie o serviço.

# systemctl restart bind9

Certifique-se que o bind esta rodando sem erros

# systemctl status bind9

Novos arquivos são gerados em /var/cache/bind/master-aut/remontti.net.br/ .jbk .signed .signed.jnl

└── remontti.net.br
    ├── keys
    │   ├── Kremontti.net.br.+007+26883.key
    │   ├── Kremontti.net.br.+007+26883.private
    │   ├── Kremontti.net.br.+007+29298.key
    │   └── Kremontti.net.br.+007+29298.private
    ├── remontti.net.br.hosts
    ├── remontti.net.br.hosts.jbk
    ├── remontti.net.br.hosts.signed
    └── remontti.net.br.hosts.signed.jnl

Precisaremos descobri nossa keytag e o digest que serão informados no registro.br, para isso rode o comando:

# (d=remontti.net.br; dig @127.0.0.1 +norecurse "$d". DNSKEY | dnssec-dsfromkey -f - "$d" | head -1)
remontti.net.br. IN DS 26883 7 2 F8C2518674B22DB06B1EF38E030F9A238E4FA25D0E2FB80357496E92617FF841

Sendo, keytag:26883 e o digest: F8C2518674B22DB06B1EF38E030F9A238E4FA25D0E2FB80357496E92617FF841

Possíveis bloqueios do fail2ban em caso de configuração errada, ao verificação de um domínios que seu servidor não é autoritativo, ou por um erro na configuração, a consulta será interpretada como recursiva, logo o IP de origem será bloqueado pelo fail2ban, e registrado no arquivo de logs /var/log/named/security.log.

Para evitar fail2ban bloquei seus IPs e pricnipalmente do registro.br, pois muitas pessoas acabam configurando errado seu DNS e na hora de verificar acabam sendo bloqueando. Para evitarmos isso vamos incluir seus IPs bem como os do registrobr na variável ignoreip do fail2ban:

# vim /etc/fail2ban/jail.conf

Localize #ignoreip =, remova o comentário (#) e inclua os prefixo do registrobr 200.160.0.0/20 200.219.148.0/24 2001:12f8:6::/47 2001:12ff::/32 bem como altere 45.80.48.0/22 2804:f123::/32 para IPs do seu AS

ignoreip = 127.0.0.1/8 ::1 200.160.0.0/20 200.219.148.0/24 2001:12f8:6::/47 2001:12ff::/32 45.80.48.0/22 2804:f123::/32

Reinicie o fail2ban

# systemctl restart fail2ban

Configuração do Autoritativo (Slave)

A configuração do slave é bem simples, pois ele irá importar do master todas as configurações.
Para organização vamos seguir o mesmo padrão de diretórios do master

# mkdir /var/cache/bind/slave-aut
# mkdir /var/cache/bind/slave-aut/remontti.net.br

Informamos nossa zona do tipo slave e o IP do nosso servidor master.

# vim /etc/bind/named.conf.local
zone "remontti.net.br" {
        type slave;
        file "/var/cache/bind/slave-aut/remontti.net.br/remontti.net.br.hosts.signed";
        masters { 45.80.48.2; };
        allow-notify { 45.80.48.2; };
};

Alteramos a permissão do diretório para que o bind consiga criar os arquivos.

# chown  bind: /var/cache/bind/slave-aut -R

Mais uma vez farei uma atalho dentro de /etc/bind para facilitar.

# ln -s /var/cache/bind/slave-aut /etc/bind/slave-aut

E reiniciamos o serviço

# systemctl restart bind9

Agora ao verificar o diretório /var/cache/bind/slave-aut/remontti.net.br/ encontraremos nosso arquivo criado automaticamente importado do servidor master.

# ls -lhs /var/cache/bind/slave-aut/remontti.net.br

Validando seu autoritativo no registro.br

Vamos verificar se o servidor responde pelo nosso domínio, acesse: https://registro.br/tecnologia/ferramentas/verificacao-de-dns/ e preecha o formulário com o seu domínio "remontti.net.br" e o IP do seu servidor e clique em pesquisar.
RESULTADO

DOMÍNIO           : remontti.net.br
DNS               : 45.80.48.2
STATUS            : Autoridade sobre o domínio
VERSÃ             : O2021102601
TEMPO DE RESPOSTA : 19.422 ms

Se seu servidor DNS estiver respondedo pelo domínio solicitado uma resposta de sucesso ira apacer: Autoridade sobre o domínio. Repita o mesmo no seu servidor Slave
Agora vamos fazer o mesmo para validade nosso DNSSEC, acesse: https://registro.br/tecnologia/ferramentas/verificacao-de-ds/ e preecha o formulário com o seu domínio "remontti.net.br" e o IP do seu servidor e clique em pesquisar.
RECORDS DS DAS CHAVES ENCONTRADAS

KEY TAG	  ALGORITMO	        DIGEST DS
26883	  RSA-SHA-1-NSEC3	F8C2518674B22DB06B1EF38E030F9A238E4FA25D0E2FB80357496E92617FF841

Se tudo estiver OK, ira receber o resultado da sua KEYTAG e DISGEST bem como encontrado anteriormente.

Seu domínio já está pronto para ser configurado no registro.br, para isso acesse sua conta clique sobre seu domínio e clique em: ALTERAR SERVIDORES DNS, e preecha o formulário, exemplo:

Posso ter mais de um autoritativo no mesmo servidor?

Sim, inclusive o reverso é um autoritavio, vamos falar dele em seguida. Não existe um limite, o limite é seu hardware.
Veja mais um exemplo para um segundo domínio:

# mkdir /var/cache/bind/master-aut/cursodns.com.br
# vim /var/cache/bind/master-aut/cursodns.com.br/cursodns.com.br.hosts

Adicione:

$ORIGIN .
$TTL 86400 ; 1 day
cursodns.com.br           IN SOA  ns1.cursodns.com.br. hostmaster.cursodns.com.br. (
                            2023020101 ; serial
                            14400      ; refresh (4 hours)
                            3600       ; retry   (1 hour)
                            2419200    ; expire  (4 weeks)
                            300        ; minimum (5 minutes)
                            )
 
                        NS      ns1.cursodns.com.br.
                        NS      ns2.cursodns.com.br.
 
                        A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4
                        MX      10 mail.cursodns.com.br.
                        TXT     "v=spf1 a mx -all"
                        SPF     "v=spf1 a mx -all"

$ORIGIN cursodns.com.br.
_dmarc                  TXT "v=DMARC1; p=none"
_domainkey              TXT "t=y; o=~;"

$ORIGIN _domainkey.cursodns.com.br.
mail                    TXT "v=DKIM1; k=rsa; p=6B4EDqoi5l64qyxnenKx56IOIjPAnj350mq"

$ORIGIN cursodns.com.br.
$TTL 10800   ; 3 hours
 
ns1                     A       45.80.48.2
                        AAAA    2804:f123:bebe:cafe::2
hostmaster              A       45.80.48.2
                        AAAA    2804:f123:bebe:cafe::2

ns2                     A       45.80.48.3
                        AAAA    2804:f123:bebe:cafe::3

www                     A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4
ftp                     A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4
imap                    A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4
pop                     A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4
smtp                    A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4
mail                    A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4

Vamos criar um diretório para gerar nossas keys do DNSSEC.

# mkdir /var/cache/bind/master-aut/cursodns.com.br/keys

Entre no diretório:

# cd /var/cache/bind/master-aut/cursodns.com.br/keys

Agora vamos a criação das chaves:

# dnssec-keygen -a ECDSAP256SHA256 cursodns.com.br
Generating key pair.
Kcursodns.com.br.+007+00558
# dnssec-keygen -a ECDSAP256SHA256 -f KSK cursodns.com.br
Generating key pair.
Kcursodns.com.br.+007+46491

Altere as permissões de diretórios/arquivos para que o bind consiga criar as assinaturas de forma automaticamente.

# chown bind: /var/cache/bind/master-aut/ -R

Adicione a zona cursodns.com.br em named.conf.local

# vim /etc/bind/named.conf.local

Adicione ao final do arquivo:

zone "cursodns.com.br" {
        type master;
        file "/var/cache/bind/master-aut/cursodns.com.br/cursodns.com.br.hosts";
        key-directory "/var/cache/bind/master-aut/cursodns.com.br/keys/";
        dnssec-policy default;
        inline-signing yes;
        serial-update-method unixtime;
};

Se desejar validar seu arquivo antes de reiniciar o serviço:

# cd /var/cache/bind/master-aut/
# named-checkzone cursodns.com.br cursodns.com.br.hosts

Tudo ok, altere as permissões para não ter erro, e reinicie o bind:

# chown  bind: /var/cache/bind/master-aut -R
# systemctl restart bind9

Para o Slave

# mkdir /var/cache/bind/slave-aut/cursodns.com.br
# vim /etc/bind/named.conf.local
zone "cursodns.com.br" {
        type slave;
        file "/var/cache/bind/slave-aut/cursodns.com.br/cursodns.com.br.hosts.signed";
        masters { 45.80.48.2; };
        allow-notify { 45.80.48.2; };
};
# chown  bind: /var/cache/bind/slave-aut -R
# systemctl restart bind9

Posso ter domínios "fakes"?
Sim, basta criar uma zona. Mas juridicamente você pode ter dor de cabeça. Recomendo a leitura do DNS Response Policy Zone (RPZ) para que retornem resultados modificados em grande escala de uma foma mais eficaz. Alguns administradores podem usar o DNS RPZ para impedir acessos indesejados, normalmente é usado em empresas para bloquear por exemplo hosts infectados por malwares, sites pornográficos, entre outros casos, bloqueando a resolução de nomes. Segue um modelo simples e rápido para montar seu RPZ.

# vim /var/cache/bind/master-aut/cursodns.com.br/cursodns.com.br.hosts

Adicione mais uma entrada em para um novo subdominio "umbrella" apontando para um servidor, esse pode está rodando um serviço web qual pode ter uma tela com um aviso.

//...
umbrella                        A       45.80.48.5
                                AAAA    2804:f123:bebe:cafe::5
//...

Adicione uma nova zona chamada rpz.zone

# vim /etc/bind/named.conf.local
zone "rpz.zone" {
    type master;
    file "/var/cache/bind/rpz/db.rpz.zone";
    allow-query { none; };
};
# vim /etc/bind/named.conf.options

Dentro de options { ... } adcione:

options {
//...
    response-policy {
      zone "rpz.zone" policy CNAME umbrella.cursodns.com.br;
    };
//...

};
Criaremos o diretório rpz, bem como o arquivos de hosts

# mkdir /var/cache/bind/rpz/
# ln -s /var/cache/bind/rpz/ /etc/bind/rpz
# vim /var/cache/bind/rpz/db.rpz.zone
$TTL 1H
@       IN      SOA LOCALHOST. umbrella.cursodns.com.br. (
                2023020101      ; Serial  
                1h              ; Refresh
                15m             ; Retry
                30d             ; Expire 
                2h              ; Negative Cache TTL
        )
        NS  umbrella.cursodns.com.br.
 
xvideos.com     IN CNAME .
*.xvideos       IN CNAME .
redtube.com     IN CNAME .
*.redtube.com   IN CNAME .
pornhub.com     IN CNAME .
*.pornhub.com   IN CNAME .

Sendo que para cada dominio que você deseja apontar para resolver o mesmo IP do nosso umbrella.cursodns.com.br siga este padrão:

domino.com     IN CNAME .
*.domino.com       IN CNAME .

Assim qualquer subidominio (*).domino.com seja traduzido sempre para o mesmo IP.

Altere as permissões e reinicie o serviço

# chown bind: /var/cache/bind/rpz/ -R
# systemctl restart bind9

Agora faça um teste para ver o que seu servidor ira traduzir:

# dig xvideos.com @localhost
; <<>> DiG 9.16.15-Debian <<>> xvideos.com @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1040
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: a060f744b32f2a4f01000000617842817ffcfff0a6b99fff (good)
;; QUESTION SECTION:
;xvideos.com.                   IN      A

;; ANSWER SECTION:
xvideos.com.            5       IN      CNAME   umbrella.cursodns.com.br.
umbrella.cursodns.com.br. 10800 IN      A       45.80.48.5

;; ADDITIONAL SECTION:
rpz.zone.               1       IN      SOA     LOCALHOST. umbrella.cursodns.com.br. 2020062400 3600 900 2592000 7200

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: ter out 26 15:01:37 -03 2021
;; MSG SIZE  rcvd: 175
# dig qqrcoisa.xvideos.com @localhost
# dig pornhub.com @localhost
# dig www.pornhub.com @localhost
# dig redtube.com @localhost

Uma boa list de hosts você pode encontrar aqui.
🙂 Não esquece de mandar meu presente de natal!

Reverso DNS Master - Para prefixos maiores ou igual a /24.

Obs: Para fazer a Delegações de DNS reverso do seu bloco, é importante que você já tenha configurado no registro.br seu DNS autoritativo.

Para ficar organizado criaremos a pasta master-rev para salvar todos nossos arquivos

# mkdir /var/cache/bind/master-rev

Para nosso cenários vou usar os prefixos 45.80.48.0/22 e 2804:f123::/32. O bloco 45.80.48.0/22 será necessário quebrar em 4 arquivos uma para cada prefixo /24 qual teremos nossos 1024 nome de hosts (IPs).

Lembra que anteriormente comentei que o reverso não passa de um domínio autoritativo? Então é isso mesmo, a forma de configuração é a mesma, porem já temos o nosso domínios para IPv4 x.x.x.in-addr.arpa e x.x.x.x.x.x.x.x.ip6.arpa para IPv6.

Primeiro arquivo /24 farei com o nome de 45.80.48.rev, poderia ser qualquer nome, mas assim fica bem sugestivo.

# vim /var/cache/bind/master-rev/45.80.48.rev

Preste atenção em 48.80.45.in-addr.arpa. essa linha ela deve ser alterada com o inverso do seu IP, de trás para frente.
Outra coisa importante é o serial (2021102601) ele está presente em todos os arquivos e deve ser alterado toda vez que for alterado. Ele segue o padrão [ano-mes-dia-sequencial]. É fundamental altera-lo para que o servidor slave copie sempre que tiver uma alteração.

Neste arquivo darei nomes personalizados apenas para o ns1 e ns2 o resto usarei o GENERATE para gerar de forma automatica todos os mais de mil nomes, sengindo o padrão 45-80-50-x.remontti.net.br.

$ORIGIN .
$TTL 86400      ; 1 day
48.80.45.in-addr.arpa IN SOA ns1.remontti.net.br. hostmaster.remontti.net.br. (
                    2023020101 ; serial
                    14400      ; refresh (4 hours)
                    3600       ; retry (1 hour)
                    2419200    ; expire (4 weeks)
                    300        ; minimum (5 minutes)
                    )
                NS      ns1.remontti.net.br.
                NS      ns2.remontti.net.br.

$ORIGIN 48.80.45.in-addr.arpa.
2         PTR     ns1.remontti.net.br.
3         PTR     ns2.remontti.net.br.

$ORIGIN 48.80.45.in-addr.arpa.
$GENERATE 0-1     $  PTR  45-80-48-$.remontti.net.br.
$GENERATE 4-255   $  PTR  45-80-48-$.remontti.net.br.

Proximo /24

# vim /var/cache/bind/master-rev/45.80.49.rev
$ORIGIN .
$TTL 86400      ; 1 day
49.80.45.in-addr.arpa IN SOA ns1.remontti.net.br. hostmaster.remontti.net.br. (
                    2023020101 ; serial
                    14400      ; refresh (4 hours)
                    3600       ; retry (1 hour)
                    2419200    ; expire (4 weeks)
                    300        ; minimum (5 minutes)
                    )
                NS      ns1.remontti.net.br.
                NS      ns2.remontti.net.br.

$ORIGIN 49.80.45.in-addr.arpa.
$GENERATE 0-255 $ PTR 45-80-49-$.remontti.net.br.
# vim /var/cache/bind/master-rev/45.80.50.rev
$ORIGIN .
$TTL 86400      ; 1 day
50.80.45.in-addr.arpa IN SOA ns1.remontti.net.br. hostmaster.remontti.net.br. (
                    2023020101 ; serial
                    14400      ; refresh (4 hours)
                    3600       ; retry (1 hour)
                    2419200    ; expire (4 weeks)
                    300        ; minimum (5 minutes)
                    )
                NS      ns1.remontti.net.br.
                NS      ns2.remontti.net.br.

$ORIGIN 50.80.45.in-addr.arpa.
$GENERATE 0-255 $ PTR 45-80-50-$.remontti.net.br.
# vim /var/cache/bind/master-rev/45.80.51.rev
$ORIGIN .
$TTL 86400      ; 1 day
51.80.45.in-addr.arpa IN SOA ns1.remontti.net.br. hostmaster.remontti.net.br. (
                    2023020101 ; serial
                    14400      ; refresh (4 hours)
                    3600       ; retry (1 hour)
                    2419200    ; expire (4 weeks)
                    300        ; minimum (5 minutes)
                    )
                NS      ns1.remontti.net.br.
                NS      ns2.remontti.net.br.

$ORIGIN 51.80.45.in-addr.arpa.
$GENERATE 0-255 $ PTR 45-80-51-$.remontti.net.br.
# vim /var/cache/bind/master-rev/2804.f123.rev

Antenção no 3.2.1.f.4.0.8.2.ip6.arpa o site http://rdns6.com/hostRecord pode ser bem útil para gerar seus PTRs.

$ORIGIN .
$TTL 3600       ; 1 hour
3.2.1.f.4.0.8.2.ip6.arpa IN SOA ns1.remontti.net.br.3.2.1.f.4.0.8.2.ip6.arpa. hostmaster.remontti.net.br.3.2.1.f.4.0.8.2.ip6.arpa. (
                    2023020101 ; serial
                    14400      ; refresh (4 hours)
                    3600       ; retry (1 hour)
                    2419200    ; expire (4 weeks)
                    300        ; minimum (5 minutes)
                    )
            NS      ns1.remontti.net.br.
            NS      ns2.remontti.net.br.

2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.e.f.a.c.e.b.e.b.3.2.1.f.4.0.8.2.ip6.arpa.   PTR     ns1.remontti.net.br.
3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.e.f.a.c.e.b.e.b.3.2.1.f.4.0.8.2.ip6.arpa.   PTR     ns2.remontti.net.br.

Ajustamos as permissões:

# chown bind: /var/cache/bind/master-rev/ -R

Criamos uma atalho para facilitar:

# ln -s /var/cache/bind/master-rev/ /etc/bind/master-rev

Agora nós precisamos informar nossas zonas reversas no named.conf.local, como estamos configurando nosso servidor master essas zonas serão do tipo (type) master.

# vim /etc/bind/named.conf.local

Adicione ao final do arquivo:

zone "48.80.45.in-addr.arpa" {
        type master;
        file "/var/cache/bind/master-rev/45.80.48.rev";
};
 
zone "49.80.45.in-addr.arpa" {
        type master;
        file "/var/cache/bind/master-rev/45.80.49.rev";
};
 
zone "50.80.45.in-addr.arpa" {
        type master;
        file "/var/cache/bind/master-rev/45.80.50.rev";
};
 
zone "51.80.45.in-addr.arpa" {
        type master;
        file "/var/cache/bind/master-rev/45.80.51.rev";
};

zone "3.2.1.f.4.0.8.2.ip6.arpa" {
        type master;
        file "/var/cache/bind/master-rev/2804.f123.rev";
};

Reinicie o serviço e verifique se o mesmo subiu sem erros.

# systemctl restart bind9
# systemctl status bind9

Checando se nosso IP reverso está resolvendo os nomes setados, com o comando `dig -x IP @localhost +short`

# dig -x 45.80.48.0 @localhost +short
45-80-48-0.remontti.net.br.

# dig -x 45.80.48.255 @localhost +short
45-80-48-255.remontti.net.br.

# dig -x 45.80.48.2 @localhost +short
ns1.remontti.net.br.

# dig -x 45.80.48.3 @localhost +short
ns2.remontti.net.br.

# dig -x 45.80.49.0 @localhost +short
45-80-49-0.remontti.net.br.

# dig -x 45.80.49.255 @localhost +short
45-80-49-255.remontti.net.br.

# dig -x 45.80.50.0 @localhost +short
45-80-50-0.remontti.net.br.

# dig -x 45.80.50.255 @localhost +short
45-80-50-255.remontti.net.br.
 
# dig -x 45.80.51.0 @localhost +short
45-80-51-0.remontti.net.br.

# dig -x 45.80.51.255 @localhost +short
45-80-51-255.remontti.net.br.

# dig -x 2804:f123:bebe:cafe::2 @localhost +short
ns1.remontti.net.br.

# dig -x 2804:f123:bebe:cafe::3 @localhost +short
ns2.remontti.net.br.

Como criamos nomes aos 1024 hosts/IPs (x-x-x-x.remontti.net.br) será necessário apontar cada nome desses no arquivo de autoritativo do domínio remontti.net.br para cada nome um IP. Para isso vamos voltar as configurações do domínio autoritativo que já configurado. Lembre-se de alterar o serial!

# host 45-80-50-0.remontti.net.br.

Host 45-80-50-0.remontti.net.br. not found: 3(NXDOMAIN)
Só para relembrar: NXDOMAIN: Significa que o domínio pesquisado não existe.

Para resolver isso então vamos criar todos nosso nomes.
vamos adicionar ao final do arquivo /var/cache/bind/master-aut/remontti.net.br/remontti.net.br.hosts

$ORIGIN remontti.net.br.
$GENERATE 0-1    45-80-48-$   A   45.80.48.$
$GENERATE 4-255  45-80-48-$   A   45.80.48.$
$GENERATE 0-255  45-80-49-$   A   45.80.49.$
$GENERATE 0-255  45-80-50-$   A   45.80.50.$
$GENERATE 0-255  45-80-51-$   A   45.80.51.$
# vim /var/cache/bind/master-aut/remontti.net.br/remontti.net.br.hosts

Ficando:

$ORIGIN .
$TTL 86400 ; 1 day
remontti.net.br        IN SOA  ns1.remontti.net.br. hostmaster.remontti.net.br. (
                            2023020101 ; serial
                            14400      ; refresh (4 hours)
                            3600       ; retry (1 hour)
                            2419200    ; expire (4 weeks)
                            300        ; minimum (5 minutes)
                            )
 
                        NS      ns1.remontti.net.br.
                        NS      ns2.remontti.net.br.
 
                        A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4

$ORIGIN remontti.net.br.
$TTL 10800   ; 3 hours
 
ns1                     A       45.80.48.2
                        AAAA    2804:f123:bebe:cafe::2
hostmaster              A       45.80.48.2
                        AAAA    2804:f123:bebe:cafe::2
ns2                     A       45.80.48.3
                        AAAA    2804:f123:bebe:cafe::3
www                     A       45.80.48.4
                        AAAA    2804:f123:bebe:cafe::4

$ORIGIN remontti.net.br.
$GENERATE 0-1    45-80-48-$   A   45.80.48.$
$GENERATE 4-255  45-80-48-$   A   45.80.48.$
$GENERATE 0-255  45-80-49-$   A   45.80.49.$
$GENERATE 0-255  45-80-50-$   A   45.80.50.$
$GENERATE 0-255  45-80-51-$   A   45.80.51.$

Autoritativo ajustado, reinicie o serviço e verifique se o mesmo subiu sem erros.

# systemctl restart bind9
# systemctl status bind9

Agora ao consultar nosso nomes temos uma resposta dizendo qual nosso endereço ip

# host 45-80-48-0.remontti.net.br.
45-80-48-0.remontti.net.br has address 45.80.48.0
 
# host 45-80-49-0.remontti.net.br.
45-80-49-0.remontti.net.br has address 45.80.49.0

# host 45-80-50-0.remontti.net.br.
45-80-50-0.remontti.net.br has address 45.80.50.0

# host 45-80-51-0.remontti.net.br.
45-80-51-0.remontti.net.br has address 45.80.51.0

# host ns1.remontti.net.br.
ns1.remontti.net.br has address 45.80.48.2
ns1.remontti.net.br has IPv6 address 2804:f123:bebe:cafe::2

# host ns2.remontti.net.br.
ns2.remontti.net.br has address 45.80.48.3
ns2.remontti.net.br has IPv6 address 2804:f123:bebe:cafe::3
Para o servidor Slave

Crie o diretório onde irão ficar os arquivos e dê permissão

# mkdir /var/cache/bind/slave-rev
# chown bind: /var/cache/bind/slave-rev -R

Em seguiga crie as zonas no arquivo named.conf.local, que serão do tipo (slave) e apontaremos o IP do DNS Master para que o servidor slave faça a transferência.

# vim /etc/bind/named.conf.local

Adicione ao final:

zone "48.80.45.in-addr.arpa" {
        type slave;
        file "/var/cache/bind/slave-rev/45.80.48.rev";
        masters { 45.80.48.2; };
        allow-notify { 45.80.48.2; };
};
 
zone "49.80.45.in-addr.arpa" {
        type slave;
        file "/var/cache/bind/slave-rev/45.80.49.rev";
        masters { 45.80.48.2; };
        allow-notify { 45.80.48.2; };
};
 
zone "50.80.45.in-addr.arpa" {
        type slave;
        file "/var/cache/bind/slave-rev/45.80.50.rev";
        masters { 45.80.48.2; };
        allow-notify { 45.80.48.2; };
};
 
zone "51.80.45.in-addr.arpa" {
        type slave;
        file "/var/cache/bind/slave-rev/45.80.51.rev";
        masters { 45.80.48.2; };
        allow-notify { 45.80.48.2; };
};

zone "3.2.1.f.4.0.8.2.ip6.arpa" {
        type slave;
        file "/var/cache/bind/slave-rev/2804.f123.rev";
        masters { 45.80.48.2; };
        allow-notify { 45.80.48.2; };
};

Crio o atalho, reinico o serviço e verifico se o mesmo subiu sem erros, em seguida olho se os arquivos foram criando nas pasta.

# ln -s /var/cache/bind/slave-rev /etc/bind/slave-rev
# systemctl restart bind9
# systemctl status bind9
# ls -lh /var/cache/bind/slave-rev/ 

Validando seu reverso no registro.br https://registro.br/tecnologia/ferramentas/verificacao-de-dns/
Vamos verificar pelos domínos .arpa

48.80.45.in-addr.arpa
49.80.45.in-addr.arpa
50.80.45.in-addr.arpa
51.80.45.in-addr.arpa
3.2.1.f.4.0.8.2.ip6.arpa

RESULTADOS

DOMÍNIO            : 48.80.45.in-addr.arpa
DNS                : 45.80.48.2
STATUS             : Autoridade sobre o domínio
VERSÃ              : O2021102602
TEMPO DE RESPOSTA  : 23.990 ms

DOMÍNIO            : 49.80.45.in-addr.arpa
DNS                : 45.80.48.2
STATUS             : Autoridade sobre o domínio
VERSÃ              : O2021102602
TEMPO DE RESPOSTA  : 23.990 ms

DOMÍNIO            : 50.80.45.in-addr.arpa
DNS                : 45.80.48.2
STATUS             : Autoridade sobre o domínio
VERSÃ              : O2021102602
TEMPO DE RESPOSTA  : 23.990 ms

DOMÍNIO            : 51.80.45.in-addr.arpa
DNS                : 45.80.48.2
STATUS             : Autoridade sobre o domínio
VERSÃ              : O2021102602
TEMPO DE RESPOSTA  : 23.990 ms

DOMÍNIO            : 3.2.1.f.4.0.8.2.ip6.arpa
DNS                : 45.80.48.2
STATUS             : Autoridade sobre o domínio
VERSÃ              : O2021102602
TEMPO DE RESPOSTA  : 23.990 ms

Se tudo estiver certo você terá Autoridade sobre o domínio, repita o mesmo no seu para o IP do servidor Slave.

Seu reverso está pronto para ser configurado no registro.br, acesse sua conta clique em NUMERAÇÃO em seguira sobre seu prefixo exemplo 45.80.48.0/22, clique no "quadro azul" e clique em Configurar DNS, preencha o formulário Delegação DNS - 45.80.48.0/22 informado o Servidor 1: ns1.remontti.net.br e Servidor 2: ns2.remontti.net.br. Lembrando que o DNS do autoritativo "remontti.net.br" deve estar com os subdominios ns1 e ns2 apontando para o IP do seu servidor DNS, e o mesmo já deve ter propagado, se você tem acabou de alterar os DNS do remontti.net.br aguarde um tempo (até 24h) para fazer a configuração do reverso.

Dúvida frequente:
- Posso ter reversos de diferentes blocos usando o mesmo domínio autoritativo?
Sim, como também pode para outros domínios, inclusive mesclados.

- É possível configurar o DNSSEC para os reversos? Sim basta seguir o mesmo padrão que usamos no exemplo com nosso propío domínio, lembrado que "não existe reverso" tudo é um dominio autoritativo que já existe chamado de xxxxxxxx.in-addr.arpa e xxxxxxx.ip6.arpa, para configurar no registro br é muito simples, basta você realizar a configuração do DNSSEC em cima de cada /24 seu e ir no painel do registro e clicar em DNSSEC e salvar, ele ira identificar sua configuração.

Um ótimo site para verificar seu DNSSEC é o https://dnsviz.net/

Como configurar o reverso para prefixos menores que /24

Vamos supor que você dono de um /22 e vai repassar um prefixo /28 para um provedor sem AS ou uma empresa que é seu cliente, e o mesmo deseja ter seu reverso respondendo em seus servidores DNS (RFC2317).

Primeiramente faça a delegação no registro.br do /28 para o CNPJ/Domínios do de seu cliente, acesse sua conta clique em NUMERAÇÃO em seguira sobre seu prefixo exemplo 45.80.48.0/22, clique no "quadro azul" e clique em Expandir até chegar no prefixo /28, clieque sobre o quadro do prefixo desejado e em seguida em Configurar designação e preecha o formulário com o CNPJ/Domínios do seu cliente, se o mesmo não possuir solicite que faça seu cadastro.

Se ficar em dúvidas recomendo que assista: https://www.youtube.com/watch?v=VIa1dHtmQ4U DNS Reverso (~20min fala sobre isso)
No exemplo vamos supor que o bloco seja o 45.80.49.64/28, como o mesmo fica no arquivo 45.80.49.rev vamos edita-lo.

# vim /var/cache/bind/master-rev/45.80.49.rev

Iremos quebrar nosso GENERETE para pular os IPs finais 64 a 79, e vamos apontar ele para os DNS do cliente, logo é claro que ele precisa ter um domínio já configurado, e nesse DNS ele apontar exemplo ns1 e ns2 para o IP do servidor que ele estará fazendo a configuração. Explico já já como faz o lado dele.

$ORIGIN .
$TTL 86400      ; 1 day
51.80.45.in-addr.arpa IN SOA ns1.remontti.net.br. hostmaster.remontti.net.br. (
                    2023020101 ; serial
                    14400      ; refresh (4 hours)
                    3600       ; retry (1 hour)
                    2419200    ; expire (4 weeks)
                    300        ; minimum (5 minutes)
                    )
                NS      ns1.remontti.net.br.
                NS      ns2.remontti.net.br.

$ORIGIN 49.80.45.in-addr.arpa.
$GENERATE 0-63 $ PTR 45-80-51-$.remontti.net.br.

; Cliente delegado
;  <<64-79>> /28
; Aponte para os DNS do Servidor do José 
64/28     NS     ns1.provedordojose.com.br. 
64/28     NS     ns2.provedordojose.com.br. 
; 
64      CNAME    64.45/28.49.80.45.in-addr.arpa. 
65      CNAME    65.45/28.49.80.45.in-addr.arpa. 
66      CNAME    66.45/28.49.80.45.in-addr.arpa. 
67      CNAME    67.45/28.49.80.45.in-addr.arpa. 
68      CNAME    68.45/28.49.80.45.in-addr.arpa. 
69      CNAME    69.45/28.49.80.45.in-addr.arpa. 
70      CNAME    70.45/28.49.80.45.in-addr.arpa. 
71      CNAME    71.45/28.49.80.45.in-addr.arpa. 
72      CNAME    72.45/28.49.80.45.in-addr.arpa. 
73      CNAME    73.45/28.49.80.45.in-addr.arpa. 
74      CNAME    74.45/28.49.80.45.in-addr.arpa. 
75      CNAME    75.45/28.49.80.45.in-addr.arpa. 
76      CNAME    76.45/28.49.80.45.in-addr.arpa. 
77      CNAME    77.45/28.49.80.45.in-addr.arpa. 
78      CNAME    78.45/28.49.80.45.in-addr.arpa. 
79      CNAME    79.45/28.49.80.45.in-addr.arpa.

$ORIGIN 51.80.45.in-addr.arpa.
$GENERATE 80-255 $ PTR 45-80-51-$.remontti.net.br.

Reinicie o serviço e verifique o mesmo

# systemctl restart bind9
# systemctl status bind9
Lado do "provedor do Jose"

Como estamos falando de um outro provedor, é quase certo que ele fará seu DNS: Recursivo, autoritativo e reverso. Então faça a instalação do bind e todos os procedimentos das configurações de recursivo e autoritativo sobre o domínio “provedordojose.com.br”, porém a configuração do reverso irá mudar um pouco, ficando:

Autoritativo

# vim /var/cache/bind/master-aut/provedordojose.com/provedordojose.com.br.hosts
$ORIGIN .
$TTL 86400 ; 1 day
provedordojose.com.br        IN SOA  ns1.provedordojose.com.br. hostmaster.provedordojose.com.br. (
                            2023020101 ; serial
                            14400      ; refresh (4 hours)
                            3600       ; retry (1 hour)
                            2419200    ; expire (4 weeks)
                            300        ; minimum (5 minutes)
                            )

                        NS      ns1.provedordojose.com.br.
                        NS      ns2.provedordojose.com.br.

                        A       45.80.49.67

$ORIGIN provedordojose.com.br.
$TTL 10800   ; 3 hours

ns1                     A       45.80.49.66
hostmaster              A       45.80.49.66

ns2                     A       45.80.49.67

www                     A       45.80.49.67

$ORIGIN provedordojose.com.br.
$GENERATE 64-65  45-80-49-$    A   45.80.49.$

$ORIGIN provedordojose.com.br.
$GENERATE 68-79  45-80-49-$    A   45.80.49.$

Reverso

# vim /var/cache/bind/master-rev/45.80.49.64-79.rev
$TTL 1h
@               IN      SOA     ns1.provedordojose.com.br. root.provedordojose.com.br. (
                    2020050101 ; serial
                    10800      ; refresh (3 hours)
                    3600       ; retry (1 hour)
                    2419200    ; expire (4 weeks)
                    300        ; minimum (5 minutes)
                    )

        IN      NS      ns1.provedordojose.com.br.
        IN      NS      ns2.provedordojose.com.br.

$ORIGIN 64/28.49.80.45.in-addr.arpa.
64      IN      PTR     45-80-49-64.provedordojose.com.br.
65      IN      PTR     45-80-49-65.provedordojose.com.br.
66      IN      PTR     ns1.provedordojose.com.br.
67      IN      PTR     ns2.provedordojose.com.br.
68      IN      PTR     45-80-49-68.provedordojose.com.br.
69      IN      PTR     45-80-49-69.provedordojose.com.br.
70      IN      PTR     45-80-49-70.provedordojose.com.br.
71      IN      PTR     45-80-49-71.provedordojose.com.br.
72      IN      PTR     45-80-49-72.provedordojose.com.br.
73      IN      PTR     45-80-49-73.provedordojose.com.br.
74      IN      PTR     45-80-49-74.provedordojose.com.br.
75      IN      PTR     45-80-49-75.provedordojose.com.br.
76      IN      PTR     45-80-49-76.provedordojose.com.br.
77      IN      PTR     45-80-49-77.provedordojose.com.br.
78      IN      PTR     45-80-49-78.provedordojose.com.br.
79      IN      PTR     45-80-49-79.provedordojose.com.br.
# vim /etc/bind/named.conf.local
zone "provedordojose.com.br" {
        type master;
        file "/var/cache/bind/master-aut/provedordojose.com.br/provedordojose.com.br.hosts";
        key-directory "/var/cache/bind/master-aut/rprovedordojose.com.br/keys/";
        dnssec-policy default;
        inline-signing yes;
        serial-update-method unixtime;
};

zone "64/28.49.80.45.in-addr.arpa" {
        type master;
        file "/var/cache/bind/master-rev/45.80.49.64-79.rev";
};

Reinicie o serviço

# systemctl restart bind9
# systemctl status bind9
Situação de reverso para cliente final sem ele ter servidor de DNS

Meu cliente quer que eu aponto os nomes dos IPs reverso para o seu domínio, posso?
Sim, pode! Em muitos casos de clientes corporativos que tem seu próprio servidor de e-mail é possível que o mesmo peça para fazer isso. Ex:

# vim /var/cache/bind/master-rev/45.80.49.rev
$ORIGIN .
$TTL 86400      ; 1 day
49.80.45.in-addr.arpa IN SOA ns1.remontti.net.br. hostmaster.remontti.net.br. (
                    2023020101 ; serial
                    14400      ; refresh (4 hours)
                    3600       ; retry (1 hour)
                    2419200    ; expire (4 weeks)
                    300        ; minimum (5 minutes)
                    )
                NS      ns1.remontti.net.br.
                NS      ns2.remontti.net.br.

$ORIGIN 49.80.45.in-addr.arpa.
$GENERATE 0-63 $ PTR 45-80-49-$.remontti.net.br.

$ORIGIN 49.80.45.in-addr.arpa.
64      PTR     45-80-49-64.provedordojose.com.br.
65      PTR     45-80-49-65.provedordojose.com.br.
66      PTR     ns1.provedordojose.com.br.
67      PTR     ns2.provedordojose.com.br.
68      PTR     mail.provedordojose.com.br.
69      PTR     45-80-49-69.provedordojose.com.br.
70      PTR     45-80-49-70.provedordojose.com.br.
71      PTR     45-80-49-71.provedordojose.com.br.
72      PTR     45-80-49-72.provedordojose.com.br.
73      PTR     45-80-49-73.provedordojose.com.br.
74      PTR     45-80-49-74.provedordojose.com.br.
75      PTR     45-80-49-75.provedordojose.com.br.
76      PTR     45-80-49-76.provedordojose.com.br.
77      PTR     45-80-49-77.provedordojose.com.br.
78      PTR     45-80-49-78.provedordojose.com.br.
79      PTR     45-80-49-79.provedordojose.com.br.

$ORIGIN 49.80.45.in-addr.arpa.
$GENERATE 80-199 $ PTR 45-80-49-$.remontti.net.br.

$ORIGIN 49.80.45.in-addr.arpa.
200     PTR     mail.empresa.com.br.
201     PTR     mail.minhaempresa.com.br.
202     PTR     mail.algumaempresa.com.br.
203     PTR     www.algumchato.com.br.
204     PTR     maischatoainda.com.br.

$ORIGIN 49.80.45.in-addr.arpa.
$GENERATE 205-255 $ PTR 45-80-49-$.remontti.net.br.

Reinicie os serviços

# systemctl restart bind9
# systemctl status bind9

Mais um pouco de DNS!

Posso configurar DNS reverso de IPs privados?
Sim pode, ajustes no named.conf.default-zones e zones.rfc1918
Remova as linhas dos IPs privados que deseja configurar.

Posso configurar DNS reverso de outro AS?
Sim. Basta configurar! (Conheço provedores pequenos que ambos tem 1 servidor DNS cada e um é o backup do outro)

Estatísticas do DNS

Estatística web/http (statistics-channels)
Para ativar edite o /etc/bind/named.conf

# vim /etc/bind/named.conf

Adicione antes dos include, sendo que 45.80.48.2 é o IP público do DNS e 45.80.48.100 e 45.80.48.101 (Só aceita /32) são os IPs que poderão acessar no navegaro a porta 58053 para visualizar as informações. Porém perceba que também deixou um inet só para o IP de loopback (127.0.0.1 ) a ideiá aqui é que só o zabbix-agente acesse, eu particularmente não deixou o outro inet sendo ouvido, se deseja comente ele com //

statistics-channels {
       inet 127.0.0.1  port 58053 allow { 127.0.0.1; ::1; };
       inet 45.80.48.2  port 58053 allow { 45.80.48.100; 45.80.48.101; };
};

Para surtir efeito reinicie o serviço

# systemctl restart bind9

Agora acesse http://IP_DNS:58053/

Usaremos a seguir este método para coletar informações para o zabbix.

Outra forma é as estatística em arquivo (statistics-file), você pode definir um local especifico para gerar seu arquivo com as estatística, caso não especificado o mesmo é gerado em /var/cache/bind/named.stats

# vim /etc/bind/named.conf.options

Adicione dentro de options { … }

options {
//…
//…
    statistics-file "/var/log/named/named.stats";
//…
//…
};

Como sempre, em toda alteração reiniciamos o serviço

# systemctl restart bind9

Porém para gere o arquivo de estatísticas é necessário o comando, e toda vez que deseja atualizar precisa executar o comando.

# rndc stats

Exibe os dados do arquivo

# cat /var/log/named/named.stats
ou
# cat /var/cache/bind/named.stats

Caso queira ver oque esta em cache pode usar o comando:

# rndc dumpdb -cache

Ira gerar um arquivo named_dump.db em /var/cache/bind/

# cat /var/cache/bind/ | more
# cat /var/cache/bind/ | grep google

Criando Backup

Basta salvar os diretórios /etc/bind/* /var/cache/bind/* /usr/share/dns/* Gerar um arquivo de backup

# tar -czpf ns1.tar.gz /etc/bind/* /var/cache/bind/* /usr/share/dns/*

Extrair arquivo de backup

# tar vxf ns1.tar.gz

Recomendo a leitura do tutorial: Criando backups de forma simples e enviando para o Telegram ou servidor via SSH

Coletando dados dos bind e fail2ban para Zabbix 6 LTS

Se você ainda não tem um zabbix server aqui tem um belo tutorial:
Instalação do Zabbix 6 LTS + NGINX + PostgreSQL + Debian 11
Instalação do Grafana no Debian 11 Bullseye

No nosso servidor DNS vamos precisar apenas do zabbix-agent, vamos adiciona o repositório do zabbix LTS para Debian 11 e em seguina intala-lo.

# cd /tmp
# apt install wget
# cd /tmp/
# wget https://repo.zabbix.com/zabbix/6.0/debian/pool/main/z/zabbix-release/zabbix-release_6.0-5+debian12_all.deb
# apt install ./zabbix-release_6.0-5+debian12_all.deb
# apt update; apt upgrade -y
# apt install zabbix-agent
# systemctl enable zabbix-agent

Em seguida vamos precisar informar o IP do zabbix server:

# vim /etc/zabbix/zabbix_agentd.conf

Localize e altere:

Server=45.80.48.10 #IP Zabbix Server
ServerActive=45.80.48.10 #IP Zabbix Server
Hostname=ns1 #Nome exato cadastrado no Zabbix server

Reinicie o serviço do zabbix agent

# systemctl restart zabbix-agent

Não esqueça de ajustar statistics-channels named.conf:

statistics-channels {
  inet 127.0.0.1 port 58053 allow { 127.0.0.1; };
};

Vou usar o projeto Zabbix-Bind9-Statistics-Collection compartilhado no meu gituhub

Copie o userparameter_rr_bind.conf no diretório (/etc/zabbix/zabbix_agentd.d) de inclusão dos agentes do Zabbix.

# cd /etc/zabbix/zabbix_agentd.d/
# wget https://raw.githubusercontent.com/remontti/Zabbix-Bind9-Statistics-Collection/master/userparameter_rr_bind.conf

Copie o script bind-stats-rr.py para dentro de /etc/zabbix/script/ e ajustaremos os poderes e permissões.

# mkdir /etc/zabbix/script
# cd /etc/zabbix/script
# wget https://raw.githubusercontent.com/remontti/Zabbix-Bind9-Statistics-Collection/master/bind-stats-rr.py
# chmod a+x /etc/zabbix/script/bind-stats-rr.py
# chown zabbix: /etc/zabbix/script/ -R
# systemctl restart zabbix-agent

Você pode receber estatísticas por zona (que serão descobertas automaticamente) adicionando a seguinte cláusula a cada definição de zona no seu named.conf.local: zone-statistics yes; Ex.:

zone "remontti.net.br" {
        type master;
        file "/var/cache/bind/master-aut/remontti.net.br/remontti.net.br.hosts";
        key-directory "/var/cache/bind/master-aut/remontti.net.br/keys/";
        dnssec-policy default;
        inline-signing yes;
        serial-update-method unixtime;
        zone-statistics yes;
};

zone "48.80.45.in-addr.arpa" {
        type master;
        file "/var/cache/bind/master-rev/45.80.48.rev";
        zone-statistics yes;
};

zone "49.80.45.in-addr.arpa" {
        type master;
        file "/var/cache/bind/master-rev/45.80.49.rev";
        zone-statistics yes;
};

zone "50.80.45.in-addr.arpa" {
        type master;
        file "/var/cache/bind/master-rev/45.80.50.rev";
        zone-statistics yes;
};

zone "51.80.45.in-addr.arpa" {
        type master;
        file "/var/cache/bind/master-rev/45.80.51.rev";
        zone-statistics yes;
};

zone "3.2.1.f.4.0.8.2.ip6.arpa" {
        type master;
        file "/var/cache/bind/master-rev/2804.f123.rev";
        zone-statistics yes;
};

Não esqueça de restartar o serviço se editar o named.local.conf `systemctl restart zabbix-agent`

Baixe o arquivo RR Bind9.xml para seu computador e importe o mesmo para o seu Zabbix Server.
Vamos ter 3 novos templates:

- RR Servico Bind9 ==> Irá verificar se os serviço esta UP
- RR Servico Bind9 - Estatisticas ==> Diversas informações
- RR Servico Bind9 - Valida arquivos - Deb11 ==> Notificará sempre que um arquivo named.conf* for modificado

Coletando dados das prisões do Fail2ban

Projeto zabbix-fail2ban-discovery

Faça o download do arquivo userparameter_fail2ban.conf para o diretório /etc/zabbix/zabbix_agentd.d/

# cd /etc/zabbix/zabbix_agentd.d/
# wget https://raw.githubusercontent.com/remontti/zabbix-fail2ban-discovery/master/userparameter_fail2ban.conf

O Fail2ban funciona apenas com root por padrão. Precisaremos conceder permissão ao Zabbix para acessar o Fail2ban. Não é uma boa ideia conceder permissão de root ao Zabbix em termos de segurança. Em vez disso, permitiremos que o usuário do Zabbix use esse soquete. O agente Zabbix é executado sob o usuário zabbix. Primeiro, precisamos criar um novo grupo chamado fail2ban. Todos os usuários pertencentes a este grupo poderão acessar o Fail2ban.

Criar um grupo:

# addgroup --group fail2ban

Adicionar o usuário zabbix existente ao grupo fail2ban:

# usermod -a -G fail2ban zabbix

Em seguida, devemos alterar o proprietário do grupo do soquete de root para fail2ban:

# chown root:fail2ban /var/run/fail2ban/fail2ban.sock

Por fim, ajuste as permissões no soquete para que os membros do grupo possam acessá-lo:

# chmod g+rwx /var/run/fail2ban/fail2ban.sock

Agora podemos testar que o agente Zabbix pode chamar Fail2ban:

# su - zabbix --shell=/bin/bash -c 'fail2ban-client status sshd'
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

As instruções de instalação abrangem a alteração das permissões do soquete fail2ban para acesso como um usuário não root; no entanto, essas alterações são perdidas na próxima vez que o soquete é criado.

Para tornar as alterações permanentes em um sistema em que o fail2ban é gerenciado pelo systemd, adicione o seguinte ao arquivo de substituição de serviço fail2ban

# systemctl edit fail2ban

Adicione:

[Service]
ExecStartPost=/bin/sh -c "while ! [ -S /run/fail2ban/fail2ban.sock ]; do sleep 1; done"
ExecStartPost=/bin/chgrp fail2ban /run/fail2ban/fail2ban.sock
ExecStartPost=/bin/chmod g+w /run/fail2ban/fail2ban.sock
Restart Zabbix Agent

Reinicie os serviços

# systemctl daemon-reload
# systemctl restart zabbix-agent fail2ban 

Consulte se o grupo é o fail2ban

# ls -lh /var/run/fail2ban/fail2ban.sock
srwxrwx--- 1 root fail2ban 0 jun 18 11:47 /var/run/fail2ban/fail2ban.sock

Faça download do template RR Servico Fail2ban - Monitor Filtros e importe para o Zabbix Server.

Por hoje é "só" pessoal!
Espero ter colaborado com uma pequena parcela em seu conhecimento.
Esse tutorial levei dois dias escrevendo então conto com sua ajuda para poder manter o blog!

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Recomendado:
https://www.isc.org/download/
https://downloads.isc.org/isc/bind9/9.16.15/doc/arm/Bv9ARM.pdf
Extensão para navegador:
https://chrome.google.com/webstore/detail/ipvfoo/ecanpcehffngcegjmadlcijfolapggal
https://addons.mozilla.org/en-US/firefox/addon/ipvfoo-pmarks/

Ferramentas web:
https://dnschecker.org/
https://zonemaster.net/

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

56 Resultados

  1. Marcelo disse:

    Posso ter o Recursivo e o Reverso local e manter meu autoritativo no Registro.br?

  2. Reginaldo Silva disse:

    Boa tarde! Excelente conteúdo como sempre!
    Uma dúvida, quando dou o comando dig -x ipv6 @localhost +short não retorna nada. Onde checo isso pro reverso ip funcionar?

  3. Willian da Silva Lima disse:

    No Fail2Ban, a configuração definida para IPv6 ‘allowipv6’ não foi definida no arquivo, está em auto ou com comentada, para alterar, vá:
    vim /etc/fail2ban/fail2ban.conf
    allowipv6 = yes

  4. maycon disse:

    prefregex = ^%(__line_prefix)s(?: error:)?\s*client(?: @\S*)? #\S+(?: \([\S.]+\))?: .+\s(?:denied|\(NOTAUTH\)|\(allow-query-cache did not match\))\s*$

  5. pedro disse:

    Fiz os testes em ubuntu-server funcionou 100% porém estou com um unico problema.. dnssec , consigo gerar as chaves ao dar reboot ele gera os arquivos .signed, .jnl, .jbk ao validar o dnssec no site do registro.br ele mostra a keytag e o digest1 blz.. após logar no registro.br para adicionar a keytag e o digest1 no meus dns ele dá ! DS: TEMPO ESGOTADO em vermelho e não salva.. voltei de novo na ferramenta do dnssec do registro.br e ao digitar o meu dominio + IP servidor dns1 ele mostra a keytag e o digest normal, ao tentar digitar o dominio + IP dns2 servidor slave ele não mostra nada dá tempo esgotado também é normal?

    Verifiquei também que no seu tutorial ele mostra no keytag e digest eo algoritmo RSA-SHA-1-NSEC3 mas nos comandos para gerar as chaves no tutorial ele mostra
    1
    # dnssec-keygen -a ECDSAP256SHA256 remontti.net.br
    Generating key pair.
    Kremontti.net.br.+007+29298
    1
    2
    Generating key pair.
    Kremontti.net.br.+007+29298
    # dnssec-keygen -a ECDSAP256SHA256 -f KSK remontti.net.br
    1
    # dnssec-keygen -a ECDSAP256SHA256 -f KSK remontti.net.br

    Ao testar na ferramenta do registro.br ele mostra algoritmo ECDSA-SHA-256

    o restante o slave, está recebendo automático a zona dominio.com.br.signed porém ao gerar no dns servidor slave (d=meudominio.com.br; dig @127.0.0.1 +norecurse “$d”. DNSKEY | dnssec-dsfromkey -f – “$d” | head -1) ele mostra outro keytag e outro digest 1 totalmente diferente do que mostra no dns servidor master autoritativo.. será que estou efetuando algum passao errado? na ferramenta do registro br tanto master como slave dns mostra lá como autoridade sobre o dominio

  6. no fail2ban, aparece alguns ips v4 e v6, consigo visualizar no firewall as regras drop dos ipv4, mas não do ipv6, tem que habilitar o ipv6 no fil2ban?

  7. Fabio disse:

    Boa tarde, nomes no qual o ip está hospedado internamente não abrem. Teria algum ajuste a ser feito ?

  8. Opa, olha nóis aqui novamente pra agradecer o EXCELENTE tutorial disponibilizado.

    Há dois anos atrás a empresa onde atualmente trabalho tinha somente as poucas entradas que o registro.br disponibiliza na console web. Consegui instalar dois servidores na Cloud Oracle (OS: Ubuntu 22.04.2 LTS x86_64 – Memory: 203MiB / 964MiB) que são nossos servidores de DNS e a quantidade entradas de DNS que temos hoje facilitou e MUITO os acessos aos nossos serviços.

    Documentei TODO o procedimento interno que realizei numa Wiki interna com essa referência:
    * Melhor tutorial de todos os tempos: https://blog.remontti.com.br/3086 e https://blog.remontti.com.br/5958

    A título de curiosidade: Alteração efetuada no registro.br – 10/Mai/2022 às 18:50

  9. Montanaro Mendes disse:

    Olá Remontti, excelente tutorial!!!
    O DNS recursivo esta funcionando aqui perfeitamente!

    Só uma dúvida sobre o autoritativo. Localmente dentro da rede tenho ping no domínio sem nenhum problema, porém quando vou pra fora da rede, não consigo pingar. O que pode ser?

  10. Romário disse:

    bash: dnssec-keygen: comando não encontrado

    pra mim está dando erro.

  11. Eduardo disse:

    Artigo top demais, blog sempre me ajudando muito!
    Subi aqui só o servidor de DNS recursivo, estou com problemas que bancos em geral não abrem nos celulares. Pelo PC tudo normal, mas nos aplicativos só abre se ativar Ipv6 ou forçar um DNS externo.
    Alguma sugestão? Obrigado.

  12. Abdulio Waled disse:

    Olá, caso queiramos utilizar o DNS em um provedor, como faríamos para obter a guarda do log? Seria dentro desse servidor, teria algum software de para guarda de Log??? Como enquadrá-lo a LGPD???

  13. Dhefesson Santos disse:

    Conteúdo muito rico. Parabéns pela riqueza de detalhes.

  14. Gabriel disse:

    Estou com o DNS reverso funcionando, mas não esta propagando as informaçõs oque pode ser ?

  15. Walisson Gois disse:

    Boa tarde Rudimar, tudo bem ?

    Sobre a RFC 8482 que da uma enforcada nas queries com “ANY”. Tem alguma atualização do BIND pra essa implementação ?

  16. Fernando Hermann disse:

    No caso de querer um “view interna” a minhas redes,
    uma resposta do autoritativo apenas para alguns ranges de IP tem como ?
    Exemplo.
    Quero declarar meu sistema de tickets com um IP invalido, mas não desejo expor isto aos root servers

  17. ANTONIO EDILHO DE SOUSA disse:

    tudo isso feito em um server só? que top

  18. Ivo disse:

    O material desde blog possue uma extrema qualidade!

  19. Alisson disse:

    Mesmo após atualizar o arquivo DOMAIN.hosts, incrementar o serial e reiniciar o bind9, os registros inseridos não funcionam e o serial apresentado em testes com o comando dig são de um serial de dias passados. O que pode estar ocorrendo para que o servidor DNS não carregue o arquivo mais recente? PS: Ao realizar o teste com o named-checkzone, o serial é apresentado normalmente.

    • Fernando Novais disse:

      O meu também está assim. Quando consulto o RegistroBR também aparece o serial antigo. Você conseguiu resolver? SE sim, pode me ajudar? Obrigado!

    • Decio Vaz disse:

      Mesmo problema aqui, e isso fica claro nos logs:

      22-Aug-2022 18:34:38.157 zone linuxcloud.com.br/IN (unsigned): loaded serial 2022082201
      22-Aug-2022 18:34:38.157 zone linuxcloud.com.br/IN (signed): loaded serial 2022022501 (DNSSEC signed)

      eu até consegui alterar o serial com o comando abaixo, atualiza lá no Registro.BR, mas as entradas novas ainda não funcionam:

      rndc signing -serial 2022081201 linuxcloud.com.br

      Será que o jeito terá que “explodir” o diretório de chaves e recriar o DNSSEC ?

    • Decio Vaz disse:

      voces conseguiram alguma solucao para o mesmo ? estou com o mesmo problema.

  20. Alessandro Schneider disse:

    Conteúdo muito TOP!!
    Parabéns!!!

  21. Bruno Mendes dos Santos disse:

    Parabéns pelo tutorial
    Uma duvida, da forma que foi configurado neste tutorial , as zonas serão reassinadas automaticamente todos mês, ou tereis que reassinar manualmente a cada 30 dias ?

  22. Garcia disse:

    Com interesse de disponibilizar meus próprios servidores DNS encontrei múltiplos artigos e digo com convicção que esse foi o melhor artigo, cada etapa é explicada e isso é ótimo!

    Grato pelo conteúdo.

    • Garcia disse:

      Já possuo o servidor configurado perfeitamente, porém eu tenho uma dúvida, é necessário em toda alteração realizada dentro das zonas reiniciar o bind9? Pois mesmo aumentando o sequencial após alterar as alterações só são propagadas e lidas pelos desktops que configurei para usarem os servidores como resolvedores DNS depois de reiniciar o bind9, achei um pouco incoveniente esse fato

  23. Décio Vaz disse:

    Olá Rudimar, excelente artigo (e bem escrito didaticamente). Fiz a primeira versão dele e consegui sem problemas colocar meus NS autoritativos para rodar, sem problemas. Agora vou migrar de servidor cloud e fiquei com uma dúvida: será que funciona colocar os NS1 e o NS reverso (ns2) na mesma máquina, no mesmo serviço ? você já fez algo assim ? Obrigado.

      • Decio Vaz disse:

        Ola,

        Estou apanhando em dois momentos, segui o tutorial fielmente, mas…

        1) os arquivos do DNSSEC (.jbk .signed .signed.jnl) não são gerados de jeito nenhum, o serviço sobe certinho, as permissoes estao ok…

        2) como estou tentando configurar o Master e o Slave na mesma maquina (com 2 ips configurados, claro) quando adiciono a zone slave no /etc/named.conf.local ele reclama que a zona “dominio.com” já existe, se eu renomear a zona ela, claro, pra qualquer coisa ele passa, mas tambem os arquivos do master nao vao para o diretorio do slave. Ja tentei colocar outro arquivo como include senao o master.conf.local, mas nao vai… Onde estou errando ?

        Se puder me dar uma luz.

        Obrigado

        • 1) possivelmente permissão dos diretórios
          2) vc não precisa criar a zona slave, vc já fez a master

          • Decio Vaz disse:

            excelente! habilitei o debug level ao máximo e vi o erro. Tudo por causa de uma entrada em IPV6 incorreta…os arquivos foram criados, ja tenho autoridade sob o dominio e agora entendi o conceito de ter dois NS em uma maquina. Você somente do MASTER e o SLAVE é só se tiver que delegar para outra maquina secundária. (Eu achava que tinhamos que colocar os dois na mesma maquina). Te agradeço por sua prestatividade! Abraços!

  24. Francisco disse:

    Boa tarde Remonti.
    Com muita frequência eu tenho que fazer um restart no bind9. Quando eu analiso os logs não tem nada de errado. Fazendo um dig com trace ele resolve os nomes normalmente. Pra gente aqui é notório que sempre que tem um consumo de banda fora do nosso padrão que é uns 4 mb .. os clientes começam a reclamar etc .. dai reiniciou .. voltou ./… já passou por isso?

  25. Ed Gilson disse:

    no meu DNS, deu este erro alguem sabe o que pode ser:
    DNS format error from 192.33.4.12#53 resolving ./NS for : non-improving referral

  26. Opera Networks Solutions disse:

    Bom dia RR, obrigado pelos ensinamentos.
    Tem acontecido aqui comigo o seguinte:
    — Utilizo somente recursivo.
    — Root-server atualizado na última versão.
    — Quando faço um dig de dentro do servidor pra um domínio xyz resolve normalmente.

    Porém quando assinante utiliza o DNS recursivo ele tem problemas pra acessar.

    E só resolve quando no bind eu configuro pra ele encaminhar por exemplo para 8.8.8.8 ou 8.8.4.4

    Já pegou algum caso assim ?

  27. Hebio disse:

    Boa noite vc tem um curso para bgp com FrRouting para 2 operadora full route estou tentando montar um aqui fiz a parte do ospf deu certo mais o bgp nao achei muito exemplo que me ajudace.

  28. Nielson Padilha disse:

    Como fariamos para gerar dnssec para o /22 e /32 para cadastrar no registro.br ? Obrigado pelos tutoriais, são muito bons mesmo.

  29. Nielson Padilha disse:

    Fiquei na duvida do rev ipv6 na conf tem 2 faixas com inicio 2 e 3. Gerei o meu no site tenho que por inicio 2 e 3 também ?

    2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.e.f.a.c.e.b.e.b.3.2.1.f.4.0.8.2.ip6.arpa. PTR ns1.remontti.net.br.
    3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.e.f.a.c.e.b.e.b.3.2.1.f.4.0.8.2.ip6.arpa. PTR ns2.remontti.net.br.
    No site rDNS coloquei o IP finalizando com :: sem /32

  30. Quando terá curso de DNS novamente?

  31. Fabbyo disse:

    Referência pra comunidade, sempre trazendo artigos excelentes com uma boa didática aos menos entendidos mas sem ser superficial as explicações, parabéns Remontti! Contribuição garantida!!! Gostaria de saber como adicionar um IP como exceção no firewall do DNS, pois o mesmo esta bloqueando até o IP do zabbix para as coletas!

  32. Arthur Bernardes disse:

    Excelente artigo, Remontti. Muito obrigado por mais uma maravilhosa contribuição.

  1. 9 de novembro de 2021

    […] teste.remontti.com.br, logo é necessário configurar seu subdomínio “teste” em seu DNS Server, NÃO USE subdomínio chamado speedtest pois você terá possivelmente seu pedido negado. Exemplo […]

  2. 25 de março de 2022

    […] 11 (Bullseye) 64 bits instalação mínima pronta Configurado em seu DNS autoritativo um subdomínio exemplo “meet.remontti.com.br” apontado para o IPv4/6 do seu […]

  3. 28 de abril de 2022

    […] Não irei ensinar instalar o bind até porque já tem tutorial explicando aqui no blog. […]

  4. 22 de janeiro de 2024

    […] Não abordarei a instalação do BIND neste momento, pois já disponibilizamos um tutorial completo em nosso blog, que pode ser acessado através do seguinte link: Servidor DNS Bind9 (Debian 12). […]

  5. 6 de fevereiro de 2024

    […] Para que possamos encaminhar os acessos iremos necessitar configurar um subdomínios para cada situação em nosso servidor DNS autoritativo. […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *