Instalação e configuração do Bind Trabalhando com Views Master/Slave no Debian Squeeze

Configurando o DNS no Debian Squeeze com MultiView do mesmo domínio e fazendo replicação e como precisamos de segurança vamos efetuar a implementação do DNSSEC. 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.

O DNSSEC (Domain Name System Security Extensions) é um padrão internacional que estende a tecnologia DNS.O que DNSSEC adiciona é um sistema de resolução de nomes mais seguro, reduzindo o risco de manipulação de dados e domínios forjados. O mecanismo utilizado pelo DNSSEC é baseado na tecnologia de criptografia que emprega assinaturas. DNSSEC utiliza um sistema de chaves assimétricas. Isso significa que alguém com um domínio compatível com DNSSEC possui um par de chaves eletrônicas que consistem em uma chave privada e uma chave pública. Em razão do mantenedor das chaves utilizar a chave privada para assinar digitalmente sua própria zona no DNS, é possível que todo mundo com acesso a chave pública desta zona verifique que os dados transferidos desta zona estão intactos.

DNSSEC soluciona alguns problemas encontrados na atual tecnologia DNS. Falsas informações DNS criam oportunidades para roubo de informações de terceiros ou alteração de dados em diversos tipos de transações, como compras eletrônicas. Na tecnologia DNS, um ataque DNS com informação forjada é extremamente dificil de ser detectado e na pratica impossível de ser previnido. O objetivo da extensão DNSSEC é assegurar o conteúdo do DNS e impedir estes ataques validando os dados e garantindo a origem das informações.

Para que serve DNSSEC

Provê segurança para a resolução de endereços.

Funciona como um caminho alternativo para a verificação de autenticidade.

Estas operações ocorrem antes de qualquer verificação de segurança em camadas superiores (SSL, SSH, PGP etc…).

Como funciona

- A autenticidade e integridade são providas pela assinatura dos Conjuntos de Registros de Recursos (Resource Records Sets - RRset) com uma chave privada. - Zonas delegadas (filhas) assinam seus proprios RRsets com sua chave privada. - Autenticidade da chave é verificada pela assinatura na zona pai do Recurso DS (Record DS) (hash da chave pública da zona filha). - A chave pública é usada para verificar RRSIGs dos RRsets. - Autenticidade da não existência de um nome ou tipo provida por uma cadeia de registros que aponta para o próximo em uma sequência canônica.

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: 10.0.0.27
  2. IP do slave que vai receber a view externa: 10.0.0.28
  3. IP do servidor master 10.0.0.25.

Prepare o seu sistema com o seguinte script Easy-Debian para que não falte nenhum pacote ou configuração.

Vamos primeiro configurar o Servidor Master

Instalando os pacotes

aptitude update
aptitude install bind9 dnsutils dnssec-tools libnet-dns-sec-perl libmailtools-perl libcrypt-openssl-random-perl -y

Agora vamos parar o nosso Bind para poder efetuar as modificações

/etc/init.d/bind9 stop

Agora vamos ter que criar a nossa jaula

mkdir -p /var/lib/named/etc
mkdir -p /var/lib/named/dev
mkdir -p /var/lib/named/var/log
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/cache/bind/keys
mkdir -p /var/lib/named/var/cache/bind/dynamic
mkdir -p /var/lib/named/var/run/bind/run
mknod /var/lib/named/dev/null c 1 3
mknod /var/lib/named/dev/random c 1 8
mknod /var/lib/named/dev/zero c 1 5

Agora vamos ajustar as permissões

