Instalando DNS Server (BIND) no CentOS 7

Passos básicos para instalação e configuração de servidor DNS.

[ Hits: 22.024 ]

Por: Jefferson Abreu em 11/06/2019


Introdução



Para este tutorial, vamos usar os detalhes abaixo:
  • Hostname: dns.jeff.local → aqui pode ser o nome do seu site
  • Endereço IP: 192.17.39.1/24 → seu IP
  • Sistema Operacional: CentOS 7 minimal server

Instalando pacotes

Primeiro passo é instalar os pacotes necessários, como root:

# yum install -y bind.x86_64

Configurando o BIND

O arquivo de configuração principal do BIND é o /etc/named.conf. Vamos na sessão "options" procurar por "listen-on" e adicionar o endereço IP do servidor:

1 listen-on port 53 { 127.0.0.1; 192.17.39.1; };

Também em "options", procurar por "allow-query" adicionando os endereços de rede que terão permissão para consultar o nosso servidor. Nessa configuração de exemplo, vou permitir apenas a rede interna, então a linha ficará assim:

1 allow-query     { localhost; 192.17.39.0/24; };

Se você deseja permitir que qualquer servidor consulte o seu DNS, basta colocar o valor "any":

1   allow-query     { any; };

Para resolver hostnames

Para resolver hostnames externos que não são administrados por seu servidor, ainda em "options", adicione a opção "forwarders" com a lista de servidores entre chaves e separados por ponto e vírgula. Abaixo, um exemplo onde uso os servidores de DNS do Google e do Cloudflare como forwarders:

1
2
3
4 forwarders {
    8.8.8.8;
    1.1.1.1;
};

Vá no final do arquivo, fora da sessão "options", devemos agora indicar as zonas que serão administradas pelo servidor. É necessário criar uma entrada de zona e também o reverso dessa zona. Para o domínio e endereço de rede do nosso tutorial, as entradas ficam assim:

1
2
3
4
5
6
7
8
9 zone "jeff.local" IN {
        type master;
        file "jeff.local.db";
};

zone "39.17.192.in-addr.arpa" IN {
        type master;
        file "39.17.192.db";
};

O parâmetro "type" indica que esse servidor é master para essas zonas e "file" diz o nome do arquivo com detalhes da zona. Você pode indicar o caminho completo ou apenas o nome do arquivo, o que significa que ele estará no caminho padrão (/var/maned/).

Encerramos aqui a edição do arquivo /etc/named.conf, abaixo a listagem completa do arquivo com as modificações feitas:

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 //
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
        listen-on port 53 { 127.0.0.1; 192.17.39.1; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost; 192.17.39.0/24; };

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */

        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";

        forwarders {
                8.8.8.8;
                1.1.1.1;
        };
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

zone "jeff.local" IN {
        type master;
        file "jeff.local.db";
};

zone "39.17.192.in-addr.arpa" IN {
        type master;
        file "39.17.192.db";
};

Criando Arquivos de Zona

O próximo passo é criar os arquivos para as zonas indicados na configuração principal. Por padrão, os arquivos ficam em /var/named, então como indicamos em /etc/named.conf, vamos criar o arquivo /var/named/jeff.local.db com o conteúdo abaixo:

$TTL 24h
@       IN      SOA     dns.jeff.local. root.jeff.local. (
        2015083000      ; Serial
        12h             ; Refresh
        15m             ; Retry
        3w              ; Expire
        2h              ; Mininum TTL
)

@       IN      NS      dns.jeff.local.
dns     IN      A       192.17.39.1

server1 IN      A       192.17.39.2
www     IN      A       192.17.39.3
ftp     IN      CNAME   www.jeff.local.

  • A primeira linha com TTL indica o tempo padrão para essa zona que um registro DNS deve ser armazenado em cache.
  • A segunda linha contém um registro do tipo SOA (Start of Authority) contendo os parâmetros globais para zona de domínio.
  • Esse registro vai até o fechamento dos parenteses na oitava linha.
  • O texto após o sinal de ponto e vírgula é comentário.

