Configurando DHCP e BIND integrados no Ubuntu server

Obs: Este tutorial também pode ser aplicado ao Debian. Testado nas versões Squeeze e Wheezy.

Creio que muitos administradores de rede necessitam desse tipo de serviço integrados e acreditem ou não, ainda perdem tempo memorizando ou possuem planilhas contendo endereços IP. Em uma rede pequena tudo bem, mas quando você já possui 100, 200, 300 hosts fica bem complicado não acham? Com esse post quero mostrar como um servidor Linux pode conter um banco de dados de hosts e endereços IP atualizando dinamicamente, deixando a vida do sysadmin mais tranquila neste aspecto quando é utilizado dhcp na rede. Para quem usa IPs fixos recomendo este excelente tutorial escrito pelo Carlos Morimoto.

Integrando os dois serviços:

Partiremos do ponto em que você já possui os pacotes bind9 e dhcp3-server instalados no seu servidor. Caso contrário o comando é:

$ sudo apt-get update && sudo apt-get install dhcp3-server bind9

As configurações necessárias para o funcionamento do serviço de DNS no Ubuntu Server serão no arquivo /etc/bind/named.conf. Será necessário criar 2 arquivos que servirão de base de dados para armazenar informações sobre as estações da rede local, além de adicionar algumas configurações no serviço de DHCP (/etc/dhcp3/dhcpd.conf). Vamos lá.

Chave de segurança:

Na instalação do bind9 é criada uma chave de segurança para que os serviços de DHCP e DNS possem trocar informações entre si, a chave fica no arquivo /etc/bind/rndc.key.

Adicionando configurações no DHCP:

Para que o serviço DHCP funcione em conjunto com o serviço de DNS, será necessário adicionar algumas configurações no serviço de DHCP (/etc/dhcp3/dhcpd.conf).

$ sudo nano /etc/dhcp3/dhcpd.conf
ddns-update-style interim;
ddns-updates on;
ddns-domainname "empresabcd.local";

ddns-rev-domainname "in-add.arpa";
# chave encontrada em /etc/bind/rndc.key
key "rndc-key" {
algorithm hmac-md5;
secret "aQe2gLhLlNyF6Aol5YlOPg==";
};
# zonas
zone empresabcd.local {
primary 192.168.1.2;
key rndc-key;
}

zone 1.168.192.in-addr.arpa {
primary 192.168.1.2;
key rndc-key;
}

# Configuração Básica da rede

default-lease-time 600;
max-lease-time 7200;
authoritative;
update-static-leases on;
do-forward-updates true;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.10 192.168.1.35;
option routers 192.168.1.2;
option domain-name "empresabcd.local";
option domain-name-servers 192.168.1.2;
option broadcast-address 192.168.1.255;

}

Breve explicação:

  • ddns-update-style –> Informa o tipo de atualização;
  • zone empresabcd.local –> Informa a zona que irá converter IP em nome;
  • zone 1.168.192.in-addr.arpa –> Informa a zona que irá converter nome em IP.
  • option routers –> Informa o gateway.
  • range –> Informa a faixa de IP que pode ser atribuída às estações;
  • Option domain-name –> Informa o nome do domínio;
  • option domain-name-servers –> Informa os servidores de dns;
  • default-lease-time –> Informa o tempo máximo que um endereço IP é “alugado” por uma estação, sem segundos;
  • max-lease-time –> Informa o tempo de aluguel de um endereço IP caso a estação não informe;
  • subnet –> Informa a rede;
  • netmask –> Informa a máscara da rede;

Mais informações podem ser encontradas aqui

Configurando o BIND (DNS):

A função zone definirá como o servidor comportará, configurando como master, ele armazenará as informações dos hosts e poderá fornecer respostas autorizadas.

$ sudo nano /etc/bind/named.conf.default-zones
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";

// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/etc/bind/db.root";
};

// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912

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";
};
key "rndc-key" {
algorithm hmac-md5;
secret "aQe2gLhLlNyF6Aol5YlOPg==";
};
zone "empresabcd.local" {
type master;
file "/var/cache/bind/db.empresabcd";
allow-update { key rndc-key;};
};

zone "1.168.192.in-addr.arpa" {
type master;
file "/var/cache/bind/db.1.168.192.in-addr.arpa";
allow-update { key rndc-key;};
};
include "/etc/bind/named.conf.local";

Configurando os arquivos de zonas:

O arquivo da base de dados da zona é composto pelos parâmetros global e outras informações (informações dos hosts que são adicionados).

Zona direta:

