Introdução

Neste tutorial, vamos configurar um servidor DNS, utilizando o BIND (bind9) a partir de uma imagem docker.

A imagem que utilizaremos neste Post é a do projeto labbsr0x/docker-dns-bind9, imagem implementada pela equipe do Labbs do Banco do Brasil.

Pré-requisitos

Como pré-requisito, vamos precisar das duas máquinas linux com a distribuição Ubuntu com os seguintes recursos instalados.

Se você não estiver familiarizado com os conceitos do DNS, é recomendável que você assista os seguintes vídeos da NIC.br.

Infraestrutura e objetivos

Para melhor ilustar, vamos trabalhar com a seguinte infraestrutura:

  • Dois servidores que serão nossos servidores de nome DNS. Vamos nos referir a eles como ns1 e ns2.
  • Usaremos o domínio novodominio.com como exemplo.
Host Função FQDN privado Endereço IP privado
ns1 Servidor DNS primário ns1.novodominio.com 10.0.10.1
ns2 Servidor DNS secundário ns2.novodominio.com 10.0.10.2

Configurar o servidor DNS primário

Para configurar o Servidor DNS Primário, vamos utilizar a estrutura de exemplo disponível no projeto labbsr0x/docker-dns-bind9.

Nota: Caso não seja do seu interesse utilizar a estrutura de exemplo, basta iniciar o container em um volume vazio, 
com isso o container iniciará uma estrutura do Bind9 nova, fique a vontade para fazer a configuração que melhor atenda 
sua realidade.

Dentro da máquina ns1 (IP 10.0.10.1), vamos realizar as seguintes ações

Para padronizar a instalação, vamos usar com base o diretório /opt

$ cd /opt

Vamos realizar o clone do projeto no github, usaremos a estrutura de exemplo do projeto para ajudar na configuração.

$ git clone https://github.com/labbsr0x/docker-dns-bind9.git

Criaremos um diretório que será utilizado como volume do DNS

$ mkdir /opt/bind9

Vamos copiar a estrutura de diretório do DNS primário para o diretório que usaremos como volume do container e copiar também o arquivo de docker-compose

$ cp -r /opt/docker-dns-bind9/example/primary /opt/bind9/.

$ cp /opt/docker-dns-bind9/docker-compose.yml /opt/bind9/.

Alterações nas configurações

Agora vamos alterar as configurações necessárias para configurar o Bind9. Começaremos editando o docker-compose.yml

$ vi /opt/bind9/docker-compose.yml

Vamos alterar o caminho do volume de origem, onde está ./bind9 vamos trocar para /opt/bind9/primary, ficando da seguinte forma.

...
    volumes:
    - /opt/bind9/primary:/data # Change volume path

A próxima configuração será criar a zona desejada no DNS, no exemplo do labbsr0x/docker-dns-bind9 a zona está configurada como example.com, vamos alterar a zona para novodominio.com.

Para realizar essa alteração, vamos renomear o arquivo db.example.com para db.novodominio.com

$ mv /opt/bind9/primary/bind/etc/db.example.com /opt/bind9/primary/bind/etc/db.novodominio.com

Agora vamos realizar as alterações necessárias no arquivo de configuração da zona (db.novodominio.com) para ficar como proposto no objetivos.

$ vi /opt/bind9/primary/bind/etc/db.novodominio.com

No arquivo de configuração, vamos alterar em todos os lugares que estão db.example.com para db.novodominio.com, e na relação de domínios, vamos alterar os IPs do ns1, ns2.

Criaremos também uma entrada no DNS para simular um direcionamento para o host1.

O arquivo ficará da seguinte forma.

;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     novodominio.com. root.novodominio.com. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.novodominio.com.
@       IN      NS      ns2.novodominio.com.
@       IN      A       127.0.0.1
@       IN      AAAA    ::1

ns1             A       10.0.10.1   ; Change to the desired NS1 IP
ns2             A       10.0.10.2   ; Change to the desired NS2 IP

