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

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

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_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
nameserver 10.0.0.26

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 dhcpupdate

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
dhcpupdate. IN KEY 0 3 157 hsEAzU7JwA/mj+8P/fsntg=====

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; 10.0.0.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" {
 10.0.0.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";
 };
 
 #Dominios locais
 zone "douglasqsantos.com.br" {
 type master;
 file "db.douglasqsantos.com.br.internal";
 allow-transfer { none; };
 allow-update { key dhcpupdate; };
 };
 
#Zona reversa do dominio na rede 10.0.0.0/24
zone "0.0.10.in-addr.arpa" {
type master;
file "db.0.0.10.internal";
allow-transfer { none; };
allow-update { key dhcpupdate; };
};   
 
#Chave para sincronismo entre dhcp e dns que visualizamos com o cat /etc/bind/K*.key
key "dhcpupdate" {
algorithm hmac-md5;
secret "hsEAzU7JwA/mj+8P/fsntg=====";
};
 
};

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. (
        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.26
ns1             IN      A    10.0.0.26
ns2             IN      A    10.0.0.26
dns             IN      A    10.0.0.26
ldap    IN  A    10.0.0.26
ldap2   IN  A    10.0.0.26
kdc1    IN  A    10.0.0.26
kdc2    IN  A    10.0.0.26
 
;MAIL SERVERS
mail            IN      A    10.0.0.26
imap            IN      CNAME mail
pop             IN      CNAME mail
smtp            IN      CNAME mail
webmail         IN      CNAME mail
 
;WEB SERVERS
www             IN      A    10.0.0.26
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           "10.0.0.24"

Agora vamos criar a zona inversa

vim /var/lib/named/var/cache/bind/db.0.0.10.internal
$TTL 86400
@ IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
                        2012022701  ; 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
26      IN  PTR    douglasqsantos.com.br.
26      IN  PTR    ns1.douglasqsantos.com.br.
26      IN  PTR    ns2.douglasqsantos.com.br.
26      IN  PTR    dns.douglasqsantos.com.br.
 
;LDAP e Kerberos
26  IN  PTR    ldap.douglasqsantos.com.br.
26  IN  PTR    ldap2.douglasqsantos.com.br.
26  IN  PTR    kdc1.douglasqsantos.com.br.
26  IN  PTR    kdc2.douglasqsantos.com.br.
 
;MAIL SERVERS
26    IN  PTR    mail.douglasqsantos.com.br.
 
;WEB SERVERS
26      IN  PTR    www.douglasqsantos.com.br.

Vamos criar o managed-key

touch /var/lib/named/var/cache/bind/managed-keys.bind

Agora vamos reiniciar o nosso bind

/etc/init.d/bind9 restart

Vamos testar uma consulta

nslookup www
Server:   10.0.0.26
Address:  10.0.0.26#53
 
Name: www.douglasqsantos.com.br
Address: 10.0.0.26

Vamos testar o reverso

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

Vamos testar o reverso agora pelo dig

dig -x 10.0.0.26
; <<>> DiG 9.7.3 <<>> -x 10.0.0.26
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24795
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 10, AUTHORITY: 3, ADDITIONAL: 3
 
;; QUESTION SECTION:
;26.0.0.10.in-addr.arpa.    IN  PTR
 
;; ANSWER SECTION:
26.0.0.10.in-addr.arpa. 86400 IN  PTR douglasqsantos.com.br.
26.0.0.10.in-addr.arpa. 86400 IN  PTR dns.douglasqsantos.com.br.
26.0.0.10.in-addr.arpa. 86400 IN  PTR ns1.douglasqsantos.com.br.
26.0.0.10.in-addr.arpa. 86400 IN  PTR ns2.douglasqsantos.com.br.
26.0.0.10.in-addr.arpa. 86400 IN  PTR www.douglasqsantos.com.br.
26.0.0.10.in-addr.arpa. 86400 IN  PTR kdc1.douglasqsantos.com.br.
26.0.0.10.in-addr.arpa. 86400 IN  PTR kdc2.douglasqsantos.com.br.
26.0.0.10.in-addr.arpa. 86400 IN  PTR ldap.douglasqsantos.com.br.
26.0.0.10.in-addr.arpa. 86400 IN  PTR mail.douglasqsantos.com.br.
26.0.0.10.in-addr.arpa. 86400 IN  PTR ldap2.douglasqsantos.com.br.
 
;; AUTHORITY SECTION:
0.0.10.in-addr.arpa.  86400 IN  NS  douglasqsantos.com.br.
0.0.10.in-addr.arpa.  86400 IN  NS  ns1.douglasqsantos.com.br.
0.0.10.in-addr.arpa.  86400 IN  NS  ns2.douglasqsantos.com.br.
 
;; ADDITIONAL SECTION:
ns1.douglasqsantos.com.br.  86400 IN  A 10.0.0.26
ns2.douglasqsantos.com.br.  86400 IN  A 10.0.0.26
douglasqsantos.com.br.  86400 IN  A 10.0.0.26
 
;; Query time: 0 msec
;; SERVER: 10.0.0.26#53(10.0.0.26)
;; WHEN: Tue Feb 28 16:40:00 2012
;; MSG SIZE  rcvd: 327

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 10.0.0.26, 8.8.8.8;
#Definindo o servidor de NetBios(WINS)
option netbios-name-servers 10.0.0.26;
#Definindo o tipo de netbios
option netbios-node-type 8;
#Defindo o broadcast da nossa rede
option broadcast-address 10.0.0.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 dhcpupdate {
algorithm hmac-md5;
secret hsEAzU7JwA/mj+8P/fsntg=====;
}
#defindo a zona que vamos efetuar atualizações
zone douglasqsantos.com.br. { 
   primary 127.0.0.1; 
   key dhcpupdate; 
} 
#definindo a zona que vamos efetuar atualizações para reverso
zone 0.0.10.in-addr.arpa. { 
   primary 127.0.0.1; 
   key dhcpupdate; 
}
 
#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 10.0.0.0 netmask 255.255.255.0 { 
#Declaração do range de ips disponiveis para emprestimo
range 10.0.0.20 10.0.0.60; 
#Define qual a subrede para este escopo
option subnet-mask 255.255.255.0;
#define qual o router para esse escopo
option routers 10.0.0.24; 
} #Fim do escopo

