Como criar um dominio interno com bind9

Quando estamos fazendo testes de aplicações é normal montarmos servidores e urls personalizadas. Para mim o que sempre foi bem chato foi ter que editar o meu arquivo /etc/hosts e adicionar uma entrada lá. Não pelo trabalho em si, mas por sempre achar que fazer daquele jeito apesar de ser o mais rápido e fácil me parecia ser errado. Acho que era o meu Sysadmin interior se remoendo todo!

Um belo dia fiz algumas pesquisas no Google para saber o que desenvolvedores pelo mundo normalmente faziam. A maioria como eu editava o /etc/hosts e adicionava manualmente assim como eu , outros utilizavam aplicativos que montavam um DNS Fake e assim por diante. Apesar de até achar algumas das soluções interessantes optei por montar um DNS Interno. O fato é que no meu caso tenho um mini laboratório então me convenci que faria sentido criá-lo. E será isso que você vai ver nesse rápido tutorial de como fazer.

DNS e DNS Reverso

Um ponto que acho importante revisarmos é para que serve o DNS e o DNS Reverso. A definição mais curta que posso fazer é que o DNS traduz um nome em IP, enquanto que o DNS Reverso como o nome sugere, faz exatamente o oposto, resolve um IP em um nome DNS.

DNSIPDNS Reverso
example.com10.20.30.4040.30.20.10.in-addr.arpa
Exemplo de DNS e DNS Reverso

Neste exemplo quando o DNS for consultado para example.com ele retornará 10.20.30.40. Quando o DNS Reverso for consultado para 10.20.30.40 retornará example.com.

Arquitetura

Nossa arquitetura será bem simples composta de dois servidores sendo um deles o Primary DNS Server e o outro Secondary DNS Server. Ambos rodando o Debian 11 e o Bind9 com a versão 9.16.22. O nome do domínio que escolhi foi lab.int dessa forma não corro o risco de criar um domínio que já exista na internet. Um outro ponto é que este DNS irá fazer o forwarding dos DNS Servers do Google (8.8.8.8 e 8.8.4.4) isso vai me permitir que mesmo configurando os meus próprios servidores de DNS em outros servidores terei a capacidade de resolver os nomes da Internet.

Instalação das dependências

Antes de iniciarmos a instalação propriamente dita é necessário verificar ser os dois servidores estão configurados corretamente. Basicamente eles precisam ter um IP Fixo configurado e terem o FQDN sendo resolvido para o endereço IP e não para 127.0.0.1 ou 127.0.1.1. A configuração de IP Fixo você pode conferir nesse tutorial aqui do site. Já a configuração do FQDN você confere nesse outro tutorial.

Depois de ter realizado essas duas configurações retorne aqui para continuarmos.

Vamos primeiro instalar os pacotes necessários para ter o BIND9 rodando nos dois servidores. Todos os passos abaixo devem ser executados nos dois servidores: ns1 e ns2.

# ns1 e ns2

$ sudo apt update && sudo apt install bind9 bind9utils bind9-doc dnsutils

Com relação a parte das dependências para deixá-lo funcionando já terminamos, agora vamos fazer as configurações. Para facilitar a execução deixei separado as configurações dos servidores primários e secundários separadas em tópicos.

Configuração do Servidor Primário

A configuração do servidor primário está separada em três etapas que estão detalhadas abaixo. Em linhas gerais nas configurações globais definimos como o produto Bind deve estar configurado, regras de segurança, logs, etc. Depois vamos configurar as zonas de DNS e por fim finalizar com as configurações propriamente ditas do DNS e do Reverso.

Opções Globais

Vamos começar editando primeiro o arquivo de configurações globais do Bind9. Abra o arquivo /etc/bind/named.conf.options em um editor de sua preferência e cole o conteúdo abaixo:

acl "autoriza" { # Define uma ACL chamada autoriza
	192.168.122.0/24; # Range IP de 0 até 255
};

options {
	directory "/var/cache/bind";
	
	recursion yes;	
	allow-recursion { trusted; }; # Somente permite consulta recursiva para quem estiver na ACL trusted.
	listen-on { 192.168.122.24; };
	allow-transfer { none; };
	
	forwarders { # Google DNS Fowarders
		8.8.8.8;
		8.8.4.4;
	};
};

Criação da Zona DNS e DNS Reversa

Agora vamos criar as zonas de encaminhamento e reversa, para isso edite o arquivo /etc/bind/named.conf.local em um editor da sua preferência e cole o conteúdo abaixo:

