Montando o cache de DNS

Neste artigo, mostro duas maneiras de montar um servidor local com cache de DNS:(1) sem forward - cujas solicitações que não forem respondidas pelo servidor, são passadas para os root servers e (2) com forward - cujas solicitações não encontradas no cache, são repassadas para um servidor de DNS externo, juntamente com algumas diretivas de acesso.

[ Hits: 45.050 ]

Por: Perfil removido em 27/09/2012


Cache



Cache sem forward

Imagine que você, apenas instalou o pacote bind para um servidor local e configurou as estações para utilizarem o endereço IP deste servidor como DNS primário, mesmo sem fazer nenhuma alteração no arquivo de configuração padrão.

Desta forma, o BIND estará fazendo o trabalho de um servidor de cache de DNS, encaminhando as requisições para um root server (se necessário) sem responder diretamente para um determinado domínio.

Este tipo de cenário é chamado de Cache sem forward.

Instalação

No Debian e derivados:

# apt-get install bind9

No CentOS e Fedora, o pacote bind instala diretamente a versão mais recente, sem opção de escolher entre a versão BIND 8 ou BIND 9:

# yum install bind

No Slackware, você encontra o pacote dentro da pasta n do primeiro CD. Ao instalar, verifique a versão incluída na distribuição. Use sempre o BIND 8 ou BIND 9, nunca o BIND 4, que não está mais em uso.

Esta é a instalação mais simples possível do servidor BIND:
  • Não há autoridade sobre qualquer domínio;
  • Não há repasses de consultas para outro servidor, o próprio servidor se encarrega de obter as respostas no seu cache. Caso não as encontre solicita a partir dos root servers;
  • Todas as consultas são armazenadas em um cache local em memória por um prazo determinado pela configuração de cada domínio consultado.

O arquivo "named.conf.options" necessário para esta configuração está abaixo.

/etc/bind/named.conf.options:

options {
     directory "/var/cache/bind";

     };
     // a caching only nameserver config
     //


zone "." {
         type hint;
         file  "/etc/bind/db.root";
};


O arquivo "db.root" da configuração da zona raiz " . " possui o endereço atualizado dos 13 servidores (root -level) da hierarquia de DNS espalhados pelo mundo.

A configuração da zona raiz não é necessária pois ela estar presente no arquivo, em /etc/bind/named.conf.default-zones.

Com esta configuração, seu servidor DNS consegue funcionar por conta própria, não dependendo do DNS do provedor. O DNS do provedor, por atender um número maior de clientes, vai sem dúvida, ter um cache mais rico que o seu, o que resulta em resoluções de nomes mais rápidas.

Por outro lado, não depender do servidor de nomes do provedor, pode ser uma vantagem caso ocorram falhas frequentes no serviço de DNS oferecido para sua rede.

Cache com forward

O servidor DNS do provedor de acesso, por ter potencialmente uma quantidade muito maior de clientes que o servidor da rede interna, possui também um cache muito maior.

Isto significa que as consultas são provavelmente respondidas mais rapidamente que as do nosso servidor interno. Por outro lado, pode não ser desejável depender inteiramente de um serviço externo.

Neste caso, configuramos o servidor para o meio termo:
  • O servidor local faz cache de todas as consultas;
  • Caso receba uma consulta cuja resposta não esteja no cache, ele vai fazer uma busca recursiva na Internet até obter a resposta; caso ela já exista em cache, então a resposta é imediata;
  • Se o servidor DNS do provedor estiver indisponível o servidor local fará uma busca por conta própria.

Uma configuração básica do cache com forward ficaria assim:

   options {
        directory  "/var/cache/bind";
        allow-query { localhost; };
        allow-query-on { IP da interface do servidor local; };
        forwarders { DNS do provedor de acesso primário; DNS do provedor de acesso secundário; };
        forward first;
   };
     //
    // a caching only nameserver config
   //

   zone "." {
        type hint;
        file "/etc/bind/root.db;
   };


A opção allow-query no exemplo acima, permite apenas a própria máquina { 127.0.0.1 } e máquinas interligadas à interface do servidor local fazerem consultas no DNS. Qualquer outra máquina será recusada e terá uma mensagem de log no arquivo: /var/log/messages.

Exemplo:
Sep 19 16:55:21 host named[2305]: client 172.16.10.10#34532:query (cache) denied


Veja que isto não é substituto para um firewall:
  • Como este servidor de DNS é interno, não faz o menor sentido deixá-lo exposto na Internet. Mesmo com esta diretiva de controle de acesso, o servidor named estará escutando na porta 53 de todas as interfaces da máquina e recebendo tráfego potencialmente hostil.

O melhor é:
  • Não deixar chegar tráfego desnecessário no seu servidor DNS. Se for instalá-lo na mesma máquina que serve de roteador para a Internet, bloqueie o tráfego da porta 53 para TCP e UDP.