#Definindo um ip fixo
host douglas-xp {
 hardware ethernet 08:00:27:ED:99:94;
 fixed-address 10.0.0.21;
}

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 subir o servidor de dhcp

/etc/init.d/isc-dhcp-server restart
Stopping ISC DHCP server: dhcpd failed!
Starting ISC DHCP server: dhcpd.

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

tail -f /var/log/dhcpd.log 
Feb 28 16:52:11 debian dhcpd: Copyright 2004-2010 Internet Systems Consortium.
Feb 28 16:52:11 debian dhcpd: All rights reserved.
Feb 28 16:52:11 debian dhcpd: For info, please visit https://www.isc.org/software/dhcp/
Feb 28 16:52:11 debian dhcpd: Internet Systems Consortium DHCP Server 4.1.1-P1
Feb 28 16:52:11 debian dhcpd: Copyright 2004-2010 Internet Systems Consortium.
Feb 28 16:52:11 debian dhcpd: All rights reserved.
Feb 28 16:52:11 debian dhcpd: For info, please visit https://www.isc.org/software/dhcp/
Feb 28 16:52:11 debian dhcpd: Wrote 0 deleted host decls to leases file.
Feb 28 16:52:11 debian dhcpd: Wrote 0 new dynamic host decls to leases file.
Feb 28 16:52:11 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
Feb 28 16:53:34 debian dhcpd: DHCPDISCOVER from 08:00:27:ed:99:94 via eth0
Feb 28 16:53:34 debian dhcpd: DHCPOFFER on 10.0.0.21 to 08:00:27:ed:99:94 via eth0
Feb 28 16:53:34 debian dhcpd: Added new forward map from douglas-xp.douglasqsantos.com.br to 10.0.0.21
Feb 28 16:53:34 debian dhcpd: added reverse map from 21.0.0.10.in-addr.arpa. to douglas-xp.douglasqsantos.com.br
Feb 28 16:53:34 debian dhcpd: DHCPREQUEST for 10.0.0.21 (10.0.0.26) from 08:00:27:ed:99:94 via eth0
Feb 28 16:53:34 debian dhcpd: DHCPACK on 10.0.0.21 to 08:00:27:ed:99:94 via eth0

Agora vamos testar o dns para ver se esta resolvendo mesmo

nslookup douglas-xp.douglasqsantos.com.br
Server:   10.0.0.26
Address:  10.0.0.26#53
 
Name: douglas-xp.douglasqsantos.com.br
Address: 10.0.0.21

Agora vamos testar o reverso desta maquina

dig -x 10.0.0.21
 
; <<>> DiG 9.7.3 <<>> -x 10.0.0.21
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30583
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3
 
;; QUESTION SECTION:
;21.0.0.10.in-addr.arpa.    IN  PTR
 
;; ANSWER SECTION:
21.0.0.10.in-addr.arpa. 300 IN  PTR douglas-xp.douglasqsantos.com.br.
 
;; AUTHORITY SECTION:
0.0.10.in-addr.arpa.  86400 IN  NS  ns2.douglasqsantos.com.br.
0.0.10.in-addr.arpa.  86400 IN  NS  douglasqsantos.com.br.
0.0.10.in-addr.arpa.  86400 IN  NS  ns1.douglasqsantos.com.br.
 
;; ADDITIONAL SECTION:
ns1.douglasqsantos.com.br.  86400 IN  A 10.0.0.26
ns2.douglasqsantos.com.br.  86400 IN  A 10.0.0.26
douglasqsantos.com.br.  86400 IN  A 10.0.0.26
 
;; Query time: 0 msec
;; SERVER: 10.0.0.26#53(10.0.0.26)
;; WHEN: Tue Feb 28 16:56:04 2012
;; MSG SIZE  rcvd: 178

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