DDNS (DHCP + BIND)

Primeiramente seja muito bem-vindo à este post.

Toda vez que o DHCP recebe uma requisição de IP dinâmico, ele guarda todas informações do cliente dentro do arquivo /lib/var/dhcp/dhcpd.leases (tais como nome da máquina, MAC address, etc). O que o DDNS irá fazer é pegar estas informações e usá-las para inserir valores dentro do arquivo das zonas especificadas.

Por exemplo: A máquina dfabretti (a minha :D) acabou de ser ligada. Ela requisitou, em broadcast, um IP por DHCP. O meu servidor DHCPD recebe essa informação. Guarda os dados da máquina dentro do arquivo leases. Insere os dados dentro das suas respectivas Zonas e envia o IP para a minha estação de trabalho.

Tá beleza, adorei, chega de ficar editando zonas DNS dentro da minha rede local, como implemento isso? Meu amigo, é aí que mora o perigo!

Foi uma dor de cabeça para eu conseguir fazer funcionar este serviço, foram dias estressantes de trabalho que estou dando de lambuja para vocês, portanto aproveitem :D.

Instalando e Configurando o dhcp3-server

Primeiramente, teremos que instalar o DHCPD, para isso iremos executar o seguinte comando:

# apt-get install dhcp3-server

Em seguida, vamos editar o arquivo principal de configuração do dhcpd:

# vim /etc/dhcp3/dhcpd.conf

OBS: Todos os comandos desta dica são executados pelo root e estão em destaque.

Arquivo /etc/dhcp3/dhcpd.conf:

ddns-update-style interim; # Esta é a linha que habilita a atualização dinâmica.

default-lease-time 600; # Opção padrão (para maiores informações: man dhcpd.conf).
max-lease-time 7200; # Opção padrão (para maiores informações: man dhcpd.conf).

log-facility local7; # Formato em que será exibido o log no /var/log/syslog.

authoritative; # Esta opção diz que este servidor será o DHCP principal da rede.

option domain-name “XXXX.com.br”; # Nome do Domínio.
option domain-name-servers XXX.XXX.XXX.XXX; # Servidor DNS.
option broadcast-address XXX.XXX.XXX.XXX; # Broadcast da Rede.
option netbios-name-servers XXX.XXX.XXX.XXX; # Servidor PDC (caso usado).
option netbios-node-type 8;
option subnet-mask XXX.XXX.XXX.XXX; # Máscara da Rede.
option routers XXX.XXX.XXX.XXX; # Gateway da Rede.

include “/etc/bind/rndc.key”; # Responsável pela atualização do bind9.

zone XXXX.com.br. { # Zona master da rede interna onde o DHCP irá inserir os valores.
primary XXX.XXX.XXX.XXX; # IP do servidor DNS (onde a zona está configurada).
key “rndc-key”; # Chave que será usada para integração entre os dois serviços.
}

zone XXX.XXX.XXX.in-addr.arpa. { # Zona reversa da rede interna onde o DHCP irá inserir os valores.
primary XXX.XXX.XXX.XXX; # IP do servidor DNS (onde a zona está configurada).
key “rndc-key”; # Chave que será usada para integração entre os dois serviços.
}

subnet XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX { # Rede / Máscara da Rede.
range XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX; # Range de IPs dinâmicos que serão distribuidos para os clientes.
}

OBS: Apenas lembrando que:

  • Os XXX.XXX.XXX.XXX são IPs (Ex: 192.168.100.1, 192.168.100.0, 192.168.100.255).
  • Os XXXX.com.br são domínio ou zonas (Ex: wiki.com.br, blah.com.br, tiger.net).
  • O XXX.XXX.XXX.in-addr.arpa. é a zona reversa (Ex: 100.168.192.in-addr.arpa.).

Beleza! Após o dhcpd3-server instalado e configurado vamos para o bind9 (ainda não inicie o serviço, pois a chave de autenticação entre os serviços ainda não existe, ela virá junto com o pacote do bind9, se tentar iniciá-lo dará erro).

Instalando e Configurando o bind9

Primeiramente instalaremos o bind9:

# apt-get install bind9

Vamos editar o principal arquivo do bind9:

# vim /etc/bind/named.conf

Insira estas linhas antes do começo do arquivo (acima da linha include “/etc/bind/named.conf.options”).