Uma outra opção, é colocar o endereço do serviço OpenDNS, cujos valores atualmente são:
  • OpenDNS (1): 208.67.222.222
  • OpenDNS (2): 208.67.220.220


    Próxima página

Páginas do artigo
   1. Cache
   2. Diretivas de controle de acesso
Outros artigos deste autor

Convertendo MBR para GPT com gdisk

JSP - Parte 1

Sylpheed - Cliente de e-mail para terminais leves

Mandrake 10.1 Official - Análise de instalação e uso

soundKonverter - o maravilhoso conversor de áudio

Leitura recomendada

Apache2 + PHP5 + VirtualHosts no Debian e Ubuntu

Configuração de um servidor VPN com OpenVPN e chave estática

Certificação Eletrônica no Linux para PJe - Relato de minha experiência como advogado

hpfall - Acelerômetro em notebooks HP para evitar perda de dados

Timezones - Uma questão de ponto de vista

  
Comentários
[1] Comentário enviado por liciomz em 18/10/2012 - 11:33h

Vou testar, muito obrigado.

[2] Comentário enviado por fmpfmp em 01/08/2013 - 13:53h

Esse arquivo de configuração está errado. Se você utilizar o parâmetro "forward first" o servidor vai sempre enviar as requisições para os servidores do provedores, e caso não haja resposta, ele mesmo responderá. Ou seja, o cache quase nunca será acessado. O certo é apagar esta linha ou por "only" ao invés de "first". E utilizar DNSSEC para um servidor de cache local é inútil.

[3] Comentário enviado por removido em 01/08/2013 - 19:05h


[2] Comentário enviado por fmpfmp em 01/08/2013 - 13:53h:

Esse arquivo de configuração está errado. Se você utilizar o parâmetro "forward first" o servidor vai sempre enviar as requisições para os servidores do provedores, e caso não haja resposta, ele mesmo responderá. Ou seja, o cache quase nunca será acessado. O certo é apagar esta linha ou por "only" ao invés de "first". E utilizar DNSSEC para um servidor de cache local é inútil.


Boa Tarde,

Primeiramente, gostaria de dizê-lo que o meu arquivo de configuração não está errado.
Porque no próprio artigo está muito claro que caso o servidor receba uma requisição e a resposta NÃO esteja no cache do DNS ele vai utilizar as diretivas que estão configuradas como forwarders ===> forward first que é a padrão.
Caso eu retire a diretiva forwarders o meu cache de DNS nunca vai consultar os servidores
de DNS externos que é muito mais rico que qualquer cache de DNS pois o cache fica armazenado
em memória RAM e sem esta diretiva o meu cache de DNS vai tentar resolver tudo por conta própria causando
uma seria perda de desempenho por parte das resoluções. Ou seja é inviável retirar esta diretiva.

A diferença entre forward first e forward only é a seguinte : Caso o meu servidor DNS receba uma consulta cuja a resposta não está no cache ele vai utilizar a diretiva forward first ou seja consulte os DNS externos e se não for atendido ou seja se não for encontrado a resposta ele mesmo ( cache DNS) responderá. Já a opção "only" faz com que apenas encaminhe as requisições p/ o DNS externo caso não esteja no próprio cache do DNS mas neste caso ele (cache DNS) não irá responder caso a resposta não for encontrada .


E o DNSSEC é uma opção válida para qualquer DNS recursivo que no meu caso é o cache de DNS.

qualquer dúvida acesse este link:

http://www.zytrax.com/books/dns/ch7/queries.html#forward

forward is only relevant in conjunction with a valid forwarders statement. If set to 'only' the server will only forward queries, if set to 'first' (default) it will send the queries to the forwarder and if not answered will attempt to answer the query. This statement may be used in a zone, view or a global options clause.
.
grato.

[4] Comentário enviado por angkor em 05/09/2013 - 11:33h

Bom dia,

Parabéns pelo artigo.

Eu testei e obtive os seguintes erros:

