Instalação e configuração de servidor DHCP + DNS + Debian Wheezy

  • Domínio que vamos utilizar: douglasqsantos.com.br
  • Faixa de ip: 192.168.1.0/24
  • Ip do Servidor: 192.168.0.20

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialwheezy_en para que não falte nenhum pacote ou configuração.

Vamos atualizar os repositórios e fazer um upgrade do sistema

aptitude update && aptitude dist-upgrade -y

Agora vamos instalar o bind

aptitude install bind9 dnsutils -y

Agora vamos parar ele para fazer algumas manutenções

/etc/init.d/bind9 stop

Vamos criar os diretorios necessários

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/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

Vamos acertar as permissões

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

Vamos acertar a localização dos diretórios e as permissõ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

Vamos fazer backup do arquivo de configuração

cp -Rfa /etc/default/bind9{,.bkp}

Vamos informar para o bind aonde fica a jaula

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

Acertando o arquivo que controla a consulta de dns

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

Gerando a chave para o DHCP poder atualizar as zonas de DNS.

cd /etc/bind/
dnssec-keygen -r /dev/urandom -a HMAC-MD5 -b 128 -n USER DHCP_UPDATER

Agora vamos visualizar o conteudo da nossa chave, vamos utilizar ela no arquivo de zonas e no arquivo de configuração do DHCP.

cat /etc/bind/K*.key
DHCP_UPDATER. IN KEY 0 3 157 Fum3G8P3880TwWMteJgrZg==

Vamos acertar algumas opções do bind

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; 192.168.1.0/24; };
 allow-query { any; };
 recursion no;
 version "Nao Disponivel";
 ### DNSSEC ###
 dnssec-enable no;
 dnssec-validation no;
 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; };
 
 };

Vamos acertar as referências de arquivos para o bind

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

Criando o arquivo que vai conter as zonas internas

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" {
 192.168.1.0/24;
 127.0.0.1/32;
};
 
 
#Definição da View interna
view "internal" {
 
#Definindo quais clientes vão poder consultar essa view
 match-clients {
 internal_hosts;
 };
 
#O nossos clientes da view interna vão poder efetuar consultas recursivas
 recursion yes;
 
 
#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";
 };


#Chave para sincronismo entre dhcp e dns que visualizamos com o cat /etc/bind/K*.key
key DHCP_UPDATER {
algorithm HMAC-MD5;
secret Fum3G8P3880TwWMteJgrZg==;
};

#Dominios locais
zone "douglasqsantos.com.br" {
type master;
file "db.douglasqsantos.com.br.internal";
allow-transfer { none; };
allow-update { key DHCP_UPDATER; };
 };
 
#Zona reversa do dominio na rede 192.168.1.0/24
zone "1.168.192.in-addr.arpa" {
type master;
file "db.1.168.192.internal";
allow-transfer { none; };
allow-update { key DHCP_UPDATER; };
};   

};

