Instalação e configuração de servidor DHCP + DNS + CentOS 6

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

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

Vamos fazer um update dos repositórios e vamos atualizar o sistema primeiramente.

yum check-update && yum update -y

Agora vamos instalar os pacotes do bind

yum install bind-chroot bind-utils bind-libs -y

Agora vamos colocar ele na inicialização do sistema

chkconfig named on

Agora vamos reiniciar o serviço para que o named monte a sua jaula

/etc/init.d/named restart

Agora vamos fazer um backup do arquivo de configuração do nosso bind.

cp -Rfa /etc/named.conf{,.bkp}

Agora vamos deixar o arquivo /etc/named.conf como abaixo, aqui estou utilizando a rede 10.0.0.0/23 como minha rede local para exemplo, mude conforme necessário.

vim /etc/named.conf
#Algumas opções do Bind
options {
 listen-on port 53 { 127.0.0.1; 192.168.1.0/24; };
 directory       "/var/named";
 dump-file       "/var/named/data/cache_dump.db";
 statistics-file "/var/named/data/named_stats.txt";
 memstatistics-file "/var/named/data/named_mem_stats.txt";
 allow-query     { any; };
 recursion no;
 version "Não Disponível";
};

#Controles
include "/etc/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; };

 };

#Incluir o nosso arquivo externo que vai conter a configuração da nossa view interna
include "/etc/named/named.conf.internal-zones";

Caso não tenha sido gerada a chave rndc do bind podemos gerar ela como abaixo

rndc-confgen -a -c /etc/rndc.key -k rndc-key -b 256

Agora precisamos acertar as permissões dos arquivos

chown root:named /etc/rndc.key
chmod 640 /etc/rndc.key

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

cd  /var/named/chroot/etc/
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 /var/named/chroot/etc/K*.key
DHCP_UPDATER. IN KEY 0 3 157 /WndiGI/RhhQ0SesJ4qY3w==

Agora vamos criar o nosso arquivo da View Interna /etc/named/named.conf.internal-zones onde somente os nossos clientes da rede local e o nosso servidor local vão poder consultar.

vim /etc/named/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;
};

#Definindo a nossa View interna
view "internal" {

#Definindo quais clientes vão poder consultar esta view, então vão ser a nossa rede interna mesmo o servidor external_slave
 match-clients { internal_hosts; };

#Definindo que os clientes dessa view vão poder efetuar consultas recursivas.
 recursion yes;

#Zona que define os endereços dos root Masters.
zone "." IN {
 type hint;
 file "named.ca";
};

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

#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; };
};


#Este arquivo contem as zonas locais
include "/etc/named.rfc1912.zones";

};

Agora vamos criar o arquivo que os nossos clientes internos vão consultar /var/named/chroot/var/named/db.douglasqsantos.com.br.internal

vim /var/named/chroot/var/named/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.200
ns1             IN      A    192.168.1.200
ns2             IN      A    192.168.1.200
dns             IN      A    192.168.1.200
ldap    IN  A    192.168.1.200
ldap2   IN  A    192.168.1.200
kdc1    IN  A    192.168.1.200
kdc2    IN  A    192.168.1.200

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

;WEB SERVERS
www             IN      A    192.168.1.200
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.200"

Agora vamos criar a zona inversa

vim /var/named/chroot/var/named/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
200      IN   PTR    douglasqsantos.com.br.
200      IN   PTR    ns1.douglasqsantos.com.br.
200      IN   PTR    ns2.douglasqsantos.com.br.
200      IN   PTR    dns.douglasqsantos.com.br.

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

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

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

Vamos agora ajustar o arquivo /etc/resolv.conf para que o nosso servidor consiga encontrar a zona do douglasqsantos.com.br

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

Vamos agora reiniciar o serviço e testar.

/etc/init.d/named restart

Agora vamos fazer alguns testes.

Vamos consultar o endereço do host www

nslookup www
Server:   127.0.0.1
Address:  127.0.0.1#53

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

Agora vamos testar o reverso

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

Agora vamos consultar o endereço do host mail.douglasqsantos.com.br aqui poderíamos consultar somente por mail dai ele completaria com o parâmetro domain do resolv.conf

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