Arquivo /etc/bind/named.conf:

include “/etc/bind/rndc.key”;
controls { inet 127.0.0.1 allow { localhost; } keys { “rndc-key”; }; };

Após, editamos o arquivo named.conf.options:

# vim /etc/bind/named.conf.options

Dê uma olhada no seu arquivo e veja se ele está com todas estas opções, não que elas sejam obrigatórias, apenas uma é, mas seria uma boa tê-las para a segurança do serviço.

Arquivo /etc/bind/named.conf.options:

options {

directory “/etc/bind”; # Aqui mudaremos onde o bind9 está instalado, no debian este é o padrão (working directory).

version “N/A”; # Esconde a versão do nosso bind e nos protegermos contra possiveis exploits.

forwarders { # Requisições que não seja internas serão feitas em outro servidor DNS.
XXX.XXX.XXX.XXX; # Servidor DNS para consultas externas.
};

auth-nxdomain yes; # Aqui estamos dizendo que nosso domínio existe, este DNS é autoritativo (o principal da rede).

listen-on { # Escutar os seguintes IPs (interfaces).
127.0.0.1; # IP do servidor DNS interno (lo).
XXX.XXX.XXX.XXX; # IP do servidor DNS interno (ethX).
};

allow-query { # Aceitar consultas provenientes de.
127.0.0.0/8; # Rede localdomain.
XXX.XXX.XXX.XXX/XX; # Rede interna.
};

};

Agora temos que configurar as Zonas DNS:

# vim /etc/bind/named.conf.local

Arquivo /etc/bind/named.conf.local:

zone “XXXX.com.br” { # Zona master da rede local.
type master; # Dizemos que será master.
notify no; # Aqui é no pois não temos um dns slave, se tivessemos seria yes.
file “/etc/bind/master.zone”; # Arquivo de configuração da zona.
allow-update { key “rndc-key”; }; # Estamos dizendo que ele aceitará updates pela chave (a mesma que configuramos no DHCP).
};

zone “XXX.XXX.XXX.in-addr.arpa”{ # Zona reversa da rede local.
type master; # Dizemos que será master.
notify no; # Aqui é no pois não temos um dns slave, se tivessemos seria yes.
file “/etc/bind/rev.zone”; # Arquivo de configuração da zona.
allow-update { key “rndc-key”; }; # Estamos dizendo que ele aceitará updates pela chave (a mesma que configuramos no DHCP).
};

Arquivos das zonas

Aqui não temos nenhum tipo de problema, é uma configuração padrão de DNS. Vi em muitos tutoriais espalhados pela internet que tem que ter algo especial do tipo $ORIGIN porém, não precisa. O $ORIGIN é inserido após a primeira atualização dinâmica do dhcp no bind, portanto não vamos nos preocupar com isto.

Vamos editar o arquivo da zona master primeiro:

# vim /etc/bind/master.zone

Arquivo /etc/bind/master.zone:

$TTL 3600
@ IN SOA XXXX.com.br. root.XXXX.com.br. (
2009102801 ; Serial (Y-M-D-N)
28800 ; Update (8 hours)
14400 ; Retry (4 hours)
604800 ; Expire (1 week)
86400 ; Negative Cache (1 day)
)

@ IN NS XXXX.com.br.
@ IN A XXX.XXX.XXX.XXX
@ IN MX 10 XXXX.XXXX.com.br.

OBS:

  • XXXX.com.br. – Nome do servidor dns.
  • XXX.XXX.XXX.XXX – IP do Servidor dns.
  • XXXX.XXXX.com.br. – Nome do servidor de e-mail.

Agora vamos editar o arquivo da zona reversa:

# vim /etc/bind/rev.zone

Arquivo /etc/bind/rev.zone:

$TTL 3600
@ IN SOA XXXX.com.br. root.XXXX.com.br. (
2009102801 ; Serial (Y-M-D-N)
28800 ; Update (8 hours)
14400 ; Retry (4 hours)
604800 ; Expire (1 week)
86400 ; Negative Cache (1 day)
)

@ IN NS XXXX.com.br.
@ IN MX 10 XXXX.XXXX.com.br.

OBS:

  • XXXX.com.br. – Nome do servidor dns.
  • XXXX.XXXX.com.br. – Nome do servidor de e-mail.

