ct

    DDNS (DHCP + BIND)

    Dicas do Guia do Hardware

    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. Beleza, adorei, mas chega de ficar editando zonas DNS dentro da minha rede local. Como implemento isso? Meu amigo, é aí que mora o perigo!Douglas Tórgo Fabretti
    09/12/2009


    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>





    Blog:

    Add to Google

    » Gostou do texto?
    Veja nossos livros impressos:

    Smartphones | Linux | Hardware
    Redes | Servidores


    ... ou encontre o que procura usando a busca:

cb
Livros de Carlos E. Morimoto Contato HOME