UP | HOME

LPI-2 202-450 Topico 207.2
Criar e manter zonas de DNS

Índice

207.2 Criar e manter zonas de DNS - Objetivos

Peso 3

O candidato deve ser capaz de criar um arquivo de zona para redirecionamento, zona reversa ou servidor raiz. Este objetivo incui definir apropriadamente valores de registros, incluindo hosts em zonas e adicionando as zonas ao DNS. Também deve ser capaz de delegar uma zona a outro servidor DNS

Conhecimentos-chave:

  • Arquivos de configuração, termos e ferramentas do BIND 9;
  • Ferramentas para solicitar informações de um servidor DNS;
  • Formato, conteúdo e localização dos arquivos de zona do BIND;
  • Métodos para incluir um novo host à zona, incluindo zonas reversas.

Lista parcial dos arquivos, termos e ferramentas utilizados:

  • /var/named/*;
  • Sintaxe dos arquivos de zona;
  • Formato dos registros;
  • named-checkzone;
  • named-compilezone;
  • masterfile-format;
  • dig;
  • nslookup;
  • host;

207.2 Criar e manter zonas de DNS - Conteúdo

Diferente de um servidor cache-only, num servidor tradicional de DNS os arquivos de zona contém a correspondência de IPs e nomes para os domínios especificados em named.conf.

Criando um domínio

Falando no arquivo named.conf ao criar um domínio tradicional deve ser criada uma entrada diferente da que fazemos no tipo cache-only.

options {
       directory "/var/named";
       };

zone "." IN {
         type hint;
         file "root.hints";
         };

zone "gink.go" IN {
     type master;
     file "gink.go.zone";
     };

Nessa última entrada temos as opções e o arquivo de zona para as solicitações de nome para o domínio "gink.go". A opção type determina a prioridade da zona para o domínio, só existem duas opções em domínios tradicionais sendo master ou slave.

Obs.: Assim podemos resumir que a opção type só tem 3 alternativas de configuração sendo hint para servidores cache-only e master ou slave para servidores tradicionais.

O arquivo definido na opção file deve ser criado no mesmo diretório definido na opção directory na seção options. O arquivo de zona pode ter qualquer nome, porém tradicionalmente utiliza-se os prefixos/sufixos zone ou db.

Registros da zona

O arquivo de zona contém várias informações dos nomes do domínio em questão. Um exemplo de arquivo de zona é:

$TTL 3D
@    IN SOA     floid.gink.go.  hostmaster.gink.go. (
     2007060401 ; serial
     28800      ; refresh (8 horas)
     7200       ; retry (2 horas)
     2419200    ; expire (4 semanas)
     86400      ; Negative cache TTL (1 dia)
     )

                NS         floyd
                MX     5   mail
floyd           A          192.168.0.1
hamilton        A          192.168.0.2
www             CNAME      hamilton
felix           A          192.168.0.4
mail            CNAME      felix
emily           A          192.168.0.11
  • $TTL 3D Indica a validade padrão dos dados ou por quanto tempo os dados conseguidos a partir desse servidor ficarão no cache de DNS (no caso do exemplo 3 dias).
  • Descrição dos itens:

    @    IN SOA     floid.gink.go.  hostmaster.gink.go. (
    │    │    │       │               └─ Email do admin ("." inves de @)
    │    │    │       └───────────────── Nome do servidor Autoritativo
    │    │    └───────────────────────── Chama os próximos valores 
    │    └────────────────────────────── Internet determina a classe
    └─────────────────────────────────── "Atalho para $ORIGIN"
    
  • $ORIGIN (ou @) é uma diretiva (variável) que contém como valor padrão o nome da zona em questão indicada na respectiva seção do arquivo named.conf;
  • SOA = "Start of Authority" Chama os valores do servidor autoritativo e do email do administrador. Atenção tanto o nome do DNS quanto o email do admin terminam com .;
  • ( - ao final da linha indica o início das propriedades dos registros;
  • 2009090401; é o "número serial" - número único que indica a zona, pode ser qualquer número mas tradicionalmente é uma data seguido de um número serial, ele sempre deve ser "incrementado" quando se faz uma nova configuração;
  • 28800; refresh - intervalo de atualização para o servidor secundário, no exemplo 8 horas;
  • 7200; retry - é o intervalo em que um servidor secundário tentará devolver a autoridade para o servidor primário no caso de o secundário ter assumido a autoridade da zona em uma eventual indisponibilidade do primário, no exemplo 2 horas;
  • 2419200; expire - prazo de validade das informações em um servidor secundário, no exemplo 4 semanas;
  • 86400; Negative cache TTL - intervalo mínimo de permanência das informações negativas no cache de clientes. Por exemplo, uma consulta sobre um host que não está registrado no banco de dados. Isso reduz a carga de resolução negativa no servidor, no exemplo 1 dia;
  • ); fecha as propriedades da zona.
  • Após as proprieades iniciam-se os mapeamentos (entradas), também conhecidas como "RR" (Resource Records ou em português Registros de Recursos) e/ou nomes do domínio, essas entradas são compostas conforme a seguinte tabela a seguir:

    Nome Classe Tipo Prioridade Tradução
    @ IN NS   felix
        NS   floyd
        MX 5 mail
    floid   A   192.168.0.1
    hamilton   A   192.168.0.2
    www   CNAME   hamilton
    felix   A   192.168.0.4
    mail   CNAME   felix
    emily   A   192.168.0.11

    Observação: Incluida a entrada NS para felix para exemplificar que o campo "classe" é opcional e o @ para referenciar $ORIGIN também.

    Também é possível incluir o campo TTL entre as colunas "Nome" e "Classe" ou entre "Classe" e "Tipo". Porém também é um campo pouco usado.

DNS Reverso

Além de zonas para traduzir nomes para números IP, é praxe criar zonas para traduzir números de IP para nomes, processo chamado DNS reverso.

Para tanto é necessário criar mais uma zona específica no arquivo named.conf que aponta para um outro arquivo de zona independente. Note que estamos trabalhando com o mesmo arquivo named.conf apenas adicionando os casos estudados:

options {
       directory "/var/named";
       };

zone "." IN {
         type hint;
         file "root.hints";
         };

zone "gink.go" IN {
     type master;
     file "gink.go.zone";
     };

zone "0.168.192.in-addr.arpa" IN {
     type master;
     file "db.192.168.0.in-addr.arpa";
     allow-update { none; };
     };

O último registro acima especifica a zona reversa. O nome da zona reversa começa com o trecho do IP referente à rede, escrito de trás para frente, seguindo do termo in-addr.arpa, que determina tratar-se de um registro de DNS reverso. Portanto o registro mostrado converterá em nomes os IPs que comecem por "192.168.0". As demais opções, como tipo, nome de arquivo etc., obedecem às mesmas regras do DNS.

O arquivo de zona para o DNS reverso é praticamente idêntico ao do DNS convencinoal:

$TTL 3D
@    IN SOA     floid.gink.go.  hostmaster.gink.go. (
     2007060401 ; serial
     28800      ; refresh (8 horas)
     7200       ; retry (2 horas)
     2419200    ; expire (4 semanas)
     86400      ; Negative cache TTL (1 dia)
     )

     NS         floyd.gink.go.
1    PTR        floyd.gink.go.
2    PTR        hamilton.gink.go.
4    PTR        felix.gink.go.
11   PTR        emily.gink.go.

Nesse caso também se utiliza o @ para referenciar $ORIGIN que por não ter sido declarada explícitamente trata-se do valor colocado na declaração da zona no arquivo named.conf (0.168.192).

No arquivo de zona reverso o tipo de apontamento utilizado é o PTR (ponteiro). A sintaxe é "número,tipo,nome".

Importante: os nomes de host precisam ser completos incluindo o . ao final.

Delegação de zona

Eventualmente pode ser necessário criar um subdomínio independente para atividades diversas (questões de email são os melhores exemplos) assim se faz necessário delegar a administração de uma porção inferior do domínio para outro servidor DNS.

Esse procedimento é feito no arquivo de zona do domínio em questão, segue exemplo:

$TTL 3D
@    IN SOA     floid.gink.go.  hostmaster.gink.go. (
     2007060401 ; serial
     28800      ; refresh (8 horas)
     7200       ; retry (2 horas)
     2419200    ; expire (4 semanas)
     86400      ; Negative cache TTL (1 dia)
     )

                       NS            floyd
                       MX       5    mail
floyd                  A             192.168.0.1
hamilton               A             192.168.0.2
www                    CNAME         hamilton
felix                  A             192.168.0.4
mail                   CNAME         felix
emily                  A             192.168.0.11
;
; *** Delegacao de subdominio ***
test.gink.go.      IN  NS            ns1.test.gink.go.
ns1.test.gink.go.  IN  A             10.0.0.200

Assim na primeira linha da delegação o domínio "test.gink.go" é registrado por meio de um registro do tipo "NS" que informa que o domínio está sendo mantido por um host chamado "ns1.test.gink.go".

Já na última linha informamos o endereço IP do host "ns1.test.gink.go" por meio de um registro do tipo "A", que também é conhecido como "registro cola" ou glue record. Permitindo que se resolva a entrada NS declarada anteriormente.

Note relativo a delegação de domínio nenhum ajuste precisa ser feito no arquivo "named.conf" sendo esse um ajuste pertinente apenas ao arquivo de zona.

Lembrando que no exemplo acima apenas apontamos 1 servidor de NS é possível e recomendável ter mais de 1 servidor NS tanto para o domínio raís quanto para os domínios delegados. Assunto que trataremos a seguir.

Servidores escravos

Para aumentar a disponibilidade do serviço, é recomendável criar um servidor DNS escravo, de preferência numa localização física distante do servidor primário.

O arquivo named.conf para subir um servidor escravo (secundário) pode ser escrito da seguinte forma:

options {
        directory "/var/named";
        };


zone "gink.go" {
     type slave;
     file "db.gink.go";
     masters { 192.168.0.1; };
     };

O arquivo de zona que no exemplo tem o nome de "db.gink.go" posuirá apenas o registro SOA:

@    IN SOA     floid.gink.go.  hostmaster.gink.go. (
     2007060399 ; serial
     28800      ; refresh (8 horas)
     7200       ; retry (2 horas)
     2419200    ; expire (4 semanas)
     86400      ; Negative cache TTL (1 dia)
)

Os registros da zona "gink.go" serão enviados automaticamente para o servidor escravo através de um processo chamado "transferência de zona". Nem sempre esse arquivo precisará ser preenchido manualmente.

Para fazer a transferência de zona o número serial existente no servidor escravo deve ser menor do que o número existente no servidor mestre.

Aqui vale relembrar as funções de tempo do registro SOA:

  • refresh: especifica o intervalo em que o slave verificará atualizações de registro no servidor mestre;
  • retry: sempre que o servidor escravo não puder contactar o servidor mestre ele tentará contactar novamente dentro da janela de tempo especificada nesse campo;
  • expire: define que a zona deixará de existir se esse limite de tempo for atingido sem que o secundário consiga se comunicar com o primário.

É sempre importante lembrar que por padrão os valores são escritos em "segundos" para alterar essa unidade de tempo basta utilizar sufixos como "H" para hora, "D" para dia ou "W" para semana.

Redirecionamento de servidor

Um redirecionamento no Bind simplesmente transfere todas as solicitações feitas ao servidor para outro servidor DNS, armazenando os resultados temporariamente para agilizar futuras solicitações, semelhantemente ao servidor cache-only.

Dentro desse cenário se quizermos direcionar qualquer solicitação, basta criar a seção options em named.conf da seguinte forma:

options {
        directory "/var/named";
        forwarders {
                   200.192.140.21;
                   200.192.143.5;
        }
};

Na configuração acima serão utilizados os servidores na seção forwarders para responder solicitações que não estiverem no cache.

Também é possível redirecionar apenas solicitações de uma seção específica, nesse caso, ao declarar a zona no arquivo named.conf devemos definir o tipo da zona como forward:

zone "gink.go" IN {
     type forward;
     forwarders {
                200.192.140.21;
                200.192.143.5;
                }
};

Detalhes gerais de configuração

Antes de reiniciar o named é importante verificar se existem erros no arquivo de configuração, para isso utiliza-se o comando named-checkconf:

named-checkconf /etc/named.conf

Se houverem falhas elas serão informadas na saída padrão.

Formato RAW

A partir da versão 9.9, arquivos de zonas escravas são por padrão armazenados no formato "raw". A conversão entre o formato de texto e o formato "raw" pode ser feito com o comando named-compilezone.

Por exemplo, para converter o arquivo de zona lcnsqr.com.raw do formato raw para o formato texto:

named-compilezone -f raw -F text -o lcnsqr.com.text lcnsqr.com lcnsqr.com.raw

Diagnósticos de DNS

Comando host

O comando host permite executar consultas simples de DNS conforme o exemplo a seguir:

# host felix
felix.gink.go has address 192.168.0.4

# host 192.168.0.4
4.0.168.194.in-addr.arpa domain name pointer felix.gink.go

No exemplo acima pudemos verificar que tanto o DNS convenional quanto o reverso estão funcionando corretamente para o host "felix".

Visto que as consultas acima foram solicitadas para o DNS padrão do host em questão (possívelmente indicadas pelo arquivo /etc/resolv.conf) concluímos que eventualmente é necessário direcionar as consultas para algum servidor de DNS específico. Para tanto basta indicar para o comando host na variável de entrada $2 o endereço do servidor de DNS a consultar conforme abaixo:

# host www floyd.gink.go
Using domain server:
Name: floyd.gink.go
Address: 192.168.0.1#53
Aliases:

www.gink.go is an alias for hamilton.gink.go.
hamilton.gink.go has address 192.168.0.2
Using domain server:
Name: floyd.gink.go
Address: 192.168.0.1#53
Aliases:

www.gink.go an alias for hamilton.gink.go.
Using domain server:
Name: floyd.gink.go
Address: 192.168.0.1#53
Aliases:

www.gink.go is an alias for hamilton.gink.go.

Comando dig

Uma ferramenta específica para diagnóstico de servidores DNS é o comando dig (Domain Information Groper). O comando tem várias opções porém a forma mais trivial de invocá-lo é dig "@servidordns" "tipo". Exemplo de utilização do comando dig:

$ dig @8.8.4.4 redes.eti.br ANY

; <<>> DiG 9.16.1-Ubuntu <<>> @8.8.4.4 redes.eti.br ANY
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15831
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;redes.eti.br.                  IN      ANY

;; ANSWER SECTION:
redes.eti.br.           3599    IN      MX      10 mx.zoho.com.
redes.eti.br.           3599    IN      MX      20 mx2.zoho.com.
redes.eti.br.           3599    IN      RRSIG   MX 13 3 3600 20210407185210 20210226175210 15033 redes.eti.br. RR9Z8DdW+VZUk15Ke9F1lfE4zvOG/xQ9kiF1mI7++rsoPRfkOQZt6K7p +HULRVl7ypr0k508GHThHLkK25iBKQ==

;; Query time: 56 msec
;; SERVER: 8.8.4.4#53(8.8.4.4)
;; WHEN: seg mar 15 20:54:43 -03 2021
;; MSG SIZE  rcvd: 196

A saída acima é dividia tem 3 seções. O campo status da seção HEADER nos permite verificar se foram encontrados erros no servidor DNS. A seção QUESTION mostra que tipo de requisição foi feita ao servidor. Já a resposta é mostrada na seção ANSWER. A seção ADDITIONAL (se houver) mostra os endereços dos mapeamentos tipo A de algum eventual CNAME que houver na seção ANSWER.

Comando nslookup

Outra ferramenta fundamental é o comando nslookup. O nslookup trabalha de dois modos, o interativo e o não interativo.

Se entrarmos na linha de comando com o comando nslookup sem usar argumentos entraremos no "modo interativo".

# nslookup
>

Nesse "shell" que aparecerá utilizaremos inicialmente os servidores de nome que estiverem indicados no arquivo /etc/resolv.conf porém outro servidor de nomes pode ser especificado diretamente ao chamar o nslookup da seguinte forma:

# nslookup - 8.8.8.8
>

Note que no exemplo acima há um espaço entre o comando o - e o endereço do servidor DNS.

Dentro da shell do nslookup basta digitar o endereço a se traduzir que o comando entregará os dados:

$ nslookup 
> baboo.com.br
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   baboo.com.br
Address: 72.167.224.40
> exit

$ nslookup - 8.8.8.8
> baboo.com.br
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   baboo.com.br
Address: 72.167.224.40
> exit

Por fim, para pesquisar um nome de servidor no modo não interativo pode-se fornecer para o comando qual consulta e executar e também qual servidor a ser consultado conforme abaixo:

$ nslookup zabbix.infralinux.com.br
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
zabbix.infralinux.com.br        canonical name = www.infralinux.com.br.
Name:   www.infralinux.com.br
Address: 191.252.222.37

$ nslookup zabbix.infralinux.com.br 8.8.4.4
Server:         8.8.4.4
Address:        8.8.4.4#53

Non-authoritative answer:
zabbix.infralinux.com.br        canonical name = www.infralinux.com.br.
Name:   www.infralinux.com.br
Address: 191.252.222.37

Autor: Jeremias Alves Queiroz

Criado em: 2021-12-19 dom 12:18

Valid XHTML 1.0 Strict