O usuário bind não tem permissão de escrita na pasta /etc/bind/, então:

# chmod 765 /etc/bind

Depois, temos que dar permissão de escrita nos arquivos das zonas, então:

# chmod 664 /etc/bind/*

Iniciando e testando os serviços

Bem, a parte mais difícil já passou, agora temos que depurar os erros (caso aconteçam) dos serviços. Para isso, minha dica é abrir duas sessões ssh na máquina: uma para os comandos e outra monitorando o log do sistema.

Para monitorar o log, vá na sessão do ssh e digite:

# tail -f /var/log/syslog

… e deixe a sessão aberta.

dhcp3-server:

Vá para a outra sessão e vamos iniciar os serviços (sempre de olho no monitoramento):

# /etc/init.d/dhcp3-server start

Se na sessão do monitoramento aparecer algo do gênero:

Oct 28 16:21:09 tyrande dhcpd: Internet Systems Consortium DHCP Server V3.1.1
Oct 28 16:21:09 tyrande dhcpd: Copyright 2004-2008 Internet Systems Consortium.
Oct 28 16:21:09 tyrande dhcpd: All rights reserved.
Oct 28 16:21:09 tyrande dhcpd: For info, please visit http://www.isc.org/sw/dhcp/
Oct 28 16:21:09 tyrande dhcpd: Wrote 0 deleted host decls to leases file.
Oct 28 16:21:09 tyrande dhcpd: Wrote 0 new dynamic host decls to leases file.
Oct 28 16:21:09 tyrande dhcpd: Wrote 1 leases to leases file.

… é porque deu tudo certo, caso contrário, deu algo errado e mostrará qual é o problema no log.

bind9:

Na sessão aberta para a inicialização dos serviços digite:

# /etc/init.d/bind9 restart

Se na sessão do monitoramento aparecer algo do gênero:

Oct 28 17:56:04 tyrande named[2018]: received control channel command ‘stop -p’
Oct 28 17:56:04 tyrande named[2018]: shutting down: flushing changes
Oct 28 17:56:04 tyrande named[2018]: stopping command channel on 127.0.0.1#953
Oct 28 17:56:04 tyrande named[2018]: no longer listening on 127.0.0.1#53
Oct 28 17:56:04 tyrande named[2018]: no longer listening on 172.148.200.4#53
Oct 28 17:56:04 tyrande named[2018]: exiting
Oct 28 17:56:04 tyrande named[2126]: starting BIND 9.5.1-P3 -u bind
Oct 28 17:56:04 tyrande named[2126]: found 1 CPU, using 1 worker thread
Oct 28 17:56:04 tyrande named[2126]: using up to 4096 sockets
Oct 28 17:56:04 tyrande named[2126]: loading configuration from ‘/etc/bind/named.conf’
Oct 28 17:56:04 tyrande named[2126]: max open files (1024) is smaller than max sockets (4096)
Oct 28 17:56:04 tyrande named[2126]: using default UDP/IPv4 port range: [1024, 65535] Oct 28 17:56:04 tyrande named[2126]: using default UDP/IPv6 port range: [1024, 65535] Oct 28 17:56:04 tyrande named[2126]: listening on IPv4 interface lo, 127.0.0.1#53
Oct 28 17:56:04 tyrande named[2126]: listening on IPv4 interface eth0, 172.148.200.4#53
Oct 28 17:56:04 tyrande named[2126]: automatic empty zone: 254.169.IN-ADDR.ARPA
Oct 28 17:56:04 tyrande named[2126]: automatic empty zone: 2.0.192.IN-ADDR.ARPA
Oct 28 17:56:04 tyrande named[2126]: automatic empty zone: 255.255.255.255.IN-ADDR.ARPA
Oct 28 17:56:04 tyrande named[2126]: automatic empty zone: 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.0.IP6.ARPA
Oct 28 17:56:04 tyrande named[2126]: automatic empty 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
Oct 28 17:56:04 tyrande named[2126]: automatic empty zone: D.F.IP6.ARPA
Oct 28 17:56:04 tyrande named[2126]: automatic empty zone: 8.E.F.IP6.ARPA
Oct 28 17:56:04 tyrande named[2126]: automatic empty zone: 9.E.F.IP6.ARPA
Oct 28 17:56:04 tyrande named[2126]: automatic empty zone: A.E.F.IP6.ARPA
Oct 28 17:56:04 tyrande named[2126]: automatic empty zone: B.E.F.IP6.ARPA
Oct 28 17:56:04 tyrande named[2126]: command channel listening on 127.0.0.1#953
Oct 28 17:56:04 tyrande named[2126]: zone 0.in-addr.arpa/IN: loaded serial 1
Oct 28 17:56:04 tyrande named[2126]: zone 127.in-addr.arpa/IN: loaded serial 1
Oct 28 17:56:04 tyrande named[2126]: zone 200.148.172.in-addr.arpa/IN: loaded serial 2009102706
Oct 28 17:56:04 tyrande named[2126]: zone 255.in-addr.arpa/IN: loaded serial 1
Oct 28 17:56:04 tyrande named[2126]: zone XXX.com.br/IN: loaded serial 2009102724
Oct 28 17:56:04 tyrande named[2126]: zone localhost/IN: loaded serial 2
Oct 28 17:56:04 tyrande named[2126]: running

