DNS (bind) no CentOS 7

O DNS (Domain Name System), é um serviço cliente/servidor baseado em hierarquias, em que a parte cliente é conhecida como resolver (resolvedor) e a parte servidora como nameserver. As conexões entre o cliente e o servidor se dão através do protocolo UDP e da porta 53.

O servidor DNS é baseado em uma estrutura hierárquica, em que o processo de resolução se dá da hierarquia mais alta para a mais baixa. O ponto mais alto da hierarquia é chamado de root-level-domain, ou domínio raiz, que é representado por um caractere ‘.’. O próximo nível da hierarquia são os top-level-domain, ou domínios de primeiro nível, ex:

  • com – Organização comercial
  • mil – Militar
  • net – Redes (backbones para a Internet)
  • org – organizações sem fins comerciais
  • gov – governamental
  • xx – Sigla do país representado por dois caracteres. Ex: br, uk

Zona de autoridade

É a parte do domínio ao qual um servidor de DNS é o responsável. Em cada zona tem-se um arquivo de zona que é a base de referências entre os IPs e nomes desta zona.

Servidor primário

É o servidor onde estão os arquivos originais da zona. Só pode existir um servidor primário por zona.

Servidor secundário

Aqui é onde ficam as réplicas dos arquivos de zona, que podem ser consultados no caso de inoperabilidade do servidor primário. Ao contrário do servidor primário, podem existir vários servidores secundários. No Brasil, para que possamos registrar um domínio é obrigatório ter dois servidores: o Primário e também um Secundário.

Servidor master

É aquele servidor para o qual um servidor secundário irá solicitar as cópias dos arquivos de zona.

[root@centos7 ~]# yum search bind | grep ^bind
bind.x86_64 : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System)
[root@centos7 sysconfig]# yum install -y bind.x86_64

Primeiro vamos adicionar as ACL’s:

# vim /etc/named.conf

acl “internal” {
localhost
192.168.56.0/24;
};

acl “transf_zones” {
192.168.56.2;
};

acl “transfer_zones” {
192.168.56.2;
};

acl “permit_update” {
192.168.56.2;
};

Nesse exemplo estou utilizando a rede 192.168.56.0:

[root@centos7 sysconfig]# hostname -I
10.0.2.15 192.168.56.2

E agora vamos editar a seção options:

options {
listen-on port 53 { 127.0.0.1; 192.168.56.2; };
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.168.1.0/24; };
recursion yes;
allow-recursion { internal; };
listen-on { 192.168.56.2; };
transfer-source 192.168.56.2;
query-source address 192.168.56.2;
allow-tranfer { transf_zones; };
forwarders { 192.168.56.1; 8.8.8.8; };
};

E abaixo da zona raiz (.), adicionamos a nossa zona:

zone “.” IN {
type hint;
file “named.ca”;
};

zone “cissaspike.net” IN {
type master;
file “/etc/named/cissaspike.db”;
allow-update { permit_update; };
allow-query { internal; };
allow-transfer { transfer_zones; };
};

zone “56.168.192.in-addr.arpa” IN {
type master;
file “/etc/named/1.168.192.in-addr.arpa.db”;
allow-update { permit_update; };
allow-transfer { transfer_zones; };
};

Salvamos e agora vamos criar e editar os arquivos “.db” referentes a zona. Criamos e modificamos seu dono para o usuário named (responsável por rodar o Bind).

[root@centos7 named]# touch cissaspike.db
[root@centos7 named]# touch 56.168.192.in-addr.arpa
[root@centos7 named]# chown named: *

Para descobrirmos se a configuração foi feita corretamente existem dois comandos para isso, o named-checkconf e o named-checkzone, que verifica a sintaxe dos arquivos de configuração e a sintaxe dos arquivos de dados de zona respectivamente.

Abaixo podemos verificar a saída do comando named-checkconf com erros de sintaxe no arquivo de configuração /etc/named.conf.

[root@centos7 named]# named-checkconf /etc/named.conf
/etc/named.conf:14: missing ';' before '192.168.56.0'
/etc/named.conf:25: missing ';' before 'acl'
/etc/named.conf:30: missing ';' before 'options'
/etc/named.conf:37: missing ';' before '}'
/etc/named.conf:43: unknown option 'allow-tranfer'
/etc/named.conf:56: 'recursion' redefined near 'recursion'

Acertamos a sintaxe do arquivo e executamos novamente o comando para verificar se ainda há algum erro:

[root@centos7 named]# named-checkconf /etc/named.conf

Sintaxe OK, e nosso arquivo ficou assim:

//
// 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.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html

acl "internal" {
localhost;
192.168.56.0/24;
};

acl "transf_zones" {
192.168.56.2;
};

acl "transfer_zones" {
192.168.56.2;
};