chmod 666 /var/lib/named/dev/{null,random,zero}
chown -R bind:bind /var/lib/named/var/*

Agora vamos ajustar as configurações

mv /etc/bind /var/lib/named/etc
ln -sf /var/lib/named/etc/bind /etc/bind
cp /etc/localtime /var/lib/named/etc
chown -R bind:bind /var/lib/named/etc/bind
chown -R root:bind /var/lib/named/var/cache/bind/dynamic
chmod -R 775 /var/lib/named/var/cache/bind/dynamic

Agora vamos ajustar o arquivo de configuração do bind para ele reconhecer a jaula vamos editar o arquivo /etc/default/bind9

vim /etc/default/bind9
RESOLVCONF=yes
OPTIONS="-u bind -t /var/lib/named"

Agora vamos ajustar o /etc/resolv.conf o arquivo tem que ficar como abaixo

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

Vamos acertar o arquivo /etc/bind/named.conf.options deixe ele como abaixo eu estou definindo a minha rede interna como 10.0.0.0/23 mude ela conforme a necessidade

vim /etc/bind/named.conf.options
#/etc/bind/named.conf.options
options {
 directory "/var/cache/bind";
 managed-keys-directory "/var/cache/bind/dynamic";
 auth-nxdomain no;
 listen-on-v6 { any; };
 listen-on { 127.0.0.1/32; 10.0.0.0/23; };
 allow-query { any; };
 recursion no;
 version "Nao Disponivel";
### Habilita DNSSEC ###
 dnssec-enable yes;
 dnssec-validation yes;
 dnssec-lookaside auto;
};

#Controles 
include "/etc/bind/rndc.key";
controls {
        inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { rndc-key; };
};

#LOGS
logging {
 channel xfer-log {
 file "/var/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 "/var/log/named-update-debug.log";
 severity  debug 3;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 channel security-info    {
 file "/var/log/named-auth-info.log";
 severity  info;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 category update { update-debug; };
 category security { security-info; };
 };

#Controle de ancoras de DNSSEC
include "/etc/bind/bind.keys";

Agora vamos acertar o nosso arquivo /etc/bind/named.conf deixe ele como abaixo

vim /etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.internal-zones";
include "/etc/bind/named.conf.external-zones";

Agora vamos configurar a nossa view interna o arquivo /etc/bind/named.conf.internal-zones como já comentado estou utilizando a rede 10.0.0.0/23 para a minha rede interna mude conforme a necessidade.

vim /etc/bind/named.conf.internal-zones
#Definindo quem vão ser os nossos hosts internos, ex: a nossa rede e a maquina local
acl "internal_hosts" {
 10.0.0.0/23;
 127.0.0.1/32;
};

#Definindo qual vai ser o ip do servidor slave que vai poder receber a replicação da view internal
acl "internal_slave" {
 10.0.0.27;
};

#Definição da View interna
view "internal" {

#Definindo quais clientes vão poder consultar essa view
 match-clients {
 !10.0.0.28;
 internal_hosts;
 };

#O nossos clientes da view interna vão poder efetuar consultas recursivas
 recursion yes;

#Para qual servidor vai ser liberado a transferencia dessa view.
 allow-transfer {
 internal_slave;
 };

#Quem o bind vai notificar em caso de alterações de zona.
 also-notify {
 10.0.0.27;
 };

#Zonas hint aonde temos as definições dos root masters
 zone "." {
 type hint;
 file "/etc/bind/db.root";
 };

#Zonas internas
 zone "localhost" {
 type master;
 file "/etc/bind/db.local";
 };

zone "127.in-addr.arpa" {
 type master;
 file "/etc/bind/db.127";
 };

 zone "0.in-addr.arpa" {
 type master;
 file "/etc/bind/db.0";
 };

 zone "255.in-addr.arpa" {
 type master;
 file "/etc/bind/db.255";
 };

#Meu dominio de teste.
 zone "douglasqsantos.com.br" {
 type master;
 file "db.douglasqsantos.com.br.internal";
 };

};

Agora vamos configurar a View Externa /etc/bind/named.conf.external-zones

vim /etc/bind/named.conf.external-zones
#Definindo os clientes locais o nome dessa acl tem que ser diferente da acl da view interna
acl "rede_local" {
 10.0.0.0/23;
 127.0.0.1/32;
};

#Defindo o ip do servidor slave para a view externa
acl "external_slave" {
 10.0.0.28;
};

#Definição da View externa
view "external" {

 #Definição dos clientes que vão poder consultar essa view
 match-clients {
 external_slave;
 !rede_local;
 any;
 };

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

 #Para qual servidor vai ser liberada a transferencia dessa view
 allow-transfer {
 external_slave;
 };

 #Quem o bind vai notificar quando for efetuada alguma alteração nas zonas
 also-notify {
 10.0.0.28;
 };

 #A minha zona de teste.
 zone "douglasqsantos.com.br" {
 type master;
 file "db.douglasqsantos.com.br.external";
 };
};

Vamos agora criar os arquivos das zonas /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.internal

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

;
@               IN      NS   douglasqsantos.com.br.
douglasqsantos.com.br. IN TXT "v=spf1 a mx ip4:10.0.0.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    10.0.0.25
ns1             IN      A    10.0.0.25
ns2             IN      A    10.0.0.27
dns             IN      A    10.0.0.25

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

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

Agora vamos configurar o arquivo da view externa /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.external

vim /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.external
$TTL 86400
@ IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
 2011061703  ; 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

Agora já podemos reiniciar o nosso bind

/etc/init.d/bind9 restart

Vamos dar uma olhada nos logs

tail -f /var/log/syslog
Jun 17 15:46:28 dns1 named[1834]: zone douglasqsantos.com.br/IN/external: loaded serial 2011061703
Jun 17 15:46:28 dns1 named[1834]: managed-keys-zone ./IN/external: loading from master file 3c4623849a49a53911c4a3e48d8cead8a1858960bccdea7a1b978d73ec2f06d7.mkeys failed: file not found
Jun 17 15:46:28 dns1 named[1834]: managed-keys-zone ./IN/external: loaded serial 0
Jun 17 15:46:28 dns1 named[1834]: running
Jun 17 15:46:28 dns1 named[1834]: zone 0.in-addr.arpa/IN/internal: sending notifies (serial 1)
Jun 17 15:46:28 dns1 named[1834]: zone localhost/IN/internal: sending notifies (serial 2)
Jun 17 15:46:28 dns1 named[1834]: zone 127.in-addr.arpa/IN/internal: sending notifies (serial 1)
Jun 17 15:46:28 dns1 named[1834]: zone 255.in-addr.arpa/IN/internal: sending notifies (serial 1)
Jun 17 15:46:28 dns1 named[1834]: zone douglasqsantos.com.br/IN/internal: sending notifies (serial 2011061703)
Jun 17 15:46:28 dns1 named[1834]: zone douglasqsantos.com.br/IN/external: sending notifies (serial 2011061703)

Como pode ser notado acima está faltando um arquivo por enquanto porém ele não existia quando iniciamos o bind, após iniciar o bind que este arquivo vai ser gerado podemos visualizar os arquivos em

ls /var/lib/named/var/cache/bind/dynamic
3bed2cb3a3acf7b6a8ef408420cc682d5520e26976d354254f528c965612054f.mkeys      3c4623849a49a53911c4a3e48d8cead8a1858960bccdea7a1b978d73ec2f06d7.mkeys
3bed2cb3a3acf7b6a8ef408420cc682d5520e26976d354254f528c965612054f.mkeys.jnl  3c4623849a49a53911c4a3e48d8cead8a1858960bccdea7a1b978d73ec2f06d7.mkeys.jnl

Caso esteja trabalhando com somente uma view que é a default vamos ter o arquivo managed-keys.bind e para cada nova view vai ser acrescentado um novo arquivo *.mkeys

Caso os arquivo *.mkyes já estejam criados no diretório /var/lib/named/var/cache/bind/dynamic podemos mandar reiniciar novamente o bind para ele carregar estes arquivo

/etc/init.d/bind9 restart

Após reiniciar podemos acompanhar nos logs

tail -f /var/log/syslog
Jun 17 15:48:28 dns1 named[9583]: set up managed keys zone for view internal, file '/var/cache/bind/dynamic/3bed2cb3a3acf7b6a8ef408420cc682d5520e26976d354254f528c965612054f.mkeys'
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: 254.169.IN-ADDR.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: 2.0.192.IN-ADDR.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: 100.51.198.IN-ADDR.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: 113.0.203.IN-ADDR.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: 255.255.255.255.IN-ADDR.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: 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.0.IP6.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: 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
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: D.F.IP6.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: 8.E.F.IP6.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: 9.E.F.IP6.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: A.E.F.IP6.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: B.E.F.IP6.ARPA
Jun 17 15:48:28 dns1 named[9583]: automatic empty zone: view internal: 8.B.D.0.1.0.0.2.IP6.ARPA
Jun 17 15:48:28 dns1 named[9583]: set up managed keys zone for view external, file '/var/cache/bind/dynamic/3c4623849a49a53911c4a3e48d8cead8a1858960bccdea7a1b978d73ec2f06d7.mkeys'

Vamos efetuar alguns teste de consultas

Vamos consultar o registro www do domínio douglasqsantos.com.br

nslookup www
Server:         127.0.0.1
Address:        127.0.0.1#53

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

Vamos agora consultar o registro ns1.douglasqsantos.com.br

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

Name:   ns1.douglasqsantos.com.br
Address: 10.0.0.25

Configuração do Servidor Slave

Instalando os pacotes

aptitude update
aptitude install bind9 dnsutils dnssec-tools libnet-dns-sec-perl libmailtools-perl libcrypt-openssl-random-perl -y

Agora vamos parar o nosso Bind para poder efetuar as modificações

/etc/init.d/bind9 stop

Agora vamos ter que criar a nossa jaula

mkdir -p /var/lib/named/etc
mkdir -p /var/lib/named/dev
mkdir -p /var/lib/named/var/log
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/cache/bind/slave
mkdir -p /var/lib/named/var/cache/bind/dynamic
mkdir -p /var/lib/named/var/cache/bind/keys/transferencias
mkdir -p /var/lib/named/var/run/bind/run
mknod /var/lib/named/dev/null c 1 3
mknod /var/lib/named/dev/random c 1 8
mknod /var/lib/named/dev/zero c 1 5

Agora vamos ajustar as permissões

chmod 666 /var/lib/named/dev/{null,random,zero}
chown -R bind:bind /var/lib/named/var/*

Agora vamos ajustar as configurações

mv /etc/bind /var/lib/named/etc
ln -sf /var/lib/named/etc/bind /etc/bind
cp /etc/localtime /var/lib/named/etc
chown -R bind:bind /var/lib/named/etc/bind
chown -R root:bind /var/lib/named/var/cache/bind/dynamic
chmod -R 775 /var/lib/named/var/cache/bind/dynamic

Agora vamos ajustar o arquivo /etc/default/bind9 de configuração do bind para ele reconhecer a jaula

vim /etc/default/bind9
RESOLVCONF=yes
OPTIONS="-u bind -t /var/lib/named"

Agora vamos ajustar o /etc/resolv.conf o arquivo tem que ficar como abaixo

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

Vamos acertar o arquivo /etc/bind/named.conf.options deixe ele como abaixo eu estou definindo a minha rede interna como 10.0.0.0/23 mude ela conforme a necessidade

vim /etc/bind/named.conf.options
#/etc/bind/named.conf.options
options {
 directory "/var/cache/bind";
 managed-keys-directory "/var/cache/bind/dynamic";
 auth-nxdomain no;
 listen-on-v6 { any; };
 listen-on { 127.0.0.1/32; 10.0.0.0/23; };
 allow-query { any; };
 recursion no;
 version "Nao Disponivel";
### Habilita DNSSEC ###
 dnssec-enable yes;
 dnssec-validation yes;
 dnssec-lookaside auto;
};

#Controles 
include "/etc/bind/rndc.key";
controls {
        inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { rndc-key; };
};

#LOGS
logging {
 channel xfer-log {
 file "/var/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 "/var/log/named-update-debug.log";
 severity  debug 3;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 channel security-info    {
 file "/var/log/named-auth-info.log";
 severity  info;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 category update { update-debug; };
 category security { security-info; };
 };

#Controle de ancoras de DNSSEC
include "/etc/bind/bind.keys";

Agora vamos acertar o nosso arquivo /etc/bind/named.conf deixe ele como abaixo

vim /etc/bind/named.conf
#/etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.internal-zones";
include "/etc/bind/named.conf.external-zones";

Agora vamos configurar a nossa view interna /etc/bind/named.conf.internal-zones como já comentado estou utilizando a rede 10.0.0.0/23 para a minha rede interna mude conforme a necessidade.

vim /etc/bind/named.conf.internal-zones
#Vamos definir quem é o nosso servidor master
acl "dns_masters" {
 10.0.0.25;
};

#Vamos definir quais são os nossos hosts internos
acl "internal_hosts" {
 10.0.0.0/23;
 127.0.0.0/32;
};

#Vamos definir a nossa view interna
view "internal" {

 #Vamos definir quais são os clientes dessa view
 match-clients {
 internal_hosts;
 };

 #Os clientes dessa view vão poder efetuar consultas recursvas
 recursion yes;

 #Quais os servidores que vão ser noficados caso ocorra alterações nas zonas.
 allow-notify {
 dns_masters;
 };

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


 #Zona que define os root masters
 zone "." {
 type hint;
 file "/etc/bind/db.root";
 };

 #Zonas locais
 zone "localhost" {
 type master;
 file "/etc/bind/db.local";
 };

 zone "127.in-addr.arpa" {
 type master;
 file "/etc/bind/db.127";
 };

zone "0.in-addr.arpa" {
 type master;
 file "/etc/bind/db.0";
 };

 zone "255.in-addr.arpa" {
 type master;
 file "/etc/bind/db.255";
 };

 #Minha zona teste que vai ser replicada do servidor master na view interna.
 zone "douglasqsantos.com.br" {
 type slave;
 masters { 10.0.0.25; }; #Ip do nosso servidor master
 transfer-source  10.0.0.27; #Especificando qual transferencia do master que eu vou poder receber nessa view
 file "slave/db.douglasqsantos.com.br.internal";
 };
};

Agora vamos configurar a view externa /etc/bind/named.conf.external-zones

vim /etc/bind/named.conf.external-zones
#Definindo qual vai ser o nosso servidor master não esquecendo que o nome dessa acl não pode ser o mesmo da acl internal
acl "master" {
 10.0.0.25;
};

#Definindo os nossos hosts locais
acl "rede_local" {
 10.0.0.0/23;
 127.0.0.1/32;
};

#Definição da nossa view externa
view "external" {

 #Definindo quais os clientes que podem efetuar consultas nessa view e quais não podem
 # o simbolo '' define que é uma negação então a rede local não pode pesquisar nessa view
 match-clients {
 !rede_local;
 any;
 };

 #Os clientes dessa zona não podem efetuar consultas recursivas
 recursion no;

 #Quem vai receber notificações de modificações dessa zona 
 allow-notify {
 master;
 };
 
 #Nao disponibiliza transferencia de zona do servidor SLAVE
 allow-transfer {
 none;
 };

 #Minha zona teste que vai ser replicada do servidor master na view externa.
 zone "douglasqsantos.com.br" {
 type slave;
 masters { 10.0.0.25; }; #Definindo quem é o nosso servidor master
 transfer-source 10.0.0.28; #Especificando qual transferencia do master que eu vou poder receber nessa view
 file "slave/db.douglasqsantos.com.br.external";
 };

};

Agora já podemos reiniciar o nosso bind

/etc/init.d/bind9 restart

Vamos dar uma olhada nos logs

tail -f /var/log/syslog
Jun 17 16:26:56 dns2 named[1643]: zone douglasqsantos.com.br/IN/internal: Transfer started.
Jun 17 16:26:56 dns2 named[1643]: transfer of 'douglasqsantos.com.br/IN/internal' from 10.0.0.25#53: connected using 10.0.0.27#36763
Jun 17 16:26:56 dns2 named[1643]: zone douglasqsantos.com.br/IN/internal: transferred serial 2011061703
Jun 17 16:26:56 dns2 named[1643]: transfer of 'douglasqsantos.com.br/IN/internal' from 10.0.0.25#53: Transfer completed: 1 messages, 20 records, 489 bytes, 0.001 secs (489000 bytes/sec)
Jun 17 16:26:56 dns2 named[1643]: zone douglasqsantos.com.br/IN/internal: sending notifies (serial 2011061703)
Jun 17 16:26:56 dns2 named[1643]: zone douglasqsantos.com.br/IN/external: Transfer started.
Jun 17 16:26:56 dns2 named[1643]: transfer of 'douglasqsantos.com.br/IN/external' from 10.0.0.25#53: connected using 10.0.0.28#54526
Jun 17 16:26:56 dns2 named[1643]: zone douglasqsantos.com.br/IN/external: transferred serial 2011061703
Jun 17 16:26:56 dns2 named[1643]: transfer of 'douglasqsantos.com.br/IN/external' from 10.0.0.25#53: Transfer completed: 1 messages, 20 records, 494 bytes, 0.002 secs (247000 bytes/sec)
Jun 17 16:26:56 dns2 named[1643]: zone douglasqsantos.com.br/IN/external: sending notifies (serial 2011061703)

Como pode ser notado esta tudo ok

Em caso de problemas com chaves mkeys como ex:

Sep 27 10:16:12 ldap named[9710]: managed-keys-zone ./IN/internal: loading from master file /var/cache/bind/dynamic/3bed2cb3a3acf7b6a8ef408420cc682d5520e26976d354254f528c965612054f.mkeys failed: file not found
Sep 27 10:16:12 ldap named[9710]: managed-keys-zone ./IN/internal: loaded serial 0
Sep 27 10:16:12 ldap named[9710]: zone douglasqsantos.com.br/IN/external: loaded serial 2011061703
Sep 27 10:16:12 ldap named[9710]: managed-keys-zone ./IN/external: loading from master file /var/cache/bind/dynamic/3c4623849a49a53911c4a3e48d8cead8a1858960bccdea7a1b978d73ec2f06d7.mkeys failed: file not found

Como pode ser notado acima está faltando dois arquivo por enquanto porém ele não existia quando iniciamos o bind, após iniciar o bind que este arquivo vai ser gerado podemos visualizar os arquivos em

ls /var/lib/named/var/cache/bind/dynamic
3bed2cb3a3acf7b6a8ef408420cc682d5520e26976d354254f528c965612054f.mkeys      3c4623849a49a53911c4a3e48d8cead8a1858960bccdea7a1b978d73ec2f06d7.mkeys
3bed2cb3a3acf7b6a8ef408420cc682d5520e26976d354254f528c965612054f.mkeys.jnl  3c4623849a49a53911c4a3e48d8cead8a1858960bccdea7a1b978d73ec2f06d7.mkeys.jnl

Caso esteja trabalhando com somente uma view que é a default vamos ter o arquivo managed-keys.bind e para cada nova view vai ser acrescentado um novo arquivo *.mkeys

Caso os arquivo *.mkyes já estejam criados no diretório /var/lib/named/var/cache/bind/dynamic podemos mandar reiniciar novamente o bind para ele carregar estes arquivo

/etc/init.d/bind9 restart

Vamos agorar verificar se os arquivos estão certos temos que ter um com os endereçõs de ip 10.0.0.x e outro com 200.200.200.x

cat /var/lib/named/var/cache/bind/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. (
 2011061703 ; serial
 3600       ; refresh (1 hour)
 1800       ; retry (30 minutes)
 1209600    ; expire (2 weeks)
 3600       ; minimum (1 hour)
 )
 NS      ns1.douglasqsantos.com.br.
 NS      ns2.douglasqsantos.com.br.
 NS      douglasqsantos.com.br.
 A       10.0.0.25
 MX      0 mail.douglasqsantos.com.br.
 TXT     "v=spf1 a mx ip4:10.0.0.0/23 -all"
$ORIGIN douglasqsantos.com.br.
dns                     A       10.0.0.25
ftp                     CNAME   www
imap                    CNAME   mail
mail.douglasqsantos.com.br        TXT     "v=spf1 a -all"
mail                    A       10.0.0.25
mailadmin               CNAME   www
ns1                     A       10.0.0.25
ns2                     A       10.0.0.27
pop                     CNAME   mail
smtp                    CNAME   mail
webmail                 CNAME   mail
www                     A       10.0.0.27

Agora vamos consultar o outro arquivo

cat /var/lib/named/var/cache/bind/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. (
 2011061703 ; serial
 3600       ; refresh (1 hour)
 1800       ; retry (30 minutes)
 1209600    ; expire (2 weeks)
 3600       ; minimum (1 hour)
 )
 NS      ns1.douglasqsantos.com.br.
 NS      ns2.douglasqsantos.com.br.
 NS      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.
dns                     A       200.200.200.25
ftp                     CNAME   www
imap                    CNAME   mail
mail.douglasqsantos.com.br        TXT     "v=spf1 a -all"
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 efetuar alguns teste de consultas

Vamos consultar o registro www do domínio douglasqsantos.com.br

nslookup www
Server:         127.0.0.1
Address:        127.0.0.1#53

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

Vamos consultar o registro ns1.douglasqsantos.com.br

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

Name:   ns1.douglasqsantos.com.br
Address: 10.0.0.25

Até aqui a implementação é quase idêntica a configuração de um servidor sem DNSSEC, porém agora vamos gerar as chaves para transferências das zonas de modo criptogrado e depois vamos assinar as zonas.

Vamos criar a chave para transferência no servidor SLAVE

Vamos acessar o diretório que vai armazenar as chaves

cd /var/lib/named/var/cache/bind/keys/transferencias

Agora precisamos gerar a nossa chave no SLAVE

dnssec-keygen  -r /dev/urandom -a hmac-md5 -b 128 -n host dns1.douglasqsantos.com.br

Aqui acima passamos o -r um meio randomico -a algortimo de criptografia -b quantidade de bits para a criptografia -n host nome da chave.

Agora vamos visualizar a nossa chave

cat *.private
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: FvUhSxHEjcaavqtmSNTQ1A=====
Bits: AAA=
Created: 20120927194714
Publish: 20120927194714
Activate: 20120927194714

A nossa chave foi gerada com sucesso agora precisamos configurar o nosso servidor SLAVE para ele reconhecer a nossa chave, vamos adicionar no final do arquivo /etc/bind/named.conf.options

vim /etc/bind/named.conf.options
[...]
#Chave de transferencia que nós geramos
key TRANSFER {
   algorithm hmac-md5;
   secret "FvUhSxHEjcaavqtmSNTQ1A=====";
};

#Servidor master
server 10.101.0.25 {
  keys {
    TRANSFER;
   };
};

Agora vamos reiniciar o bind9

/etc/init.d/bind9 restart

Agora precisamos configurar o servidor MASTER com a mesma chave que inserimos no servidor slave não precisamos gerar ela, somente informar ela no servidor MASTER, vamos inserir no final do arquivo /etc/bind/named.conf.options

vim /etc/bind/named.conf.options
[...]
#Chave de transferencia que nós geramos
key TRANSFER {
   algorithm hmac-md5;
   secret "FvUhSxHEjcaavqtmSNTQ1A=====";
};

#Servidor slave VIEW INTERNA
server 10.101.0.27 {
  keys {
    TRANSFER;
   };
};

#Servidor slave VIEW EXTERNA
server 10.101.0.28 {
  keys {
    TRANSFER;
   };
};

Agora precisamos reiniciar o serviço do bind9

/etc/init.d/bind9 restart

Agora ainda no servidor MASTER precisamos criar um diretório que vai armazenar as chaves da nossa zona.

mkdir -p /var/lib/named/var/cache/bind/keys/douglasqsantos.com.br

Agora vamos gerar as chaves para o nosso domínio vamos acessar o diretório que vamos armazenar as chaves

cd /var/lib/named/var/cache/bind/keys/douglasqsantos.com.br

Agora a geração das chaves para a zona douglasqsantos.com.br com uma vida útil de 1 ano o +31536000 é a quantidade de segundos que tem um ano

zonesigner -genkeys -usensec3 -zone douglasqsantos.com.br /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.internal -endtime +31536000

  if zonesigner appears hung, strike keys until the program completes
  (see the "Entropy" section in the man page for details)

Generating key pair....++++++ ...++++++ 
Generating key pair...............++++++ ..++++++ 
Generating key pair............................................+++ ....................................................................................+++ 
Verifying the zone using the following algorithms: RSASHA256.
Zone signing complete:
Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked
                      ZSKs: 1 active, 1 stand-by, 0 revoked

zone signed successfully

douglasqsantos.com.br:
  KSK (cur) 33586  -b 2048  09/27/12  (douglasqsantos.com.br-signset-00003)
  ZSK (cur) 40488  -b 1024  09/27/12  (douglasqsantos.com.br-signset-00001)
  ZSK (pub) 42168  -b 1024  09/27/12  (douglasqsantos.com.br-signset-00002)

zone will expire in 52 weeks, 1 day, 0 seconds
DO NOT delete the keys until this time has passed.

Após executar o comando vamos ter varios novos arquivos neste diretorio

ls
douglasqsantos.com.br.krf     Kdouglas.lan.+008+33586.key      Kdouglas.lan.+008+40488.key      Kdouglas.lan.+008+42168.key
dsset-douglasqsantos.com.br.  Kdouglas.lan.+008+33586.private  Kdouglas.lan.+008+40488.private  Kdouglas.lan.+008+42168.private

O arquivo dsset-douglasqsantos.com.br. armazena as informações que precisamos registrar junto ao RegistroBR e junto a dlv.isc.org vamos visualizar ele

cat dsset-douglasqsantos.com.br. 
douglasqsantos.com.br.    IN DS 33586 8 1 19846B0C2B84DC4875BC7311A4CC8076E4ABF59B
douglasqsantos.com.br.    IN DS 33586 8 2 47CC0C5FCFD41EE9BE0F1C30FE035B6F25A9CE57A232E156056B49A2 D39F6EBC

O arquivo douglasqsantos.com.br.krf contem o controle da configuração da assinatura das zonas como as chaves IDS etc, e os arquivos *.key e *.private são as proprias chaves do DNSSEC.

Agora vamos mandar assinar a nossa zona já que temos as chaves

zonesigner -zone douglasqsantos.com.br /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.external 

  if zonesigner appears hung, strike keys until the program completes
  (see the "Entropy" section in the man page for details)

Verifying the zone using the following algorithms: RSASHA256.
Zone signing complete:
Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked
                      ZSKs: 1 active, 1 stand-by, 0 revoked

zone signed successfully

douglasqsantos.com.br:
  KSK (cur) 33586  -b 2048  09/27/12  (douglasqsantos.com.br-signset-00003)
  ZSK (cur) 40488  -b 1024  09/27/12  (douglasqsantos.com.br-signset-00001)
  ZSK (pub) 42168  -b 1024  09/27/12  (douglasqsantos.com.br-signset-00002)

zone will expire in 52 weeks, 1 day, 0 seconds
DO NOT delete the keys until this time has passed.

Após o comando acima o sistema gerou um arquivo .signed que foi assinado com a nossa chave vamos visualizar o seu cabeçalho

head -n 20 /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.external.signed 
; File written on Thu Sep 27 17:08:40 2012
; dnssec_signzone version 9.7.3
douglasqsantos.com.br.    86400 IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
          2011061710 ; serial
          3600       ; refresh (1 hour)
          1800       ; retry (30 minutes)
          1209600    ; expire (2 weeks)
          3600       ; minimum (1 hour)
          )
      86400 RRSIG SOA 8 2 86400 20130927190840 (
          20120927190840 40488 douglasqsantos.com.br.
          G8VGtnaj0GsMQlgqV1prWI0zhGk9aqAXqNdj
          WD7T8iJ89GlPZ7JN4osHb5aiEYUC60805soL
          YILDb/uTPfHyTsi/XRszQuNm4pl4Ie09ii77
          eSNfzMEtPzloOnOYfb4AIwwD8S3xSuYFqBKU
          hyhjKZO6omhXujCokjqtaXYX2Vg= )
      86400 NS  ns1.douglasqsantos.com.br.
      86400 NS  ns2.douglasqsantos.com.br.
      86400 NS  douglasqsantos.com.br.
      86400 RRSIG NS 8 2 86400 20130927190840 (

Agora já temos a nossa zona assinada, aqui sempre temos que ter os dois arquivos o db.douglasqsantos.com.br.external que vamos mandar assinar toda vez que fizermos uma alteração para que ele gere um novo db.douglasqsantos.com.br.external.signed com as novas modificações.

Agora vamos assinar a nossa zona externa

zonesigner -zone douglasqsantos.com.br /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.internal

  if zonesigner appears hung, strike keys until the program completes
  (see the "Entropy" section in the man page for details)

Verifying the zone using the following algorithms: RSASHA256.
Zone signing complete:
Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked
                      ZSKs: 1 active, 1 stand-by, 0 revoked

zone signed successfully

douglasqsantos.com.br:
  KSK (cur) 33586  -b 2048  09/27/12  (douglasqsantos.com.br-signset-00003)
  ZSK (cur) 40488  -b 1024  09/27/12  (douglasqsantos.com.br-signset-00001)
  ZSK (pub) 42168  -b 1024  09/27/12  (douglasqsantos.com.br-signset-00002)

zone will expire in 52 weeks, 1 day, 0 seconds
DO NOT delete the keys until this time has passed.

Já temos agora as duas zonas assinadas para verificarmos se as zonas estão assinadas sem erros podemos testar da seguinte forma

donuts --level 8 -v /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.internal.signed douglasqsantos.com.br
--- loading rule file /usr/share/dnssec-tools/donuts/rules/check_nameservers.txt
    rules: MEMORIZE_NS_ADDRS DNS_SERVERS_MATCH_DATA
--- loading rule file /usr/share/dnssec-tools/donuts/rules/dns.errors.txt
    rules: DNS_SOA_REQUIRED MEMORIZE_NS_CNAME_RECORDS DNS_NS_NO_CNAME
--- loading rule file /usr/share/dnssec-tools/donuts/rules/dnssec.rules.txt
    rules: DNSSEC_RRSIG_TTL_MATCH_ORGTTL DNSSEC_MEMORIZE_NS_RECORDS DNSSEC_CHECK_IF_NSEC3 DNSSEC_MISSING_NSEC_RECORD DNSSEC_MISSING_RRSIG_RECORD DNSSEC_RRSIG_NOT_SIGNING_RRSIG DNSSEC_RRSIG_FOR_NS_GLUE_RECORD DNSSEC_NSEC_FOR_NS_GLUE_RECORD DNSSEC_RRSIG_SIGEXP DNSSEC_NSEC_TTL DNSSEC_NSEC3_TTL DNSSEC_DNSKEY_MUST_HAVE_SAME_NAME DNSSEC_DNSKEY_PROTOCOL_MUST_BE_3 DNSSEC_BOGUS_NS_MEMORIZE DNSSEC_MISSING_RRSIG_RECORD DNSSEC_RRSIG_TTL_MUST_MATCH_RECORD DNSSEC_MISSING_NSEC_RECORD DNSSEC_RRSIG_SIGNER_NAME_MATCHES DNSSEC_NSEC_RRSEC_MUST_NOT_BE_ALONE DNSSEC_MEMORIZE_KEYS DNSSEC_RRSIGS_VERIFY DNSSEC_TWO_ZSKS DNSSEC_OPENSSL_KEY_ISSUES
--- loading rule file /usr/share/dnssec-tools/donuts/rules/nsec_check.rules.txt
    rules: DNSSEC_NSEC_MEMORIZE DNSSEC_NSEC3_MEMORIZE DNSSEC_NSEC3_CHECK DNSSEC_NSEC_CHECK
--- loading rule file /usr/share/dnssec-tools/donuts/rules/parent_child.rules.txt
    rules: DNS_MULTIPLE_NS DNSSEC_SUB_NOT_SECURE DNSSEC_DNSKEY_PARENT_HAS_VALID_DS DNSSEC_DS_CHILD_HAS_MATCHING_DNSKEY
--- loading rule file /usr/share/dnssec-tools/donuts/rules/recommendations.rules.txt
    rules: DNS_REASONABLE_TTLS DNS_NO_DOMAIN_MX_RECORDS
--- Analyzing individual records in /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.internal.signed
--- Analyzing records for each name in /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.internal.signed
results on testing douglasqsantos.com.br:
  rules considered: 38
  rules tested:   30
  records analyzed: 67
  names analyzed: 13
  errors found:   0

Como pode ser notado não temos nenhum erro, agora somente precisamos acertar no arquivo de controle de dns o nome do nosso arquivo trocar de db.douglasqsantos.com.br-internal para db.douglasqsantos.com.br-internal.signed

sed -i 's/db.douglasqsantos.com.br.internal/db.douglasqsantos.com.br.internal.signed/g'  /etc/bind/named.conf.internal-zones
sed -i 's/db.douglasqsantos.com.br.external/db.douglasqsantos.com.br.external.signed/g'  /etc/bind/named.conf.external-zones

Agora vamos fazer o mesmo ajuste no servidor SLAVE

sed -i 's/db.douglasqsantos.com.br.internal/db.douglasqsantos.com.br.internal.signed/g'  /etc/bind/named.conf.internal-zones
sed -i 's/db.douglasqsantos.com.br.external/db.douglasqsantos.com.br.external.signed/g'  /etc/bind/named.conf.external-zones

Agora vamos mandar reiniciar o bind no servidor MASTER

/etc/init.d/bind9 restart

Agora vamos visualizar os logs

tail -f /var/log/syslog 
Sep 27 17:16:21 dns1 named[2282]: command channel listening on 127.0.0.1#953
Sep 27 17:16:21 dns1 named[2282]: zone 0.in-addr.arpa/IN/internal: loaded serial 1
Sep 27 17:16:21 dns1 named[2282]: zone 127.in-addr.arpa/IN/internal: loaded serial 1
Sep 27 17:16:21 dns1 named[2282]: zone 255.in-addr.arpa/IN/internal: loaded serial 1
Sep 27 17:16:21 dns1 named[2282]: zone douglasqsantos.com.br/IN/internal: loaded serial 2011061711 (DNSSEC signed)
Sep 27 17:16:21 dns1 named[2282]: zone localhost/IN/internal: loaded serial 2
Sep 27 17:16:21 dns1 named[2282]: managed-keys-zone ./IN/internal: loaded serial 3
Sep 27 17:16:21 dns1 named[2282]: zone douglasqsantos.com.br/IN/external: loaded serial 2011061710 (DNSSEC signed)
Sep 27 17:16:21 dns1 named[2282]: managed-keys-zone ./IN/external: loaded serial 3
Sep 27 17:16:21 dns1 named[2282]: running

Como pode ser notado o nosso bind já esta reconhecendo que temos uma zona assinada com DNSSEC ;) agora precisamos mandar reiniciar o bind9 do servidor SLAVE

/etc/init.d/bind9 restart

Agora vamos analisar os logs do servidor SLAVE

tail -f /var/log/syslog 
Sep 27 17:17:30 dns2 named[2227]: zone 127.in-addr.arpa/IN/internal: loaded serial 1
Sep 27 17:17:30 dns2 named[2227]: zone 255.in-addr.arpa/IN/internal: loaded serial 1
Sep 27 17:17:30 dns2 named[2227]: zone localhost/IN/internal: loaded serial 2
Sep 27 17:17:30 dns2 named[2227]: managed-keys-zone ./IN/internal: loaded serial 3
Sep 27 17:17:30 dns2 named[2227]: managed-keys-zone ./IN/external: loaded serial 3
Sep 27 17:17:30 dns2 named[2227]: running
Sep 27 17:17:30 dns2 named[2227]: zone douglasqsantos.com.br/IN/internal: Transfer started.
Sep 27 17:17:30 dns2 named[2227]: zone douglasqsantos.com.br/IN/internal: transferred serial 2011061711: TSIG 'transfer'
Sep 27 17:17:31 dns2 named[2227]: zone douglasqsantos.com.br/IN/external: Transfer started.
Sep 27 17:17:31 dns2 named[2227]: zone douglasqsantos.com.br/IN/external: transferred serial 2011061710: TSIG 'transfer'

Como pode ser notado a nossa transferência esta assinada ;) vamos agora mandar listar os arquivos para confirmar se eles foram transferidos

ls -l /var/lib/named/var/cache/bind/slave/
total 40
-rw-r--r-- 1 bind bind   701 Set 27 17:15 db.douglasqsantos.com.br.external
-rw-r--r-- 1 bind bind 11548 Set 27 17:17 db.douglasqsantos.com.br.external.signed
-rw-r--r-- 1 bind bind   721 Set 27 17:16 db.douglasqsantos.com.br.internal
-rw-r--r-- 1 bind bind 11527 Set 27 17:17 db.douglasqsantos.com.br.internal.signed

Como pode ser notado agora temos os novos arqquivos .signed vamos mandar visualizar o cabeçalho deles

Vamos listar o arquivo com as zonas externas

head -n 25 /var/lib/named/var/cache/bind/slave/db.douglasqsantos.com.br.external.signed 
$ORIGIN .
$TTL 86400  ; 1 day
douglasqsantos.com.br   IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
        2011061710 ; serial
        3600       ; refresh (1 hour)
        1800       ; retry (30 minutes)
        1209600    ; expire (2 weeks)
        3600       ; minimum (1 hour)
        )
      RRSIG SOA 8 2 86400 20130927190840 (
        20120927190840 40488 douglasqsantos.com.br.
        G8VGtnaj0GsMQlgqV1prWI0zhGk9aqAXqNdjWD7T8iJ8
        9GlPZ7JN4osHb5aiEYUC60805soLYILDb/uTPfHyTsi/
        XRszQuNm4pl4Ie09ii77eSNfzMEtPzloOnOYfb4AIwwD
        8S3xSuYFqBKUhyhjKZO6omhXujCokjqtaXYX2Vg= )
      NS  ns1.douglasqsantos.com.br.
      NS  ns2.douglasqsantos.com.br.
      NS  douglasqsantos.com.br.
      RRSIG NS 8 2 86400 20130927190840 (
        20120927190840 40488 douglasqsantos.com.br.
        O36ut0SnmLoLqZGO8+sH5zuF9bZvGWs4iT7oWs3MX88H
        AtnCulLSv6WwE6cPYI3bkWsxFZaKoWLBMnqFOk2lYbhP
        uNoXdIfHVTqXQPSIGjj/P94UN1QUjufkWiDMylfkIg9p
        7XKO16qh250ipVnEYqEoFQ9za1E3+V0EpY9uB1E= )
      A 200.200.200.25

Agora vamos mandar listar o arquivo que tem as zonas internas

head -n 25 /var/lib/named/var/cache/bind/slave/db.douglasqsantos.com.br.internal.signed 
$ORIGIN .
$TTL 86400  ; 1 day
douglasqsantos.com.br   IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
        2011061711 ; serial
        3600       ; refresh (1 hour)
        1800       ; retry (30 minutes)
        1209600    ; expire (2 weeks)
        3600       ; minimum (1 hour)
        )
      RRSIG SOA 8 2 86400 20130927191129 (
        20120927191129 40488 douglasqsantos.com.br.
        uf2wAAuJL0x0BU6YtOLB3GXH4WRZl14cGlkyHWlxApaA
        OcyzmKywylnJfMN5JJtrYeJgi057sJV013WAGyWk6qAk
        vDd6Gy7Pe2xAriTTxorVc+qyxv+bZD7TzXPcVw1vO5FI
        LafJAobHlB/WsA19m+9luAEnSIGlgs33Ce/vXPg= )
      NS  ns1.douglasqsantos.com.br.
      NS  ns2.douglasqsantos.com.br.
      NS  douglasqsantos.com.br.
      RRSIG NS 8 2 86400 20130927191129 (
        20120927191129 40488 douglasqsantos.com.br.
        Bn5tXN7c1RwOUejpLYDcSNgEPfBEoNZzzyxbN7/dKRHy
        aQ4NJsjsapNzYoCgJjrGC2YM68gfLaL0LwB7m4icm90K
        G6ucKxLzlrxAX6be5tiIq9Taz37GXb9Fnxw4XHWswhUE
        EPUCEm3YMUS3z6pxTY8mWGa2qlt4nAjWLMOTbmM= )
      A 10.101.0.25

Agora todos os registros estão assinados ;)

Agora pense que precisamos inserir mais um registro na zona external, com isso vamos precisar reassinar a nossa zona com o seguinte comando não se esqueça que para assinar uma zona precisamos estar no diretório que contém as chaves da zona neste caso em /var/lib/named/var/cache/bind/keys/douglasqsantos.com.br

zonesigner -zone douglasqsantos.com.br /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.external

Caso utilize o DNSSEC virado para internet precisamos se cadastrar em https://dlv.isc.org/ para inserir as chaves em um servidor ISC DNSSEC Lookaside Validation aonde o RegistroBR vai procurar as chaves para validar.

Após se registrar vamos precisamos criar uma zona vamos precisar adicionar um record que é a primeira entrada do arquivo /var/lib/named/var/cache/bind/keys/douglasqsantos.com.br/dsset-douglasqsantos.com.br.

cat /var/lib/named/var/cache/bind/keys/douglasqsantos.com.br/dsset-douglasqsantos.com.br.
douglasqsantos.com.br.    IN DS 33586 8 1 19846B0C2B84DC4875BC7311A4CC8076E4ABF59B
douglasqsantos.com.br.    IN DS 33586 8 2 47CC0C5FCFD41EE9BE0F1C30FE035B6F25A9CE57A232E156056B49A2 D39F6EBC

Após isso vamos precisar inserir um registro do tipo TXT que o dlv nos fornece para validar a zona e mandar assinar novamente e reiniciar o serviço do bind

Após isso podemos acompanhar o status da zona ela tem que ficar com o status Good, quando isso acontecer já podemos inserir o DNSSEC no RegistroBR

No RegistroBR precisamos selecionar +DNSSEC e nos campos que se habilitaram precisamos preencher

Record    keyTAG  DIGEST
DS 1      33586   19846B0C2B84DC4875BC7311A4CC8076E4ABF59B
DS 2      33586   47CC0C5FCFD41EE9BE0F1C30FE035B6F25A9CE57A232E156056B49A2D39F6EBC

Notem que o segundo campo tem um espaço no arquivo dsset, para inserir no RegistroBR precisamos retirar o espaço e deixar a string inteira após isso é so mandar salvar.

Após isso podemos mandar consultar a nossa zona como exemplo

whois www.douglasqsantos.com.br

% Copyright (c) Nic.br
%  The use of the data below is only permitted as described in
%  full by the terms of use (http://registro.br/termo/en.html),
%  being prohibited its distribution, comercialization or
%  reproduction, in particular, to use it for advertising or
%  any similar purpose.
%  2012-09-27 17:30:45 (BRT -03:00)

domain:      douglasqsantos.com.br
owner:       Douglas Quintiliano dos Santos
ownerid:     010.198.199-60
country:     BR
owner-c:     DQDSA5
admin-c:     DQDSA5
tech-c:      DQDSA5
billing-c:   DQDSA5
nserver:     ns1.douglasqsantos.com.br 200.195.146.36 2001:1284:1::16bd:3eb0:7062
nsstat:      20120926 AA
nslastaa:    20120926
nserver:     ns2.douglasqsantos.com.br 200.195.146.37 2001:1284:1::4eab:77b:abb0
nsstat:      20120926 AA
nslastaa:    20120926
dsrecord:    31270 RSA/SHA-256 FC467C47C45517E4D170DD27A728BC8A4AC0AF4A
dsstatus:    20120927 DSOK
dslastok:    20120927
dsrecord:    31270 RSA/SHA-256 92B3317D71F2A567A558C84C06D145E267454E87D4117C11F8B643BCC7AA2B77
dsstatus:    20120927 DSOK
dslastok:    20120927
saci:        yes
created:     20111003 #8902480
expires:     20141003
changed:     20120927
status:      published

nic-hdl-br:  DQDSA5
person:      Douglas Q. dos Santos
e-mail:      douglas.q.santos@gmail.com
created:     20101203
changed:     20120927

% Security and mail abuse issues should also be addressed to
% cert.br, http://www.cert.br/, respectivelly to cert@cert.br
% and mail-abuse@cert.br
%
% whois.registro.br accepts only direct match queries. Types
% of queries are: domain (.br), ticket, provider, ID, CIDR
% block, IP and ASN.

Agora vamos testar o nosso dnssec com o dig

dig +dnssec www.douglasqsantos.com.br

; <<>> DiG 9.7.3 <<>> +dnssec www.douglasqsantos.com.br
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55336
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 9

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;www.douglasqsantos.com.br.   IN  A

;; ANSWER SECTION:
www.douglasqsantos.com.br.  3600  IN  A 200.195.146.59
www.douglasqsantos.com.br.  3600  IN  RRSIG A 8 4 3600 20121027151806 20120927151806 2319 douglasqsantos.com.br. RX3Vz2alirpRXq35L3bhzWcf7Np8iUTp9ayb24VfmJcExmBylR7Z1lMy e6WCNqgKsIRUG70t/NcWH8B4DbG3NW+nVRpD18J8XT87GdE7ZiIjmGSu X1w0TTnp896AOmv2qY8wBQ+oiQJ+UiJZDNgh7oS5iIbW/iD6Ftt8Ml+a MC8=

;; AUTHORITY SECTION:
douglasqsantos.com.br.  3600  IN  NS  ns1.douglasqsantos.com.br.
douglasqsantos.com.br.  3600  IN  NS  ns2.douglasqsantos.com.br.
douglasqsantos.com.br.  3600  IN  RRSIG NS 8 3 3600 20121027151806 20120927151806 2319 douglasqsantos.com.br. PDh8VI3dLgPDCTaSg5RMjv2pi/Q6st5Bal4bP2kYgWh0B67ClooAztpt wmZXJUtR3VbAe+I3d+bvuLj26gizOZoaIzNigljq2gWrI60MgW88+vP+ T9D04rNRaqAmWQdQRvvXMaqdjZK1XrqCcUfiBqtuO7Nu7kzKutsD8LPC 9Z4=

;; ADDITIONAL SECTION:
ns1.douglasqsantos.com.br.  3600  IN  A 200.195.146.36
ns1.douglasqsantos.com.br.  3600  IN  AAAA  2001:1284:1::16bd:3eb0:7062
ns2.douglasqsantos.com.br.  3600  IN  A 200.195.146.37
ns2.douglasqsantos.com.br.  3600  IN  AAAA  2001:1284:1::4eab:77b:abb0
ns1.douglasqsantos.com.br.  3600  IN  RRSIG A 8 4 3600 20121027151806 20120927151806 2319 douglasqsantos.com.br. n69fS+JeGgvLtgZDDuDePrEWd8kcZvNTp5vDOpVz9AzQW3McceJ5bruV NTh0M0AoVFI7/g94bMpFHN4V5+OZElEXw/Zr6otEBXTyIvSZ4GqLuzhF eQ2OjaTxy0syNF2hy5kQQl9JARztDiFWjpwNeZhoRq41Kx/ZOhylvDCL vXk=
ns1.douglasqsantos.com.br.  3600  IN  RRSIG AAAA 8 4 3600 20121027151806 20120927151806 2319 douglasqsantos.com.br. XdA4lmVMGSeCN71+TqUEXZ+cagmsTPpolxACbfd8mupEvU8wiFaOFS9T BHXs9laYwktt75dLsNNIs/bsInu9e6ftWBG5cF5E04uOKnTh/wEZCdad PYe+r1tW5TbTKzne53NTYDGp0o5A+sdkDrdskRR8UKGt5IBh3SK+ZzT9 o2Y=
ns2.douglasqsantos.com.br.  3600  IN  RRSIG A 8 4 3600 20121027151806 20120927151806 2319 douglasqsantos.com.br. QmB3jMGDkCjzO8xSoFjTvAlbB9+23XsljbrcyE+uzvZIEN3CJvj7YaRv rvhMhalSoTA57pBv1TTCUdeDalipoU/2kNTEnhX9WL1+Ry4vq8++jJxR HCcheoMzjkWX1KHfLUckV2ka9K8dA7WJ4F5RsxEyJl+H9pFNm6KuuzsE uYU=
ns2.douglasqsantos.com.br.  3600  IN  RRSIG AAAA 8 4 3600 20121027151806 20120927151806 2319 douglasqsantos.com.br. ISK84a2ejuZtN+lf3f1FJzhfLwF3E5GEacZibIamYSWKQtXvUMLiiCBi j34OQWqDw+BTqDFfaWLaqS9BI0vhfsaK3IW6pY1a//QOhnXU+qPlqWR3 5ZXSbH6/r29yfIlFEaFIFN/tRy0P0KkNEH0dFeJKE4aiQc8ABoJAZL9W 4ng=

;; Query time: 338 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Sep 27 17:33:06 2012
;; MSG SIZE  rcvd: 1238

Agora já temos o nosso DNS implementado, pra novas zonas crie novos diretórios como nome delas em /var/lib/named/var/cache/bind/keys e dentro desses diretórios criem as chaves por que senão vai virar uma zona de chaves ;)

Tipo de erro abaixo as vezes o bind se perde então temos que mudar o /etc/resolv.conf de 127.0.0.1 para o ip do servidor ex: 10.0.0.28

nslookup www.terra.com.br
Server:   127.0.0.1
Address:  127.0.0.1#53

** server can't find www.terra.com.br.douglasqsantos.com.br: REFUSED

Agora uma consultar com o resolv.conf mudado

nslookup www.terra.com.br
Server:   10.0.0.28
Address:  10.0.0.28#53

Non-authoritative answer:
Name: www.terra.com.br
Address: 200.154.56.80

Referências