Instalação e configuração do Bind Trabalhando com Views Master/Slave no OpenBSD 5.2

Configurando o DNS no OpenBSD 5.2 com MultiView do mesmo domínio e fazendo replicação.

Problema: Quando era efetuado replicação e as zonas tinham o mesmo nome ele sempre replicava a zona da view interna ou o primeiro arquivo de referência dentro do named.conf.

Solução dentro de cada View vamos forçar para quem tem que ser a replica e no slave receber a replica que foi forçada por View. Precisamos de 2 endereços ip para o servidor Slave.

  1. IP do slave que vai receber a view interna: 192.168.1.72
  2. IP do slave que vai receber a view externa: 192.168.1.73
  3. IPS do servidor master 192.168.1.71

Aqui no OpenBSD o Bind já vem instalado no sistema por default e ele vem enjaulado em /var/named com isso somente precisamos configurar ele para funcionar de acordo com a nossa necessidade, vamos lá então.

Vamos fazer um backup do arquivo de configuração

cd /var/named/etc
cp named.conf named.conf.old

Agora vamos deixar o arquivo /var/named/etc/named.conf como abaixo, aqui estou utilizando a rede 192.168.1.0/24 como minha rede local para exemplo, mude conforme necessário.

vim /var/named/etc/named.conf
#Criando acl para definir as nossas redes internas.
acl "trusted" {
 192.168.1.0/24;
 127.0.0.1;
};

#Acl que define qual vai ser o slave que vai receber a view interna
acl "internal_slave" {
 192.168.1.72;
};

#Acl que define qual vai ser o slave que vai receber a view externa
acl "external_slave" {
 192.168.1.73;
};

#Algumas opções do Bind
options {
 listen-on port 53 { 127.0.0.1; 192.168.1.0/24; };
 directory       "/";
 dump-file       "/log/data/cache_dump.db";
 statistics-file "/log/data/named_stats.txt";
 memstatistics-file "/log/data/named_mem_stats.txt";
 allow-query     { any; };
 recursion no;
 version "Não Disponível";
};

#Controles
include "/etc/rndc.key";

controls {
        inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { rndc-key; };
};