acl "permit_update" {
192.168.56.2;
};

options {
listen-on port 53 { 127.0.0.1; 192.168.56.2; };
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.168.56.0/24; };
recursion yes;
allow-recursion { internal; };
listen-on { 192.168.56.2; };
transfer-source 192.168.56.2;
query-source address 192.168.56.2;
allow-transfer { transf_zones; };
forwarders { 192.168.56.1; 8.8.8.8; };

/*
- 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;

/* 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";
};

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

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

zone "cissaspike.net" IN {
type master;
file "/etc/named/cissaspike.db";
allow-update { permit_update; };
allow-query { internal; };
allow-transfer { transfer_zones; };
};

zone "56.168.192.in-addr.arpa" IN {
type master;
file "/etc/named/56.168.192.in-addr.arpa.db";
allow-update { permit_update; };
allow-transfer { transfer_zones; };
};

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

Agora vamos verificar os arquivos da zona direta e revera:

[root@centos7 named]# named-checkzone cissaspike.net cissaspike.db
zone cissaspike.net/IN: loaded serial 2016042700
OK
[root@centos7 named]# named-checkzone cissaspike.net 56.168.192.in-addr.arpa.db
zone cissaspike.net/IN: loaded serial 2016042700
OK

O arquivo ficou assim:

[root@centos7 named]# cat cissaspike.db

$TTL 1800
@ IN SOA centos7.cissaspike.net. root.cissaspike.net. (

2015042700; Serial
3H; Refresh
1H; Retry
1W; Expire
3H); Minimum
;

@ IN NS centos7.cissaspike.net.
ns IN A 192.168.56.2
centos7.cissaspike.net. IN A 192.168.56.2

;@ IN A 127.0.0.1
;@ IN A ::1

E o da zona reversa assim:

[root@centos7 named]# cat 56.168.192.in-addr.arpa.db

$TTL 1800
@ IN SOA centos7.cissaspike.net. root.cissaspike.net. (

2015042700; Serial
3H; Refresh
1H; Retry
1W; Expire
3H); Minimum
;

@ IN NS centos7.cissaspike.net.
centos7.cissaspike.net. IN NS ns.
2.56.168 IN PTR centos7.cissaspike.net.

Agora vamos startar o named:

[root@centos7 named]# systemctl enable named.service
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.
[root@centos7 named]# systemctl start named.service

Agora vamos testar o servidor o Bind alterando o nosso /etc/resolv.conf:

[root@centos7 named]# echo -e "search cissaspike.net" > /etc/resolv.conf
[root@centos7 named]# echo -e "nameserver 192.168.56.2" >> /etc/resolv.conf
[root@centos7 named]# cat /etc/resolv.conf
search cissaspike.net
nameserver 192.168.56.2

E vamos testar:

[root@centos7 named]# nslookup www.nba.com
Server: 192.168.56.2
Address: 192.168.56.2#53

Non-authoritative answer:
www.nba.com canonical name = www.nba.com-ipv6.edgesuite.net.
www.nba.com-ipv6.edgesuite.net canonical name = a607.dscf1.akamai.net.
Name: a607.dscf1.akamai.net
Address: 96.6.123.96
Name: a607.dscf1.akamai.net
Address: 96.6.123.59

Também podemos testá-lo com o comando dig:

[root@centos7 named]# dig ns cissaspike.net

; <<>> DiG 9.9.4-RedHat-9.9.4-38.el7_3 <<>> ns cissaspike.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37462
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;cissaspike.net. IN NS

;; ANSWER SECTION:
cissaspike.net. 1800 IN NS centos7.cissaspike.net.

;; ADDITIONAL SECTION:
centos7.cissaspike.net. 1800 IN A 192.168.56.2

;; Query time: 0 msec
;; SERVER: 192.168.56.2#53(192.168.56.2)
;; WHEN: Sáb Dez 17 11:28:34 BRST 2016
;; MSG SIZE rcvd: 81

E com o host:

[root@centos7 named]# host nba.com
nba.com has address 157.166.249.247
nba.com has address 157.166.248.245
nba.com mail is handled by 10 mxb-001bf601.gslb.pphosted.com.
nba.com mail is handled by 10 mxa-001bf601.gslb.pphosted.com.

O servidor de DNS contém as zonas direta (cissaspike.db) e reversa (56.168.192.in-addr.arpa.db), e sempre que houver alguma alteração nos nomes nas zonas acima, deve-se incrementar o número serial das zonas e executar o comando rndc reload. Ou então, reiniciar o serviço do bind systemctl restart named.service. O serial dos arquivos é sempre uma combinação que remete à data atual, e esse serial deve ser atualizado nos dois arquivos – (cissaspike.db e .56.168.192.in-addr.arpa.db).