Com o nosso arquivo de zona criado, vamos adicionar ele no named.conf.default-zones e realizar as configurações necessários.

$ vi /opt/bind9/primary/bind/etc/named.conf.default-zones

No lugar que estiver a zona example.com vamos alterar para novodominio.com, colocaremos o caminho do arquivo de zona alterando de db.example.com para db.novodominio.com e por último, colocamos o IP do NS2 no allow-transfer, com isso o DNS Secundário receberá as informações do DNS Primário.

O resultado da alteração será a seguinte.

...
zone "novodominio.com" { // Change to desired zone
        type master;
        file "/etc/bind/db.novodominio.com"; // Change to zone file path
        allow-transfer {10.0.10.2; };        // Change to Secondary DNS IP
//      allow-update {
//          key "example.com";
//  };
};
...

Vamos para dentro do diretório que está o docker-compose.yml e iniciaremos o nosso novo DNS.

$ cd /opt/bind9/

$ docker-compose up -d

Para verificar se o container iniciou corretamente. Execute um docker ps -a e veja o status ou docker-compose logs -f e veja o log.

Configurar o servidor DNS secundário

A configuração do Servidor DNS secundário será bem parecido com o primário, porém mais simples.

Dentro da máquina ns2 (IP 10.0.10.2), vamos realizar as seguintes ações

Para padronizar a instalação, vamos usar com base o diretório /opt

$ cd /opt

Vamos realizar o clone do projeto no github, usaremos a estrutura de exemplo do projeto para ajudar na configuração.

$ git clone https://github.com/labbsr0x/docker-dns-bind9.git

Criaremos um diretório que será utilizado como volume do DNS

$ mkdir /opt/bind9

Vamos copiar a estrutura de diretório do DNS secundário para o diretório que usaremos como volume do container e copiar também o arquivo de docker-compose

$ cp -r /opt/docker-dns-bind9/example/secondary /opt/bind9/.

$ cp /opt/docker-dns-bind9/docker-compose.yml /opt/bind9/.

Alterações nas configurações

Agora vamos alterar as configurações necessárias para configurar o Bind9. Começaremos editando o docker-compose.yml

$ vi /opt/bind9/docker-compose.yml

Vamos alterar o caminho do volume de origem, onde está ./bind9 vamos trocar para /opt/bind9/secondary, ficando da seguinte forma.

...
    volumes:
    - /opt/bind9/secondary:/data # Change volume path 

No caso do DNS Secundário, ele replica as entradas do DNS Primário, com isso não é necessário criar o arquivo db.novodominio.com. Sendo necessário só alterar o arquivo named.conf.default-zones e realizar as configurações necessárias.

$ vi /opt/bind9/secondary/bind/etc/named.conf.default-zones

No lugar que estiver a zona example.com vamos alterar para novodominio.com, colocaremos o caminho do arquivo de zona alterando de db.example.com para db.novodominio.com e por último, colocamos o IP do NS1 na campo master, com isso o DNS Secundário sabe qual é o DNS Primário.

O resultado da alteração será a seguinte.

...
zone "novodominio.com" {  // Change to desired zone
	type slave;
	file "/etc/bind/db.novodominio.com";	// Change to zone file path
	masters {10.0.10.1;};				          // Change to Primary DNS IP
};
...

Vamos para dentro do diretório que está o docker-compose.yml e iniciaremos o nosso DNS Secundário.

$ cd /opt/bind9/

$ docker-compose up -d

Para verificar se o container iniciou corretamente. Execute um docker ps -a e veja o status ou docker-compose logs -f e veja o log.

Testando nosso DNS

Vamos realizar um teste com o comando dig

$ dig -t ns novodominio.com @localhost +short

ns1.novodominio.com.
ns2.novodominio.com.

Conclusão

Enfim, ao final desse processo, teremos dois servidores de DNS, primário e secundário prontos para uso. Basta agora adicionar os hosts necessários para resolução de nomes.