#LOGS
logging {
 channel xfer-log {
 file "/log/named.log";
 print-category yes;
 print-severity yes;
 print-time yes;
 severity info;
 };
 category xfer-in { xfer-log; };
 category xfer-out { xfer-log; };
 category notify { xfer-log; };

 channel update-debug {
 file "/log/named-update-debug.log";
 severity  debug 3;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 channel security-info    {
 file "/log/named-auth-info.log";
 severity  info;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 category update { update-debug; };
 category security { security-info; };

 };

#Incluir os nossos arquivos externos que vão conter as configurações das Views
include "/etc/named.conf.internal-zones";
include "/etc/named.conf.external-zones";

Agora vamos criar os diretórios que vão armazenas os logs e vamos acertar as permissões deles.

mkdir -p /var/named/log/data
chown -R root:named /var/named/log
chmod -R 775 /var/named/log

Agora vamos gerar a chave do rndc

rndc-confgen -a -c /var/named/etc/rndc.key -k rndc-key -b 256

Agora precisamos acertar as permissões dos arquivos

chown root:named /var/named/etc/rndc.key
chmod 640 /var/named/etc/rndc.key

Agora vamos criar o nosso arquivo da View Interna /var/named/etc/named.conf.internal-zones onde somente os nossos clientes da rede local e o nosso servidor local vão poder consultar.

vim /var/named/etc/named.conf.internal-zones
#Definindo a nossa View interna
view "internal" {

#Definindo quais clientes vão poder consultar esta view, então vão ser a nossa rede interna mesmo o servidor external_slave
 match-clients { !external_slave; trusted; };

#Definindo que os clientes dessa view vão poder efetuar consultas recursivas.
 recursion yes;

#Qual servidor vai poder receber a replica dessa view
allow-transfer {
 internal_slave;
};

#Quem vai ser notificado aqui temos que informar os endereços ips.
also-notify {
 192.168.1.72;
};

#Zonas default do bind
zone "." {
        type hint;
        file "etc/root.hint";
};

zone "localhost" {
        type master;
        file "standard/localhost";
        allow-transfer { localhost; };
};

zone "127.in-addr.arpa" {
        type master;
        file "standard/loopback";
        allow-transfer { localhost; };
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" {
        type master;
        file "standard/loopback6.arpa";
        allow-transfer { localhost; };
};


#Nosso domínio de teste.
zone "douglasqsantos.com.br" {
 type master;
 file "master/db.douglasqsantos.com.br.internal";
};

};

Agora vamos criar a nossa View Externa /var/named/etc/named.conf.external-zones aonde qualquer um vai poder consultar não sendo a nossa rede local e nem o nosso servidor local

vim /var/named/etc/named.conf.external-zones
#Definição da nossa view Externa
view "external" {

#Definindo quais clientes vão poder consultar esta view
 match-clients { external_slave; !trusted; any; };

#Os clientes dessa view não poderão efetuar consultas recursivas
 recursion no;

#Quam vai poder receber replica dessa view
 allow-transfer {
 external_slave;
 };

#Quem vai ser notificado aqui temos que informar o endereço ip
 also-notify {
 192.168.1.73;
 };

#Nosso dominio de teste.
zone "douglasqsantos.com.br" {
 type master;
 file "master/db.douglasqsantos.com.br.external";
 };

};

Agora vamos criar o arquivo que os nossos clientes internos vão consultar /var/named/master/db.douglasqsantos.com.br.internal

vim /var/named/master/db.douglasqsantos.com.br.internal
$TTL 86400
@ IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
 2012111601  ; Serial
 3600       ; Refresh
 1800        ; Retry
 1209600      ; Expire
 3600 )     ; Minimum

;
@               IN      NS   douglasqsantos.com.br.
douglasqsantos.com.br. IN TXT "v=spf1 a mx ip4:192.168.1.0/24 -all"
mail.douglasqsantos.com.br IN TXT "v=spf1 a -all"

@               IN      NS   ns1.douglasqsantos.com.br.
@               IN      NS   ns2.douglasqsantos.com.br.
@               IN      MX   0 mail.douglasqsantos.com.br.

;NAME SERVERS
@               IN      A    192.168.1.71
ns1             IN      A    192.168.1.71
ns2             IN      A    192.168.1.72
dns             IN      A    192.168.1.71

;MAIL SERVERS
mail            IN      A    192.168.1.71
imap            IN      CNAME mail
pop             IN      CNAME mail
smtp            IN      CNAME mail
webmail         IN      CNAME mail

;WEB SERVERS
www             IN      A    192.168.1.72
ftp             IN      CNAME www
mailadmin       IN      CNAME www

Agora vamos criar o arquivo que os clientes externos vão consultar /var/named/master/db.douglasqsantos.com.br.external

vim /var/named/master/db.douglasqsantos.com.br.external
$TTL 86400
@ IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
 2012111601  ; Serial
 3600       ; Refresh
 1800        ; Retry
 1209600      ; Expire
 3600 )     ; Minimum

;
@               IN      NS   douglasqsantos.com.br.
douglasqsantos.com.br. IN TXT "v=spf1 a mx ip4:200.200.200.0/23 -all"
mail.douglasqsantos.com.br IN TXT "v=spf1 a -all"

@               IN      NS   ns1.douglasqsantos.com.br.
@               IN      NS   ns2.douglasqsantos.com.br.
@               IN      MX   0 mail.douglasqsantos.com.br.

;NAME SERVERS
@               IN      A    200.200.200.25
ns1             IN      A    200.200.200.25
ns2             IN      A    200.200.200.27
dns             IN      A    200.200.200.25

;MAIL SERVERS
mail            IN      A    200.200.200.25
imap            IN      CNAME mail
pop             IN      CNAME mail
smtp            IN      CNAME mail
webmail         IN      CNAME mail

;WEB SERVERS
www             IN      A    200.200.200.27
ftp             IN      CNAME www
mailadmin       IN      CNAME www

Vamos agora ajustar o arquivo /etc/resolv.conf para que o nosso servidor consiga encontrar a zona do dominio.com.br

vim /etc/resolv.conf
search douglasqsantos.com.br
domain douglasqsantos.com.br
nameserver 127.0.0.1
nameserver 192.168.1.72

Agora precisamos habilitar o named em /etc/rc.conf.local da seguinte forma

vim /etc/rc.conf.local
named_flags=""
pkg_scripts="named"

Vamos agora iniciar o serviço e testar.

/etc/rc.d/named start

Agora vamos fazer alguns testes.