Alguns detalhes sobre a primeira linha do registro SOA:
  • @ → É um substituto para o nome da zona apontado na configuração feita em /etc/named.conf.
  • dns.jeff.local → É o servidor master para essa zona, no nosso exemplo é o próprio servidor que estamos configurando.
  • root.jeff.local → É o email do responsável por essa zona. Esse formato corresponde ao email root@jeff.local.
  • A linha comentada como Serial contém um valor número de serial number para sincronismo dessa zona. Ele permite que um servidor secundário (slave) inicie uma atualização sempre que possuir esse valor menor do que o servidor master. Uma convenção usada para esse campo é a data no formato AAAAMMDDSS onde: AAAA = ano, MM = mês, DD = dia e SS é um número sequencial atualizado a cada modificação diária.
  • As quatro linhas seguintes possuem campos com registros de tempo para orientar servidores secundários. O primeiro campo (Refresh) indica o tempo que o servidor slave deve aguardar para fazer novas consultas de atualização ao servidor master. O segundo campo (Retry) indica o tempo que o slave deve aguardar para uma nova tentativa caso encontre falha na atualização. O terceiro campo (Expire) diz o tempo máximo que um slave pode responder pela zona sem conseguir contato com o master. O quarto campo (Mininum TTL) diz o tempo que um servidor slave deve aguardar antes de retornar a autoridade da zona para o master server. Os valores desses campos podem ser em segundos ou abreviados onde: w = semanas (weeks), d = dias (days), h = horas (hours) e m = minutos (minutes).
  • Exemplificando o comportamento com os valores que definimos. Um servidor slave irá a cada 12 horas tentar atualização com o master server, a atualização acontecerá se o valor de Serial no slave for menor do que no master.
  • Caso a comunicação entre os servidores falhe, o slave aguardará 15 minutos antes de uma nova tentativa. Se não houver comunicação entre master e slave, o slave trabalhará nessa condição por 3 semanas até considerar seus dados ultrapassados e não mais responder pela zona. Quando a comunicação entre os servidores voltar, o slave aguardará duas horas até aceitar atualizações do master.
  • A linha 10 contém um registro NS que indica o nameserver, no caso o próprio servidor e a linha 11 um registro do tipo A com o endereço IP do servidor. As demais linhas são apenas exemplos onde declaro outros endereços e um alias.

Finalizado esse arquivo, devemos criar o arquivo reverso em /var/named/39.17.192.db:

$TTL 24h
@       IN      SOA     dns.jeff.local. root.jeff.local. (
        2015083000      ; Serial
        12h             ; Refresh
        15m             ; Retry
        3w              ; Expire
        2h              ; Mininum TTL
)

@       IN      NS      dns.jeff.local.
1      IN      PTR     dns.jeff.local.

2      IN      PTR     server1.jeff.local.
3      IN      PTR     www.jeff.local.
3      IN      PTR     ftp.jeff.local.

O registro SOA é idêntico ao arquivo de zona. Na linha 10 temos um registro NS e na linha 11 um registro do tipo PTR (pointer) para o nosso servidor. O valor 10 é o ultimo octeto do endereço IP do servidor (192.17.39.1). Os registros do tipo PTR podem ser declarados apenas com o último octeto como nesse exemplo ou ser completos. Quando usado apenas o último octeto o restando é preenchido com o nome da zona declarado em /etc/named.conf. O endereço completo para o mesmo IP seria 1.39.17.192.in-addr.arpa.

As demais entradas são apenas outros exemplos de registro PTR para cada registro exemplo criado no arquivo anterior. Finalizada a edição, basta salvar esse arquivo.

Subindo o serviço e testando

Com os arquivos de configuração necessários editados e salvos, basta liberar as portas no Firewall e iniciar o serviço:

# firewall-cmd --permanent --add-service=dns
# firewall-cmd --complete-reload
# systemctl enable named.service
# systemctl start named.service

Se der erro verifique seu o Firewall está instalado, nesse caso, execute:

# yum install firewalld

Validando o servidor

Se tudo deu certo até aqui, o serviço está no ar pronto para ser testado. Altere o arquivo /etc/resolv.conf do servidor como no exemplo abaixo:

search jeff.local
nameserver 192.17.39.1

Teste com o comando:

dig dns.jeff.local
; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7_1.3 <<>> dns.jeff.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18455
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dns.jeff.local.            IN      A

;; ANSWER SECTION:
dns.jeff.local.     86400   IN      A       192.17.39.1

;; AUTHORITY SECTION:
jeff.local.         86400   IN      NS      dns.exeplo.com.br.

;; Query time: 0 msec
;; SERVER: 192.17.39.1#53(192.17.39.1)
;; WHEN: Tue Sep 01 23:52:45 BRT 2015
;; MSG SIZE  rcvd: 75

Resolva alguns dos hostnames registrado para validação:

nslookup www.jeff.local
Server:         192.17.39.1
Address:        192.17.39.1#53

Name:   www.jeff.local
Address: 192.17.39.3


Sucesso!

Qualquer dúvida, sugestão, correção ou problema, entre em contato.

Crédito: Instalando DNS Server Bind no CentOS - RHEL 7

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

VOIP - Interceptando tráfego de pacotes

Implementando Servidor NTP no Debian

Conexão do Vindula com o Active Directory Server 2008 R2

Docker - Containers em Linux (parte 2)

Obtendo TimeStamps da Blockchain com OpenTimestamps

  
Comentários
[1] Comentário enviado por ililminati em 07/02/2020 - 18:14h

Parabéns cara. Já havia seguido vários tutoriais e não tava sando como esperado. O seu foi simples, objetivo e assertivo.


[2] Comentário enviado por Robertomtb em 16/10/2020 - 12:11h

Obrigado pessoal, instalei seguindo os passos, e ficou zerado. TOP


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts