DNS Recursivo

Criada por Danilo Tomich, Modificado em Thu, 03 Aug 2023 na (o) 09:42 PM por Danilo Tomich

Instalação do Bind9 (Master/Slave)

Instalação dos pacotes

1
# apt install bind9 dnsutils

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/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.

1
2
# 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:

1
2
3
4
# 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:

1
# dig @localhost google.com.br +trace

Observe as linhas em destaque.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
; <<>> 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:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// 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

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

Imprime todas as configurações

1
# 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.

1
2
# systemctl restart bind9
# systemctl status bind9

Configurando Recursivo (Slave)

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

1
# 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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.

1
2
# 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 Master e Slave.

1
# vim /etc/bind/named.conf

Adicione logging { … }:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// 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.

1
2
# mkdir /var/log/named/
# chown bind. /var/log/named/

Reinicie o serviço

1
# systemctl restart bind9

Iremos criar um filtro para ler os logs do bind

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

Adicione:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Fail2Ban filter file for named (bind9 v9.16.x).
#
 
[Definition]
 
# Daemon name
_daemon=named
 
# 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?:)
 
#       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+)?
 
prefregex = ^%(__line_prefix)s(?: error:)?\s*client(?: @\S*)? <HOST>#\S+(?: \([\S.]+\))?: <F-CONTENT>.+</F-CONTENT>\s(?:denied|\(NOTAUTH\))\s*$
 
failregex = ^(?:view (?:internal|external): )?query(?: \(cache\))?
            ^zone transfer
            ^bad zone transfer request: '\S+/IN': non-authoritative zone
 
ignoreregex =
 
# DEV Notes: 
# 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.

1
# vim /etc/fail2ban/jail.d/bind9.conf

1
2
3
4
5
6
7
[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.

1
2
# systemctl restart fail2ban
# systemctl status fail2ban

Consulte se o filtro bind9 foi carregado

1
# fail2ban-client status

1
2
3
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:

1
# dig @ip_so_seu_dns google.com.br

Deixe rodando o comando para visualizar os logs.

1
# 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.

1
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.

1
# fail2ban-client status bind9

1
2
3
4
5
6
7
8
9
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.

1
# nft list ruleset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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:

1
# 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

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

Agora vamos baixar a versão mais recente.

1
2
# 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:

1
# 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.

1
2
3
4
5
6
7
8
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:

1
# vim /etc/default/named

1
OPTIONS="-u bind"

Para

1
OPTIONS="-4 -u bind"

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

1
listen-on-v6 { any; };

Para

1
listen-on-v6 { none; };

Reinicie o serviço

1
# 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.

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

Adicione dentro de options { ….. }

1
2
3
4
5
6
7
8
  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:

1
# dig google.com.br @localhost

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
; <<>> 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; <<>> 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.

1
2
;; ->>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.

1
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

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

Outros exemplos:

1
2
3
4
5
# 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.

1
2
3
4
5
6
7
8
9
10
11
;; 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)

1
2
3
4
5
;; 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

1
2
3
4
5
6
7
8
9
;; 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:

1
2
3
4
;; 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!

1
# 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/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

1
# systemctl restart nftables fail2ban

Este artigo foi útil?

Que bom!

Obrigado pelo seu feedback

Desculpe! Não conseguimos ajudar você

Obrigado pelo seu feedback

Deixe-nos saber como podemos melhorar este artigo!

Selecione pelo menos um dos motivos

Feedback enviado

Agradecemos seu esforço e tentaremos corrigir o artigo