Instalação e configuração de servidor DHCP + DNS + OpenBSD 5.4

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

Aqui no OpenBSD o Bind já vem instalado no sistema por default e ele vem enjaulado em /var/named com isso somente precisamos configurar ele para funcionar de acordo com a nossa necessidade, vamos lá então.

Vamos fazer um backup do arquivo de configuração

cd /var/named/etc
cp named.conf named.conf.old

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

vim /var/named/etc/named.conf
#Algumas opções do Bind
options {
 listen-on port 53 { 127.0.0.1; 192.168.1.0/24; };
 directory       "/";
 dump-file       "/log/data/cache_dump.db";
 statistics-file "/log/data/named_stats.txt";
 memstatistics-file "/log/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 "/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 "/log/named-update-debug.log";
 severity  debug 3;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 channel security-info    {
 file "/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.conf.internal-zones";

Agora vamos criar os diretórios que vão armazenas os logs e vamos acertar as permissões deles.

mkdir -p /var/named/log/data
chown -R root:named /var/named/log
chmod -R 775 /var/named/log

Agora vamos gerar a chave do rndc

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

Agora precisamos acertar as permissões dos arquivos

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

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

cd /var/named/etc/
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 /var/named/etc/K*.key
dhcpupdate. IN KEY 0 3 157 jt5wCl0zh1ayu4yLb49uAQ==

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

vim /var/named/etc/named.conf.internal-zones
#definicao dos hosts internos
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
 match-clients { internal_hosts; };

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

#Zonas default do bind
zone "." {
        type hint;
        file "etc/root.hint";
};

zone "localhost" {
        type master;
        file "standard/localhost";
        allow-transfer { localhost; };
};

zone "127.in-addr.arpa" {
        type master;
        file "standard/loopback";
        allow-transfer { localhost; };
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" {
        type master;
        file "standard/loopback6.arpa";
        allow-transfer { localhost; };
};

#Chave para sincronismo entre dhcp e dns que visualizamos com o cat /var/named/etc/K*.key
key "dhcpupdate" {
        algorithm hmac-md5;
        secret "jt5wCl0zh1ayu4yLb49uAQ==";
};

#Dominios locais
zone "douglasqsantos.com.br" {
        type master;
        file "master/db.douglasqsantos.com.br.internal";
        allow-transfer { none; };
        allow-update { key dhcpupdate; };
 };

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

};

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

vim /var/named/master/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.50
ns1             IN      A    192.168.1.50
ns2             IN      A    192.168.1.50
dns             IN      A    192.168.1.50
ldap            IN      A    192.168.1.50
ldap2           IN      A    192.168.1.50
kdc1            IN      A    192.168.1.50
kdc2            IN      A    192.168.1.50

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

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

Agora vamos criar a zona inversa

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

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

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

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

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

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

Agora precisamos habilitar o named em /etc/rc.conf.local da seguinte forma

vim /etc/rc.conf.local
named_flags=""
pkg_scripts="named"

Agora vamos ajustar as permissões dos diretório para o dhcp consiga efetuar as atualizações nas zonas

chown -R named:named /var/named/etc/
chown -R named:named /var/named/master/

Vamos agora iniciar o serviço e testar.

/etc/rc.d/named start

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.50

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.50

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

dig -t A douglasqsantos.com.br

; <<>> DiG 9.4.2-P2 <<>> -t A douglasqsantos.com.br
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55343
;; 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.50

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

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

;; Query time: 10 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Dec  9 12:44:19 2013
;; MSG SIZE  rcvd: 127

Vamos agora consultar todos os registros do nosso domínio.

dig -t axfr douglasqsantos.com.br

; <<>> DiG 9.4.2-P2 <<>> -t axfr douglasqsantos.com.br
;; global options:  printcmd
; Transfer failed.

Como pode ser notado não temos permissão para efetuar a transferência da zona

Como pode ser notado o nosso servidor estar funcionando corretamente.

Agora vamos instalar e configurar o servidor dhcp

Vamos instalar o serviço

pkg_add -v isc-dhcp-server

Temos que fazer uma alteração no daemon do dhcpd pois o que vem por padrão do OpenBSD fica em /usr/sbin/dhcpd e o que instalamos está em /usr/local/sbin/dhcpd

vim /etc/rc.d/dhcpd
#!/bin/sh
#
# $OpenBSD: dhcpd,v 1.2 2011/07/08 04:29:54 ajacoutot Exp $

daemon="/usr/local/sbin/dhcpd"

. /etc/rc.d/rc.subr

rc_reload=NO

rc_pre() {
        touch /var/db/dhcpd.leases
}

rc_cmd $1

Agora vamos colocar ele na inicialização junto ao named

vim /etc/rc.conf.local
named_flags=""
dhcpd_flags=""
pkg_scripts="named dhcpd"

Agora vamos ajustar a configuração do serviço de dhcp

vim /etc/dhcpd.conf
#Definindo o dominio
option domain-name "douglasqsantos.com.br";
#Definindo os servidores de DNS
option domain-name-servers 192.168.1.50, 8.8.8.8;
#Definindo o servidor de NetBios(WINS)
option netbios-name-servers 192.168.1.50;
#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 dhcpupdate {
algorithm hmac-md5;
secret "jt5wCl0zh1ayu4yLb49uAQ==";
}
#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 1.168.192.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 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 debian {
 hardware ethernet 08:00:27:73:F3:54;
 fixed-address 192.168.1.22;
}

Agora vamos criar o arquivo que define quais interfaces que o dhcpd vai escutar no meu caso a interface interna em0

vim /etc/dhcpd.interfaces
em0

Agora vamos iniciar o serviço

/etc/rc.d/dhcpd start

Podemos acompanhar os logs do dhcp em /var/log/messages

tail -f /var/log/messages
Dec  9 12:44:57 openbsd pkg_add: Added isc-dhcp-server-4.2.5.1 

Note que eu tenho um warning por causa que as declarações são todas globais mais isto não tem problemas pois só tenho um scopo.

Agora vou ligar um cliente para pegar o ip e vamos ver nos logs

tail -f /var/log/messages
Dec  9 12:48:03 openbsd dhcpd: Dynamic and static leases present for 192.168.1.22.
Dec  9 12:48:03 openbsd dhcpd: Remove host declaration debian or remove 192.168.1.22
Dec  9 12:48:03 openbsd dhcpd: from the dynamic address pool for 192.168.1.0/24

Agora vamos consultar o nosso novo host no dns

nslookup debian
Server:         127.0.0.1
Address:        127.0.0.1#53

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

Agora vamos consultar o reverso dele

host 192.168.1.22
22.1.168.192.in-addr.arpa domain name pointer debian.douglasqsantos.com.br.

Tudo ok :D 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