zone "lab.int" { # DNS
    type master; # Primário
    file "/etc/bind/zones/db.lab.int";  # DB do DNS lab.int
    allow-transfer { 192.168.122.25; }; # Secundário
};
zone "168.192.in-addr.arpa" { # DNS Reverso
    type master; # Primário
    file "/etc/bind/zones/db.168.192";  # DB do DNS reverso
    allow-transfer { 192.168.122.25; }; # Secundário
};

Configurações de DNS

Para finalizar a configuração do servidor primário do nosso DNS vamos criar os arquivos DB do DNS e do DNS Reverso. Rode os seguintes comandos:

# Cria diretório para as zonas de DNS e DNS Reverso
$ sudo mkdir -p /etc/bind/zones

# Cria os arquivo DB para o DNS
$ sudo touch /etc/bind/zones/db.lab.int
$ sudo touch /etc/bind/zones/db.168.192

Edite o arquivo /etc/bind/zones/db.lab.int, cole o conteúdo abaixo salve e feche o arquivo.

$TTL	604800
@	IN	SOA	ns1.lab.int. hostmaster.lab.int. ( 
			3		
			604800	
			86400	
			2419200	
			604800 )
@	IN	NS	ns1.lab.int.
@	IN	NS	ns2.lab.int.
 
ns1.lab.int.		IN	A	192.168.122.24
ns2.lab.int.		IN	A	192.168.122.25
hostmaster.lab.int. IN  A   192.168.122.24
freeipa.lab.int.	IN	A	192.168.122.26

Edite o arquivo /etc/bind/zones/db.168.192, cole o conteúdo abaixo salve e feche o arquivo.

$TTL	604800
@	IN	SOA	ns1.lab.int. hostmaster.lab.int. (
			      3		
			 604800		
			  86400		
			2419200		
			 604800 )
@	IN	NS	ns1.lab.int.
@	IN	NS	ns2.lab.int.

24.122	IN	PTR	ns1.lab.int.
25.122	IN	PTR	ns2.lab.int.
24.122  IN  PTR hostmaster.lab.int.
26.122	IN	PTR	freeipa.lab.int.

Agora precisamos reiniciar o serviço do Bind9, para isso rode o comando abaixo:

$ sudo systemctl restart bind9

Para verificar se as configurações estão corretas vamos executar os seguintes comandos abaixo:

# Verifica a sintaxe dos arquivos de configuração
$ sudo named-checkconf
# Somente retorna alguma coisa em caso de erro.

# Verifica se encaminhamento está correto.
$ sudo named-checkzone lab.int /etc/bind/zones/db.lab.int
zone lab.int/IN: loaded serial 3
OK

# Verifica se o encaminhamento reverso está correto
$ sudo named-checkzone 168.192.in-addr.arpa /etc/bind/zones/db.168.192
zone 168.192.in-addr.arpa/IN: loaded serial 3
OK

Com isso finalizamos a configuração do Servidor Primário. Agora precisamos realizar as configurações necessárias para o Servidor Secundário.

Configuração do Servidor SECUNDÁRIO

A configuração do servidor secundário é bem mais simples pois toda a informação dos bancos de dados do DNS ele obterá a partir do servidor primário. Com isso vamos precisar editar apenas dois arquivos: o que faz a configuração global e o outro que cria as zonas de encaminhamento.

Opções Globais

Vamos começar editando primeiro o arquivo de configurações globais do Bind9. Abra o arquivo /etc/bind/named.conf.options em um editor de sua preferência e cole o conteúdo abaixo:

acl "trusted" {
	192.168.122.0/24;
};
options {
	directory "/var/cache/bind";

	recursion yes;			
	allow-recursion { trusted; };	
	listen-on { 192.168.122.25; };	
	allow-transfer { none; };	
	
	forwarders {
		8.8.8.8;
		8.8.4.4;
	};

};

Criação da Zona DNS e DNS Reversa

Agora vamos criar as zonas de encaminhamento e reversa, para isso edite o arquivo /etc/bind/named.conf.local em um editor da sua preferência e cole o conteúdo abaixo:

zone "lab.int" {
    type slave;
    file "db.lab.int";		  
    masters { 192.168.122.24; };  
};
zone "168.192.in-addr.arpa" {
    type slave;
    file "db.168.192";
    masters { 192.168.122.24; };
};

Para finalizar reinicie o serviço do Bind9 no servidor secundário:

$ sudo systemctl restart bind9

Validando Configuração

Para realizarmos um teste e verificarmos se o nosso servidor de DNS está funcionando corretamente precisamos configurar uma estação de trabalho ou um outro servidor para utilizá-lo. Abaixo irei colocar os passos para realizar essa configuração no Debian 11.

Configuração Client DNS

Para configurar um servidor ou estação de trabalho rodando o Debian 11 para utilizar o DNS é muito simples. Precisamos apenas editar o arquivo /etc/resolv.conf e então adicionar as linhas relativas aos nossos servidores.

$ sudo vi /etc/resolv.conf

Cole o conteúdo abaixo salve e feche o arquivo:

search lab.int
nameserver 192.168.122.24
nameserver 192.168.122.25

Agora reinicie o serviço de rede.

$ sudo systemctl restart networking

Testando DNS

Primeiro vamos realizar um teste de resolução de nomes. Para isso vamos utilizar o comando nslookup para fazer uma pesquisa por um servidor do nosso DNS interno e depois para pesquisar um domínio externo na internet.

# Caso você não tenha o nslookup instalado
$ sudo apt update && sudo apt install dnsutils

# Testando resolução interna
$ nslookup freeipa
Server:		192.168.122.24
Address:	192.168.122.24#53

Name:	freeipa.lab.int
Address: 192.168.122.26

# Testando resolução de internet
$ nslookup google.com.br
Server:		192.168.122.24
Address:	192.168.122.24#53

Non-authoritative answer:
Name:	google.com.br
Address: 142.250.219.3
Name:	google.com.br
Address: 2800:3f0:4001:81e::2003

Com as respostas acima confirmamos que nossos servidores de DNS estão resolvendo os nomes em IP corretamente.

Testando DNS Reverso

O procedimento de teste será praticamente o mesmo. Utilizaremos a mesma ferramenta, porém note que dessa vez informaremos o endereço IP que obtivemos no resultado do teste anterior.

# Testando resolução interna
$ nslookup 192.168.122.26
26.122.168.192.in-addr.arpa	name = freeipa.lab.int.

# Testando resolução externa
$ nslookup 142.250.219.3
3.219.250.142.in-addr.arpa	name = gru14s27-in-f3.1e100.net.

Com essas respostas conseguimos validar todo o funcionamento do nosso DNS interno! Ele está resolvendo os nomes tanto da nossa rede interna quanto da internet para endereços IP e vice versa (reverso).

Como adicionar novas entradas no DNS

Agora que você tem um DNS interno sempre que quiser adicionar uma nova entrada a ele basta fazer o seguinte:

  • Edite o arquivo /etc/bind/zones/db.lab.int e adicione no final dele as informações do novo host (A) e não esqueça de incrementar a informação do campo Serial. É isso que irá fazer com que o Slave saiba que existe uma nova configuração e dispara a sua atualização.
  • Edite o arquivo /etc/bind/zones/db.168.192 e da mesma forma adicione a entrada PTR e incremente o valor do campo Serial.
  • Rode os testes para verificar a se existe algum erro nos arquivos de configuração:
# Verifica a sintaxe dos arquivos de configuração
sudo named-checkconf
# Somente retorna alguma coisa em caso de erro.

# Verifica se encaminhamento está correto.
sudo named-checkzone lab.int /etc/bind/zones/db.lab.int
zone lab.int/IN: loaded serial 3
OK

# Verifica se o encaminhamento reverso está correto
sudo named-checkzone 168.192.in-addr.arpa /etc/bind/zones/db.168.192
zone 168.192.in-addr.arpa/IN: loaded serial 3
OK
  • Estando tudo certo com o teste anterior reinicie o serviço nos dois servidores:
sudo systemctl restart bind9

Conclusão

Chegamos ao final de mais um tutorial! Criamos um servidor DNS simples para um laboratório que consegue resolver os nomes corretamente e vice versa tanto na nossa rede interna quanto da internet. Isso vai te permitir que mesmo usando essa configuração em seus servidores você conseguirá acessar tudo na internet sem qualquer bloqueio.

Uma nota importante sobre esse tutorial é que a configuração que coloquei foi a mais simples possível e não tem o objetivo de ser a indicada de maneira nenhuma para ambientes de produção. Para esses casos deve-se levar em consideração muitos outros aspectos: segurança, resiliencia, volumetria, disponibilidade e etc.

Referências

Abaixo coloco algumas referências caso queira se aprofundar ainda mains no conhecimento de DNS, que é bem denso, diga-se de passagem.

BIND 9 Administrator Reference Manual

Internet System Consortium

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s