options {
directory "/var/cache/bind";
allow-query { localhost; };
allow-query-on { 192.168.0.252; };
forwarders { 200.211.11.100; 200.211.11.101; };
forward first;
;
Na maquina cliente "192.168.0.31" eu tentei pingar o terra.
ping terra.com.br
A solicitação ping não pôde encontrar o host terra.com.br. Verifique o nome e tente
novamente.

O server bloqueava
Sep 5 11:23:23 samba4 named[8838]: client 192.168.0.31#64165: query (cache) 'terra.com.br/A/IN' denied


Então alterei para:
options {
directory "/var/cache/bind";
allow-query { 192.168.0.0/24; };
allow-query-on { 192.168.0.252; };
forwarders { 200.211.11.100; 200.211.11.101; };
forward first;
;

e o servidor loga o seguinte:
Sep 5 11:24:38 samba4 named[8881]: error (network unreachable) resolving 'terra.com.br/DS/IN': 2001:12f8:4::10#53


[5] Comentário enviado por removido em 05/09/2013 - 15:01h


[4] Comentário enviado por angkor em 05/09/2013 - 11:33h:

Bom dia,

Parabéns pelo artigo.

Eu testei e obtive os seguintes erros:

options {
directory "/var/cache/bind";
allow-query { localhost; };
allow-query-on { 192.168.0.252; };
forwarders { 200.211.11.100; 200.211.11.101; };
forward first;
;
Na maquina cliente "192.168.0.31" eu tentei pingar o terra.
ping terra.com.br
A solicitação ping não pôde encontrar o host terra.com.br. Verifique o nome e tente
novamente.

O server bloqueava
Sep 5 11:23:23 samba4 named[8838]: client 192.168.0.31#64165: query (cache) 'terra.com.br/A/IN' denied


Então alterei para:
options {
directory "/var/cache/bind";
allow-query { 192.168.0.0/24; };
allow-query-on { 192.168.0.252; };
forwarders { 200.211.11.100; 200.211.11.101; };
forward first;
;

e o servidor loga o seguinte:
Sep 5 11:24:38 samba4 named[8881]: error (network unreachable) resolving 'terra.com.br/DS/IN': 2001:12f8:4::10#53



Boa Tarde,

Reginaldo apesar de não conhecer as configurações da sua rede, este artigo serve como referência para montar um servidor

de DNS recursivo com a finalidade de fazer apenas o cache das solicitações feitas pelos usuários de uma máquina local onde esteja

instalado o Bind 9 ou para uma simples rede onde o Bind 9 esteja instalado junto ao gateway da rede ou seja a máquina que

onde esteja ligado o modem. Nas opções allow-query, allow-recursion e outras não utilizei nenhuma faixa de rede como exemplo,

mas no teu caso acredito que ficaria assim:

allow-query { 127.0.0.1; 192.168.0.0/24; };

allow-recursion { 127.0.0.1; 192.168.0.0/24; };

e recomendo utilizar a seguinte diretiva no arquivo de configuração:/etc/bind/named.conf.options :


// permite tanto o servidor como o gateway a utilizar a porta 53 caso exista algum bloqueio por parte do firewall.
listen-on port 53 { 127.0.0.1; 192.168.0.252; };

grato.

[6] Comentário enviado por removido em 05/09/2013 - 15:14h


[5] Comentário enviado por rulios em 05/09/2013 - 15:01h:


[4] Comentário enviado por angkor em 05/09/2013 - 11:33h:

Bom dia,

Parabéns pelo artigo.

Eu testei e obtive os seguintes erros:

options {
directory "/var/cache/bind";
allow-query { localhost; };
allow-query-on { 192.168.0.252; };
forwarders { 200.211.11.100; 200.211.11.101; };
forward first;
;
Na maquina cliente "192.168.0.31" eu tentei pingar o terra.
ping terra.com.br
A solicitação ping não pôde encontrar o host terra.com.br. Verifique o nome e tente
novamente.

O server bloqueava
Sep 5 11:23:23 samba4 named[8838]: client 192.168.0.31#64165: query (cache) 'terra.com.br/A/IN' denied


Então alterei para:
options {
directory "/var/cache/bind";
allow-query { 192.168.0.0/24; };
allow-query-on { 192.168.0.252; };
forwarders { 200.211.11.100; 200.211.11.101; };
forward first;
;

e o servidor loga o seguinte:
Sep 5 11:24:38 samba4 named[8881]: error (network unreachable) resolving 'terra.com.br/DS/IN': 2001:12f8:4::10#53



Boa Tarde,

Reginaldo apesar de não conhecer as configurações da sua rede, este artigo serve como referência para montar um servidor

de DNS recursivo com a finalidade de fazer apenas o cache das solicitações feitas pelos usuários de uma máquina local onde esteja

instalado o Bind 9 ou para uma simples rede onde o Bind 9 esteja instalado junto ao gateway da rede ou seja a máquina que

onde esteja ligado o modem. Nas opções allow-query, allow-recursion e outras não utilizei nenhuma faixa de rede como exemplo,

mas no teu caso acredito que ficaria assim:

allow-query { 127.0.0.1; 192.168.0.0/24; };

allow-recursion { 127.0.0.1; 192.168.0.0/24; };

e recomendo utilizar a seguinte diretiva no arquivo de configuração:/etc/bind/named.conf.options :


// permite tanto o servidor como o gateway a utilizar a porta 53 caso exista algum bloqueio por parte do firewall.
listen-on port 53 { 127.0.0.1; 192.168.0.252; };

grato.


gostaria de informá-lo também que quando cadastramos a faixa de rede p/ liberar o acesso
devemos cadastrar a máscara

allow-query { 192.168.0.252/24; };

com certeza os erros que você está encontrando está relacionado a falta da máscara de rede e não no meu arquivo de configuração.

obrigado.

[7] Comentário enviado por n3v3s em 17/03/2017 - 22:06h

Fabuloso, parabéns pelo artigo. Me ajudou bastante aqui em um projeto!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts