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.
- IP do slave que vai receber a view interna: 192.168.1.72
- IP do slave que vai receber a view externa: 192.168.1.73
- 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.