Criando a zona interna do domínio

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. (
        2013120901  ; 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.20
ns1             IN      A    192.168.1.20
ns2             IN      A    192.168.1.20
dns             IN      A    192.168.1.20
ldap    IN  A    192.168.1.20
ldap2   IN  A    192.168.1.20
kdc1    IN  A    192.168.1.20
kdc2    IN  A    192.168.1.20

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

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

; Dominio Kerberos
_kerberos                                               IN TXT           "douglasqsantos.com.br"
_kerberos.srv                                           IN TXT           "douglasqsantos.com.br"
_kerberos._tcp                                          IN SRV 10 1 88   ldap.douglasqsantos.com.br.
_kerberos._udp                                          IN SRV 10 1 88   ldap.douglasqsantos.com.br.
_kerberos-adm._tcp                                      IN SRV 10 1 749  ldap.douglasqsantos.com.br.
_kerberos-master._udp                                   IN SRV 0  0 88   ldap.douglasqsantos.com.br.
_kpasswd._udp                                           IN SRV 10 1 464  ldap.douglasqsantos.com.br.
_ldap._tcp                                              IN SRV 10 1 389  ldap.douglasqsantos.com.br.

; Busca de Informações de LDAP e Samba
_ldap_dc                                                IN TXT           "dc=douglasqsantos,dc=com,dc=br"
_samba_pdc_domain                                       IN TXT           "DOUGLASQSANTOS"
_samba_pdc_ip_address                                   IN TXT           "192.168.1.20"

Agora vamos criar a zona inversa

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

;
@   IN  NS   douglasqsantos.com.br.
@               IN  NS   ns1.douglasqsantos.com.br.
@               IN  NS   ns2.douglasqsantos.com.br.
@               IN  MX   0 mail.douglasqsantos.com.br.

;NAME SERVERS
20      IN  PTR    douglasqsantos.com.br.
20      IN  PTR    ns1.douglasqsantos.com.br.
20      IN  PTR    ns2.douglasqsantos.com.br.
20      IN  PTR    dns.douglasqsantos.com.br.

;LDAP e Kerberos
20  IN  PTR    ldap.douglasqsantos.com.br.
20  IN  PTR    ldap2.douglasqsantos.com.br.
20  IN  PTR    kdc1.douglasqsantos.com.br.
20  IN  PTR    kdc2.douglasqsantos.com.br.

;MAIL SERVERS
20    IN  PTR    mail.douglasqsantos.com.br.

;WEB SERVERS
20      IN  PTR    www.douglasqsantos.com.br.

Agora vamos iniciar o nosso bind

/etc/init.d/bind9 start

Vamos testar uma consulta

nslookup www
Server:   127.0.0.1
Address:  127.0.0.1#53

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

Vamos testar o reverso

host 192.168.1.20
20.1.168.192.in-addr.arpa domain name pointer kdc1.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa domain name pointer kdc2.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa domain name pointer ldap.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa domain name pointer mail.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa domain name pointer ldap2.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa domain name pointer douglasqsantos.com.br.
20.1.168.192.in-addr.arpa domain name pointer dns.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa domain name pointer ns1.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa domain name pointer ns2.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa domain name pointer www.douglasqsantos.com.br.

Vamos testar o reverso agora pelo dig

dig -x 192.168.1.20
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> -x 192.168.1.20
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1336
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 10, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;20.1.168.192.in-addr.arpa. IN  PTR

;; ANSWER SECTION:
20.1.168.192.in-addr.arpa. 86400 IN PTR kdc2.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa. 86400 IN PTR ldap.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa. 86400 IN PTR mail.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa. 86400 IN PTR ldap2.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa. 86400 IN PTR douglasqsantos.com.br.
20.1.168.192.in-addr.arpa. 86400 IN PTR dns.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa. 86400 IN PTR ns1.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa. 86400 IN PTR ns2.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa. 86400 IN PTR www.douglasqsantos.com.br.
20.1.168.192.in-addr.arpa. 86400 IN PTR kdc1.douglasqsantos.com.br.

;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 86400 IN  NS  douglasqsantos.com.br.
1.168.192.in-addr.arpa. 86400 IN  NS  ns2.douglasqsantos.com.br.
1.168.192.in-addr.arpa. 86400 IN  NS  ns1.douglasqsantos.com.br.

;; ADDITIONAL SECTION:
ns1.douglasqsantos.com.br.  86400 IN  A 192.168.1.20
ns2.douglasqsantos.com.br.  86400 IN  A 192.168.1.20
douglasqsantos.com.br.    86400 IN  A 192.168.1.20

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Dec  9 16:51:31 2013
;; MSG SIZE  rcvd: 326

Agora vamos instalar o servidor DHCP

aptitude install isc-dhcp-server -y

Vai ocorrer um erro a respeito da interface de rede mais isso vamos corrigir mais a frente

Vamos editar o arquivo de configuração do dhcp server

vim /etc/dhcp/dhcpd.conf
#Definindo o dominio
option domain-name "douglasqsantos.com.br";
#Definindo os servidores de DNS
option domain-name-servers 192.168.1.20, 8.8.8.8;
#Definindo o servidor de NetBios(WINS)
option netbios-name-servers 192.168.1.20;
#Definindo o tipo de netbios
option netbios-node-type 8;
#Defindo o broadcast da nossa rede
option broadcast-address 192.168.1.255;
#Defindo que o servidor é autoritativo para a rede
authoritative;
#Estilo de atualização do servidor DNS, este metodo vai ser o padrão de atualização do dns
#ele gera um registro (RR) TXT nos arquivos de zonas do DNS e os atualiza
ddns-update-style interim;
#Força o servidor dhcp fazer atualizações para os endereços ips estáticos
update-static-leases on;
#Defindo o tipo de log que vai ser enviado para o syslog
log-facility local7;
#Defindo a chave de atualização entre o dhcp e o dns a chave que visualizamos com cat /etc/bind/K*.key
key DHCP_UPDATER {
algorithm HMAC-MD5;
secret Fum3G8P3880TwWMteJgrZg==;
};

#defindo a zona que vamos efetuar atualizações
zone douglasqsantos.com.br. {
   primary 127.0.0.1;
   key DHCP_UPDATER;
}
#definindo a zona que vamos efetuar atualizações para reverso
zone 1.168.192.in-addr.arpa. {
   primary 127.0.0.1;
   key DHCP_UPDATER;
}

#Tempo de emprestimo de um ip
default-lease-time 600;
#tempo maximo de emprestimo de um ip
max-lease-time 7200;
#Declaração da sub-net
subnet 192.168.1.0 netmask 255.255.255.0 {
#Declaração do range de ips disponiveis para emprestimo
range 192.168.1.20 192.168.1.60;
#Define qual a subrede para este escopo
option subnet-mask 255.255.255.0;
#define qual o router para esse escopo
option routers 192.168.1.24;
} #Fim do escopo

#Definindo um ip fixo
host exchange {
 hardware ethernet 08:00:27:E3:41:30;
 fixed-address 192.168.1.22;
}

Definir em qual interface o dhcp vai trabalhar

vim /etc/default/isc-dhcp-server
[...]
INTERFACES="eth0"

Agora vamos fazer um ajuste no rsyslog

echo "local7.debug /var/log/dhcpd.log" >> /etc/rsyslog.conf

Agora vamos reiniciar o rsyslog

/etc/init.d/rsyslog restart

Agora vamos ajustar as permissões do diretório do bind

chown -R bind:bind /var/lib/named/var/cache/bind

Agora vamos subir o servidor de dhcp

/etc/init.d/isc-dhcp-server start

Podemos acompanhar o trabalho do dhcp em /var/log/dhcpd.log

tail -f /var/log/dhcpd.log 
Dec  9 16:53:21 debian dhcpd: Copyright 2004-2011 Internet Systems Consortium.
Dec  9 16:53:21 debian dhcpd: All rights reserved.
Dec  9 16:53:21 debian dhcpd: For info, please visit https://www.isc.org/software/dhcp/
Dec  9 16:53:21 debian dhcpd: Internet Systems Consortium DHCP Server 4.2.2
Dec  9 16:53:21 debian dhcpd: Copyright 2004-2011 Internet Systems Consortium.
Dec  9 16:53:21 debian dhcpd: All rights reserved.
Dec  9 16:53:21 debian dhcpd: For info, please visit https://www.isc.org/software/dhcp/
Dec  9 16:53:21 debian dhcpd: Wrote 0 deleted host decls to leases file.
Dec  9 16:53:21 debian dhcpd: Wrote 0 new dynamic host decls to leases file.
Dec  9 16:53:21 debian dhcpd: Wrote 0 leases to leases file.

Vamos ver um exemplo de maquina que pegou o ip e foi registrada no DNS

tail -f /var/log/dhcpd.log
Dec  9 16:58:45 debian dhcpd: DHCPDISCOVER from 08:00:27:e3:41:30 via eth0
Dec  9 16:58:45 debian dhcpd: DHCPOFFER on 192.168.1.22 to 08:00:27:e3:41:30 via eth0
Dec  9 16:58:45 debian dhcpd: DHCPREQUEST for 192.168.1.22 (192.168.1.20) from 08:00:27:e3:41:30 via eth0
Dec  9 16:58:45 debian dhcpd: DHCPACK on 192.168.1.22 to 08:00:27:e3:41:30 via eth0
Dec  9 16:58:45 debian dhcpd: Added new forward map from exchange.douglasqsantos.com.br to 192.168.1.22
Dec  9 16:58:45 debian dhcpd: Added reverse map from 22.1.168.192.in-addr.arpa. to exchange.douglasqsantos.com.br

Agora vamos testar o dns para ver se esta resolvendo mesmo

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

Name: exchange.douglasqsantos.com.br
Address: 192.168.1.22

Agora vamos testar o reverso desta maquina

dig -x 192.168.1.22
 ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> -x 192.168.1.22
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46035
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;22.1.168.192.in-addr.arpa. IN  PTR

;; ANSWER SECTION:
22.1.168.192.in-addr.arpa. 300  IN  PTR exchange.douglasqsantos.com.br.

;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 86400 IN  NS  douglasqsantos.com.br.
1.168.192.in-addr.arpa. 86400 IN  NS  ns2.douglasqsantos.com.br.
1.168.192.in-addr.arpa. 86400 IN  NS  ns1.douglasqsantos.com.br.

;; ADDITIONAL SECTION:
ns1.douglasqsantos.com.br.  86400 IN  A 192.168.1.20
ns2.douglasqsantos.com.br.  86400 IN  A 192.168.1.20
douglasqsantos.com.br.    86400 IN  A 192.168.1.20

;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Dec  9 17:01:12 2013
;; MSG SIZE  rcvd: 175

Como pode ser notado temos agora o DHCP trabalhando em conjunto com o DNS

Caso o client não mande o hostname para o servidor dhcp não vai ser inserido o nome dele no dns com isso no caso do OpenBSD precisamos ajustar o /etc/dhclient.conf da seguinte forma

vim /etc/dhclient.conf
send host-name "openbsd";

Agora é só mandar pegar um ip com o dhclient

dhclient em0

Nos logs do servidor vamos ter algo como

tail -f /var/log/messages
Dec  9 17:13:50 debian dhcpd: DHCPREQUEST for 192.168.1.50 from 08:00:27:1f:ef:a5 via eth0
Dec  9 17:13:50 debian dhcpd: DHCPACK on 192.168.1.50 to 08:00:27:1f:ef:a5 via eth0
Dec  9 17:13:50 debian dhcpd: Added new forward map from openbsd.douglasqsantos.com.br to 192.168.1.50
Dec  9 17:13:50 debian dhcpd: Added reverse map from 50.1.168.192.in-addr.arpa. to openbsd.douglasqsantos.com.br

Agora vamos ver algo interessante também que é testar a atualização de registro dns pela linha de comando.

Vamos adicionar um novo host chamado centos com o ip 192.168.1.100 no domínio douglasqsantos.com.br.

Vamos ver o código da nossa chave de atualização de zonas

cat /etc/bind/Kdhcp_updater.*.key 
DHCP_UPDATER. IN KEY 0 3 157 Fum3G8P3880TwWMteJgrZg==

Pronto precisamos dessa informação agora vamos inserir o nosso registro

nsupdate 
> server 127.0.0.1
> key DHCP_UPDATER Fum3G8P3880TwWMteJgrZg== 
> zone douglasqsantos.com.br
> update add centos.douglasqsantos.com.br. 600 IN A 192.168.1.100
> send
> zone 1.168.192.in-addr.arpa
> update add 100.1.168.192.in-addr.arpa 600 IN PTR centos.douglasqsantos.com.br
> send
> quit

Agora vamos testar o nosso registro

nslookup centos
Server:   127.0.0.1
Address:  127.0.0.1#53

Name: centos.douglasqsantos.com.br
Address: 192.168.1.100

Agora vamos testar o seu reverso

host 192.168.1.100
100.1.168.192.in-addr.arpa domain name pointer centos.douglasqsantos.com.br.

Referências