Vamos consultar o endereço do host www

nslookup www
Server:               127.0.0.1
Address:        127.0.0.1#53

Name:   www.douglasqsantos.com.br
Address: 192.168.1.72

Agora vamos consultar o endereço do host mail.douglasqsantos.com.br aqui poderíamos consultar somente por mail dai ele completaria com o parâmetro domain do resolv.conf

nslookup mail.douglasqsantos.com.br
Server:              127.0.0.1
Address:        127.0.0.1#53

Name:   mail.douglasqsantos.com.br
Address: 192.168.1.71

Vamos consultar os registros do tipo A do nosso domínio.

dig -t A douglasqsantos.com.br

; <<>> DiG 9.4.2-P2 <<>> -t A douglasqsantos.com.br
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9558
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 2

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

;; ANSWER SECTION:
douglasqsantos.com.br.        86400   IN      A       192.168.1.71

;; AUTHORITY SECTION:
douglasqsantos.com.br.        86400   IN      NS      ns2.douglasqsantos.com.br.
douglasqsantos.com.br.        86400   IN      NS      ns1.douglasqsantos.com.br.
douglasqsantos.com.br.        86400   IN      NS      douglasqsantos.com.br.

;; ADDITIONAL SECTION:
ns1.douglasqsantos.com.br.    86400   IN      A       192.168.1.71
ns2.douglasqsantos.com.br.    86400   IN      A       192.168.1.72

;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Nov 16 10:56:20 2012
;; MSG SIZE  rcvd: 131

Vamos agora consultar todos os registros do nosso domínio.

dig -t axfr douglasqsantos.com.br

; <<>> DiG 9.4.2-P2 <<>> -t axfr douglasqsantos.com.br
;; global options:  printcmd
; Transfer failed.

Como pode ser notado não temos permissão para efetuar a transferência da zona, porém já permitimos a transferência para o servidor slave.

Como pode ser notado o nosso servidor estar funcionando corretamente em MultiView, agora vamos fazer os ajustes para ele efetuar a replicação como precisamos.

Agora vamos configurar o servidor Slave

Agora vamos fazer um backup do arquivo de configuração do nosso bind.

cd /var/named/etc
cp named.conf named.conf.old

Agora vamos deixar o arquivo /var/named/etc/named.conf como abaixo, aqui estou utilizando a rede 192.168.1.0/24 como minha rede local para exemplo, mude conforme necessário.

vim /var/named/etc/named.conf
#Criando acl para definir as nossas redes internas.
acl "trusted" {
 192.168.1.0/24;
 127.0.0.1;
};

#Acl que define qual vai ser o dns master
acl "dns_master" {
 192.168.1.71;
};

#Algumas opções do Bind
options {
 listen-on port 53 { 127.0.0.1; 192.168.1.0/24; };
 directory       "/";
 dump-file       "/log/data/cache_dump.db";
 statistics-file "/log/data/named_stats.txt";
 memstatistics-file "/log/data/named_mem_stats.txt";
 allow-query     { any; };
 recursion no;
 version "Não Disponível";
};

#Controles
include "/etc/rndc.key";

controls {
        inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { rndc-key; };
};

#LOGS
logging {
 channel xfer-log {
 file "/log/named.log";
 print-category yes;
 print-severity yes;
 print-time yes;
 severity info;
 };
 category xfer-in { xfer-log; };
 category xfer-out { xfer-log; };
 category notify { xfer-log; };

 channel update-debug {
 file "/log/named-update-debug.log";
 severity  debug 3;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 channel security-info    {
 file "/log/named-auth-info.log";
 severity  info;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 category update { update-debug; };
 category security { security-info; };

 };

#Incluir os nossos arquivos externos que vão conter as configurações das Views
include "/etc/named.conf.internal-zones";
include "/etc/named.conf.external-zones";

Agora vamos criar os diretórios que vão armazenas os logs e vamos acertar as permissões deles.

mkdir -p /var/named/log/data
chown -R root:named /var/named/log
chmod -R 775 /var/named/log

Agora vamos gerar a chave do rndc isso demora um pouco ;)

rndc-confgen -a -c /var/named/etc/rndc.key -k rndc-key -b 256

Agora precisamos acertar as permissões dos arquivos

chown root:named /var/named/etc/rndc.key
chmod 640 /var/named/etc/rndc.key

Agora vamos criar o arquivo da nossa View interna /var/named/etc/named.conf.internal-zones

vim /var/named/etc/named.conf.internal-zones
#Definindo a nossa View interna
view "internal" {

#Definindo quais clientes vão poder consultar esta view, então vão ser a nossa rede interna mesmo o servidor external_slave
 match-clients { trusted; };

#Definindo que os clientes dessa view vão poder efetuar consultas recursivas.
 recursion yes;

#Qual servidor vai poder receber a replica dessa view
allow-notify {
 dns_master;
};

#Nao disponibiliza transferencia de zona do servidor SLAVE
 allow-transfer {
 none;
};

#Zonas default do named
zone "." {
        type hint;
        file "etc/root.hint";
};

zone "localhost" {
        type master;
        file "standard/localhost";
        allow-transfer { localhost; };
};

zone "127.in-addr.arpa" {
        type master;
        file "standard/loopback";
        allow-transfer { localhost; };
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" {
        type master;
        file "standard/loopback6.arpa";
        allow-transfer { localhost; };
};


#Nosso domínio de teste.
zone "douglasqsantos.com.br" {
type slave;
masters { 192.168.1.71; };
transfer-source 192.168.1.72; #Especificando qual transferencia do master que eu vou poder receber nessa view
file "slave/db.douglasqsantos.com.br.internal";
};

};

Vamos agora configurar a View Externa /var/named/etc/named.conf.external-zones

vim /var/named/etc/named.conf.external-zones
#Definição da nossa view Externa
view "external" {

#Definindo quais clientes vão poder consultar esta view
 match-clients { !trusted; any; };

#Os clientes dessa view não poderão efetuar consultas recursivas
 recursion no;

#Quem vai ser notificado aqui temos que informar o endereço ip
 allow-notify {
 dns_master;
 };

#Nao disponibiliza transferencia de zona do servidor SLAVE
 allow-transfer {
 none;
};


#Nosso dominio de teste.
zone "douglasqsantos.com.br" {
 type slave;
 masters { 192.168.1.71; };
 transfer-source 192.168.1.73; #Especificando qual transferencia do master que eu vou poder receber nessa view.
 file "slave/db.douglasqsantos.com.br.external";
 };

};

Agora vamos ajustar o /etc/resolv.conf

vim /etc/resolv.conf
search douglasqsantos.com.br
domain douglasqsantos.com.br
nameserver 127.0.0.1
nameserver 192.168.1.71

Agora vamos acertar o /etc/rc.conf.local

vim /etc/rc.conf.local
named_flags=""
pkg_scripts="named"

Agora vamos iniciar o serviço

/etc/rc.d/named start

Agora podemos acompanhar os logs em

tail -f /var/named/log/named.log
16-Nov-2012 10:55:32.422 notify: info: client 192.168.1.71#33458: view internal: received notify for zone 'localhost'
16-Nov-2012 10:55:32.927 notify: info: client 192.168.1.71#33458: view internal: received notify for zone '127.in-addr.arpa'
16-Nov-2012 10:55:32.927 notify: info: client 192.168.1.71#33458: view internal: received notify for zone '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'
16-Nov-2012 10:55:32.928 notify: info: client 192.168.1.71#33458: view internal: received notify for zone 'douglasqsantos.com.br'
16-Nov-2012 10:55:32.929 notify: info: client 192.168.1.71#33458: view internal: received notify for zone 'douglasqsantos.com.br'
16-Nov-2012 10:55:32.931 xfer-in: info: transfer of 'douglasqsantos.com.br/IN/internal' from 192.168.1.71#53: connected using 192.168.1.72#11286
16-Nov-2012 10:55:33.129 xfer-in: info: transfer of 'douglasqsantos.com.br/IN/internal' from 192.168.1.71#53: end of transfer
16-Nov-2012 10:55:33.129 notify: info: zone douglasqsantos.com.br/IN/internal: sending notifies (serial 2012111601)
16-Nov-2012 11:07:06.011 notify: info: zone douglasqsantos.com.br/IN/internal: sending notifies (serial 2012111601)
16-Nov-2012 11:07:06.011 notify: info: zone douglasqsantos.com.br/IN/external: sending notifies (serial 2011061704)

Vamos conferir o arquivo com a zona interna.

cat /var/named/slave/db.douglasqsantos.com.br.internal
$ORIGIN .
$TTL 86400      ; 1 day
douglasqsantos.com.br         IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
                                2012111601 ; serial
                                3600       ; refresh (1 hour)
                                1800       ; retry (30 minutes)
                                1209600    ; expire (2 weeks)
                                3600       ; minimum (1 hour)
                                )
                        NS      douglasqsantos.com.br.
                        NS      ns1.douglasqsantos.com.br.
                        NS      ns2.douglasqsantos.com.br.
                        A       192.168.1.71
                        MX      0 mail.douglasqsantos.com.br.
                        TXT     "v=spf1 a mx ip4:192.168.1.0/24 -all"
$ORIGIN douglasqsantos.com.br.
mail.douglasqsantos.com.br    TXT     "v=spf1 a -all"
dns                     A       192.168.1.71
ftp                     CNAME   www
imap                    CNAME   mail
mail                    A       192.168.1.71
mailadmin               CNAME   ww
ns1                     A       192.168.1.71
ns2                     A       192.168.1.72
pop                     CNAME   mail
smtp                    CNAME   mail
webmail                 CNAME   mail
www                     A       192.168.1.72

Agora vamos conferir o arquivo da zona Externa.

cat /var/named/slave/db.douglasqsantos.com.br.external
$ORIGIN .
$TTL 86400      ; 1 day
douglasqsantos.com.br         IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
                                2011061704 ; serial
                                3600       ; refresh (1 hour)
                                1800       ; retry (30 minutes)
                                1209600    ; expire (2 weeks)
                                3600       ; minimum (1 hour)
                                )
                        NS      douglasqsantos.com.br.
                        NS      ns1.douglasqsantos.com.br.
                        NS      ns2.douglasqsantos.com.br.
                        A       200.200.200.25
                        MX      0 mail.douglasqsantos.com.br.
                        TXT     "v=spf1 a mx ip4:200.200.200.0/23 -all"
$ORIGIN douglasqsantos.com.br.
mail.douglasqsantos.com.br    TXT     "v=spf1 a -all"
dns                     A       200.200.200.25
ftp                     CNAME   www
imap                    CNAME   mail
mail                    A       200.200.200.25
mailadmin               CNAME   www
ns1                     A       200.200.200.25
ns2                     A       200.200.200.27
pop                     CNAME   mail
smtp                    CNAME   mail
webmail                 CNAME   mail
www                     A       200.200.200.27

Vamos fazer alguns teste de consulta no servidor Slave.

Vamos consultar o endereço do host www

nslookup www
Server:               127.0.0.1
Address:        127.0.0.1#53

Name:   www.douglasqsantos.com.br
Address: 192.168.1.72

Agora vamos consultar o endereço do host mail.douglasqsantos.com.br aqui poderíamos consultar somente por mail dai ele completaria com o parâmetro domain do resolv.conf

nslookup mail.douglasqsantos.com.br
Server:              127.0.0.1
Address:        127.0.0.1#53

Name:   mail.douglasqsantos.com.br
Address: 192.168.1.71

Vamos consultar os registros do tipo A do nosso domínio.

dig -t A douglasqsantos.com.br

; <<>> DiG 9.4.2-P2 <<>> -t A douglasqsantos.com.br
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47873
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 2

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

;; ANSWER SECTION:
douglasqsantos.com.br.        86400   IN      A       192.168.1.71

;; AUTHORITY SECTION:
douglasqsantos.com.br.        86400   IN      NS      ns2.douglasqsantos.com.br.
douglasqsantos.com.br.        86400   IN      NS      douglasqsantos.com.br.
douglasqsantos.com.br.        86400   IN      NS      ns1.douglasqsantos.com.br.

;; ADDITIONAL SECTION:
ns1.douglasqsantos.com.br.    86400   IN      A       192.168.1.71
ns2.douglasqsantos.com.br.    86400   IN      A       192.168.1.72

;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Nov 16 11:09:35 2012
;; MSG SIZE  rcvd: 131

Agora vamos consultar todos os registros do nosso domínio.

dig -t AXFR douglasqsantos.com.br

; <<>> DiG 9.4.2-P2 <<>> -t AXFR douglasqsantos.com.br
;; global options:  printcmd
; Transfer failed.

Como pode ser notado não conseguimos efetuar a transferência pois não configuramos para o servidor transferir dele para ele mesmo que é algo redundante.

Referências