$ sudo nano /var/cache/bind/db.empresabcd
$TTL 43200   ; 12 hours
@ IN SOA server.empresabcd.local. root.empresabcd.local. (
201204051 ; serial
28800 ; refresh (8 hours)
14400 ; retry (4 hours)
3600000 ; expire (5 weeks 6 days 16 hours)
86400 ; minimum (1 day)
)
@ IN NS server.empresabcd.local.
server IN A 192.168.1.2

Agora a zona reversa:

$ sudo nano /var/cache/bind/db.1.168.192.in-addr.arpa
$TTL 43200   ; 12 hours
@ IN SOA server.empresabcd.local. root.empresabcd.local. (
201204051 ; serial
28800 ; refresh (8 hours)
14400 ; retry (4 hours)
3600000 ; expire (5 weeks 6 days 16 hours)
86400 ; minimum (1 day)
)
@ IN NS server.empresabcd.local.
2 IN PTR server.empresabcd.local.

Breve explicação para os parâmetros:

  • IN –> indica que a rede é TCP/IP;
  • SOA (Start Of Authority) –> indica que esses registros são parâmetros globais;
  • server.empresabcd.local.–> indica o servidor que tem autoridade sobre a zona;
  • root.empresabcd.local. –> indica o e-mail do usuário responsável pelo domínio;
  • serial –> é um contador, a cada vez que a zona é alterada esse valor aumenta, normalmente é utilizado para atualização do servidor secundário, caso o serial dele seja inferior. O formato padrão para criação do serial é: ano-mês-dia-versão sem os traços;
  • refresh –> é o período de tempo (em segundos) em que o servidor secundário se atualizará;
  • retry –> é o período de tempo (em segundos) em que o servidor secundário tentará atualizar novamente caso tenha erro em alguma tentativa;
  • expire –> é o tempo que o servidor secundário ficará respondendo caso não consiga se comunicar com o servidor primário;
  • minimum –> é o tempo que uma consulta ficará armazenada em cache.
  • NS (Name Server) –> indica o servidor de nomes da zona;
  • A (Address) –> indica os hosts com seus respectivos endereços IP, essa informação é utilizada para converter nome em endereço IP, essa informação consta na zona normal;
  • PTR (Pointer) –> indica on endereço IP com seus respectivo hosts, essa informação é utilizada para endereço IP em nome, essa informação consta apenas na zona reversa.

Agora crie o arquivo managed-keys.bind dê as permissões aos arquivos de zonas:

$ sudo touch /var/cache/bind/managed-keys-bind $ sudo chown bind.bind /var/cache/bind -R

Reinicie o BIND:

$ sudo service bind9 restart

Reinicie o DHCP:

Para o Ubuntu:

$ sudo /etc/init.d/dhcp restart

Para o Debian:

# /etc/init.d/isc-dhcp-server restart

Verique os logs com:

# tail -n 100 /var/log/daemon.log

onde mostrará a inicialização do BIND. Caso existam erros favor verifique todos os passos anteriores.

Algumas observações: Neste post estou exemplificando usando uma rede Classe C. Mas quando você possui redes de classes A e B? como configurar a zona reversa? Em classe A ou B, no arquivo de base da dados do DNS reverso deve-se colocar os IP’s invertidos. Ex.: Para colocar um IP 172.16.0.2 você configura:

$TTL 43200   ; 12 hours
@ IN SOA server.empresabcd.local. root.empresabcd.local. (
201204051           ; serial
28800 ; refresh (8 hours)
14400 ; retry (4 hours)
3600000 ; expire (5 weeks 6 days 16 hours)
86400 ; minimum (1 day)
)
@ IN NS server.empresabcd.local.
2.0 IN PTR server.empresabcd.local.

Para colocar um IP 10.20.30.2 você configura:

$TTL 43200   ; 12 hours
@ IN SOA server.empresabcd.local. root.empresabcd.local.(

201204051           ; serial
28800 ; refresh (8 hours)
14400 ; retry (4 hours)
3600000 ; expire (5 weeks 6 days 16 hours)
86400 ; minimum (1 day)
)
@ IN NS server.empresabcd.local.
2.30.20 IN PTR server.empresabcd.local.

Em resumo: Para classe C deve-se informar X Para classe B deve-se informar X.X Para classe A deve-se informar X.X.X Por que os arquivos de banco de dados de zonas foram criados em /var/cache/bind e não em /etc/bind ? Porque o Apparmor configura o dono da pasta /etc/bind para o root não permitindo alteração do dono. Caso queira você pode criar os arquivos dentro de /var/lib/bind Perceba que assim que estiver tudo funcionando será criado arquivo *.jnl que guardará as alterações feitas conforme os computadores “entram” ou “saem” da rede.

Criei este post com a esperança que seja útil a alguém. Sugestões, críticas e dúvidas e elogios podem ser feitas nos comentários. Sucesso a todos.

Update 1: Corrigida a criação do serial nas configurações de zonas;