… é porque deu tudo certo, caso contrário, deu algo errado e mostrará qual é o problema no log.

Para testar se está dinamicamente inserindo os valores nas zonas, deixe monitorando o log do mesmo jeito que fizemos acima, pegue uma máquina qualquer na sua rede (Windows ou Linux, tanto faz) e ligue-a.

Se quando ela pegar IP aparecer algo do gênero:

Oct 27 20:14:02 tyrande dhcpd: DHCPOFFER on 172.148.200.212 to 00:14:38:66:bf:ac (test) via eth0
Oct 27 20:14:02 tyrande named[1529]: client 172.148.200.4#45851: signer “rndc-key” approved
Oct 27 20:14:02 tyrande named[1529]: client 172.148.200.4#45851: updating zone ‘XXX.com.br/IN’: adding an RR at ‘test.XXX.com.br’ A
Oct 27 20:14:02 tyrande named[1529]: client 172.148.200.4#45851: updating zone ‘XXX.com.br/IN’: adding an RR at ‘test.XXX.com.br’ TXT
Oct 27 20:14:02 tyrande named[1529]: journal file /etc/bind/XXX.master.zone.jnl does not exist, creating it
Oct 27 20:14:02 tyrande dhcpd: Added new forward map from test.XXX.com.br to 172.148.200.212
Oct 27 20:14:02 tyrande named[1529]: client 172.148.200.4#45059: signer “rndc-key” approved
Oct 27 20:14:02 tyrande named[1529]: client 172.148.200.4#45059: … ‘200.148.172.in-addr.arpa/IN’: deleting rset at ‘212.200.148.172.in-addr.arpa’ PTR
Oct 27 20:14:02 tyrande named[1529]: client 172.148.200.4#45059: … ‘200.148.172.in-addr.arpa/IN’: adding an RR at ‘212.200.148.172.in-addr.arpa’ PTR
Oct 27 20:14:02 tyrande named[1529]: journal file /etc/bind/XXX.rev.zone.jnl does not exist, creating it
Oct 27 20:14:02 tyrande dhcpd: added reverse map from 212.200.148.172.in-addr.arpa. to test.XXX.com.br
Oct 27 20:14:02 tyrande dhcpd: DHCPREQUEST for 172.148.200.212 (172.148.200.4) from 00:14:38:66:bf:ac (test) via eth0
Oct 27 20:14:02 tyrande dhcpd: DHCPACK on 172.148.200.212 to 00:14:38:66:bf:ac (test) via eth0

… é porque deu tudo certo, caso contrário, deu algo errado e mostrará qual é o problema no log.

Considerações finais

Com esses passos consegui finalmente fazer funcionar o DDNS. Qualquer dúvida quanto aos procedimentos, quanto aos testes e erros no log, escreva-me, podemos trocar algumas ideias.

Douglas Fabretti
E-mail: douglas.fabretti [at]gmail em com
Messenger: douglas.torgo.fabretti [at]hotmail em com

Espero que tenha gostado e espero que ele tenha sido útil para quem precisa. Abraços a todos.

Por Douglas Tórgo Fabretti <douglas.fabretti [at]gmail em com>

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X