Name: mail.douglasqsantos.com.br
Address: 192.168.1.200

Vamos consultar os registros do tipo A do nosso domínio.

dig -t A douglasqsantos.com.br
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A douglasqsantos.com.br
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34481
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 2

;; QUESTION SECTION:
;douglasqsantos.com.br.     IN  A

;; ANSWER SECTION:
douglasqsantos.com.br.    86400 IN  A 192.168.1.200

;; AUTHORITY SECTION:
douglasqsantos.com.br.    86400 IN  NS  ns1.douglasqsantos.com.br.
douglasqsantos.com.br.    86400 IN  NS  douglasqsantos.com.br.
douglasqsantos.com.br.    86400 IN  NS  ns2.douglasqsantos.com.br.

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

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Dec  9 19:57:55 2013
;; MSG SIZE  rcvd: 127

Agora vamos consultar a transferência do nosso domínio

dig -t axfr dominio.com.br
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t axfr douglasqsantos.com.br
;; global options: +cmd
; Transfer failed.

Tudo ok, agora vamos instalar o dhcp server

yum install dhcp -y

Agora vamos inserir ele na inicialização do sistema

chkconfig --add dhcpd

Agora vamos ajustar as permissões do diretório do bind para que o bind possa atualizar os registros

chown -R named:named /var/named/

Agora vamos configurar o dhcp server

vim /etc/dhcp/dhcpd.conf
option domain-name "douglasqsantos.com.br";
#Definindo os servidores de DNS
option domain-name-servers 192.168.1.200, 8.8.8.8;
#Definindo o servidor de NetBios(WINS)
option netbios-name-servers 192.168.1.200;
#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 "/WndiGI/RhhQ0SesJ4qY3w==";
};

#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.200 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;
}

Agora vamos ajustar por qual interface o dhcp vai escutar

vim /etc/sysconfig/dhcpd
# Command line options here
DHCPDARGS=
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 iniciar o dhcp

/etc/init.d/dhcpd start

Agora vamos ver os logs

tail -f /var/log/messages
Dec  9 20:04:47 centos6 dhcpd: Internet Systems Consortium DHCP Server 4.1.1-P1
Dec  9 20:04:47 centos6 dhcpd: Copyright 2004-2010 Internet Systems Consortium.
Dec  9 20:04:47 centos6 dhcpd: All rights reserved.
Dec  9 20:04:47 centos6 dhcpd: For info, please visit https://www.isc.org/software/dhcp/
Dec  9 20:04:47 centos6 dhcpd: Wrote 0 deleted host decls to leases file.
Dec  9 20:04:47 centos6 dhcpd: Wrote 0 new dynamic host decls to leases file.
Dec  9 20:04:47 centos6 dhcpd: Wrote 0 leases to leases file.
Dec  9 20:04:47 centos6 dhcpd: Listening on LPF/eth0/08:00:27:7d:87:9a/192.168.1.0/24
Dec  9 20:04:47 centos6 dhcpd: Sending on   LPF/eth0/08:00:27:7d:87:9a/192.168.1.0/24
Dec  9 20:04:47 centos6 dhcpd: Sending on   Socket/fallback/fallback-net

Agora vamos levantar um cliente e vamos analisar os logs

tail -f /var/log/messages
Dec  9 20:05:34 centos6 dhcpd: DHCPDISCOVER from 08:00:27:e3:41:30 via eth0
Dec  9 20:05:34 centos6 dhcpd: DHCPOFFER on 192.168.1.22 to 08:00:27:e3:41:30 via eth0
Dec  9 20:05:34 centos6 dhcpd: Added new forward map from exchange.douglasqsantos.com.br to 192.168.1.22
Dec  9 20:05:34 centos6 dhcpd: added reverse map from 22.1.168.192.in-addr.arpa. to exchange.douglasqsantos.com.br
Dec  9 20:05:34 centos6 dhcpd: DHCPREQUEST for 192.168.1.22 (192.168.1.200) from 08:00:27:e3:41:30 via eth0
Dec  9 20:05:34 centos6 dhcpd: DHCPACK on 192.168.1.22 to 08:00:27:e3:41:30 via eth0

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

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