Destinado a todos os que deseja utilizar alguma espécie de software Open Source

quarta-feira, 24 de setembro de 2008

Noções de DNS

Servidor DNS (BIND)

O DNS (Domain Name System) é o sistema responsável pela resolução de nomes em endereços IP, deixando a navegação na internet mais simples. Quando é digitado um endereço web em um browser ou um endereço ftp em um cliente ftp ou em qualquer outra aplicação, esta aplicação pergunta ao DNS quem é este endereço. O papel do DNS é resolver este nome em um endereço IP e retornar para quem o perguntou. Deste modo torna-se possível a navegação através de nomes.

DOMÍNIOS

O DNS é uma estrutura hierárquica onde sua origem se tem a partir de um ponto (.) e a partir daí temos os domínios e os subdomínios.

Todo host tem um nome e seu nome completo é chamdo FQDN (Full Qualified Domain Name), que é composto de duas partes, a parte que identifica o host dentro do domínio e a parte que identifica o domínio, por exemplo, em www.centosbr.org, o www significa o nome do host dentro do domínio centosbr.org, por isso que quando colocamos no browser apenas o centosbr.org a página é exibida normalmente. Nestes casos, a busca do DNS será realizada pelo domínio e não pelo host . A parte .org é chamado de TLD (Top Level Domain) e informa o tipo de domínio que se esta acessando. Os TLDs mais comuns são:

.com - Comercial
.edu - Educacional
.org - Organizacional
.gov - Governamental
.mil - Militar
.arts - Cultural

Os TDLs também identificam o país de origem dos hosts.

.br - Brasil
.jp - Japão
.nz - Nova Zelândia
.ca - Canadá

O DNS dentro da internet faz parte de uma complexa hierarquia dentro de um banco de dados, onde cada servidor DNS tem autorização de responder as requisições sobre os nomes de domínio de uma quantidade limitada de hosts.

DNS SERVER

O DNS pode ser conceitualmente dividido em três partes:

Espaço de nome de domínio
É a listagem das informações de todos os hosts da rede.

Resolvers
São programas ou rotinas de bibliotecas que extraem as informações solicitadas aos servidores DNS.

Servidores DNS
São os programas capazes de resolver uma requisição de nomes. Eles mantém os dados localizados nos espaços de nome de domínio.

Existem alguns servidores DNS espalhados pelo mundo, chamados de rootservers da internic que são os grandes servidores DNS dividindo as tarefas de resolução de nomes. Estes servidores são dispostos hierarquicamente, tendo como pai o servidor raiz. O papel destes servidores é interligar todos os servidores DNS do mundo.

O desenho abaixo, mostra como fica a disposição destes servidores, se uma solicitação é enviada para um domínio .com.br e este servidor não souber resolver este nome, a requisição será enviada para o servidor raiz que encaminha para o o servidor autorizado a responder esta requisição.

Photo Sharing and Video Hosting at Photobucket

Com esta divisão fica mais fácil gerenciar os domínios artavés de entidades responsáveis, como é o Comitê Gestor da Internet do Brasil que é responsável por controlar a terminação .br.

Então, para uma resolução de nome de um domínio .com.br, o host envia uma requisição para o servidor raiz que o encaminha para o servidor que controla a TLD .com que novamente redireciona para o servidor responsável pela terminação .br o qual tem autorização para responder com o endereço IP referente ao nome, porém como a estrutura é hierárquica o .br nada sabe sobre o .com.

Para melhorar a performance de um serviço DNS configurado em um servidor local, é recomendável a distribuição deste serviço em outros servidores, nós podemos ter servidores do tipo:

Primary Master Server
Servidor primário do domínio, Possui autorização para resolução de nomes dentro de todo o domínio.

Secondary Master Server
Servidor secundário do domínio. Pode ser chamado de backup do servidor primário. Também possui autorização de resolução dentro do domínio, porém o servidor secundário faz downloads da lista de registros do servidor primário, em vez de guardar localmente.

Slave Server
Servidor escravo. Este servidor encaminho as requisições para uma lista conhecida de servidores de encaminhamento, porém não guarda nenhuma informação.

Forwarder Server
Servidores de encaminhamento. Encaminha requisições para servidores remotos

Caching Server
Respondem às requisições através do registro de cache que são coletados das requisições anteriores.

O servidor primário é o servidor que tem autorização para resolução de nomes dentro do domínio, com isso, todas as requisições dos hosts do domínio passarão por este servidor, por este motivo, quando o DNS server realiza uma pesquisa pela primeira vez, ele guarda a resposta em um cache interno, para que quando uma segunda requisição sobre este mesmo nome seja feita, o servidor possa responder de forma mais rápida, e sem a necessidade de realizar uma nova consulta, diminuindo o tráfego e consequentemente aumentando a performance.

Porém, se um servidor guarda uma informação por um longo período, esta informação ficará desatualizada e obsoleta, diminuindo a credibilidade do serviço. Para resolver esta questão foi implementado no DNS server um campo chamado TTL (Time to Live) que informa por quanto tempo uma informação ficará guardada no cache.

No LINUX, o servidor DNS que utilizaremos é o BIND (Berkeley Internet Name Domain) que oferece soluções tanto de DNS server quanto de DNS resolver library. Vamos mostrar como instalar e configurar o BIND 9.x.

INSTALAÇÃO

A instalação do BIND pode ser feita por

Citando:

#yum install bind


CONFIGURAÇÃO

Para iniciar, vamos configurar o resolver, esta configuração é necessária mesmo que não ser pretenda executar um servidor DNS. Para configurar o resolver, vamos primeiro editar o arquivo /etc/host.conf

Citando:

#vi /etc/host.conf


Neste arquivo podemos informar ao resolver, quais serviços usar e em que ordem. Segue algumas opções do arquivo host.conf.

Order
Especifica a ordem em que os mecanismos de resolução de nomes serão tentados. Estes mecanismos podem ser:
Ex.: order hosts,bind

hosts
Tenta resolver o nome localmente através do arquivo /etc/hosts

bind
Solicita a resolução de nomes a um servidor BIND

nis
Tenta a resolução de nomes através do protocolo NIS (Network Information Service).

Alert
Alerta se houve alguma tentativa de “fingir” um endereço IP, esta tentativa ficará registrada através do recurso syslog.
Ex.: alert on

NoSpoof
Se for usada a resolução reversa para corresponder o nome de um host a seu endereço, esta opção resolve o nome de host retornado para verificar se realmente pertence ao host solicitado.
Ex.: nospoof off

Obs.: Muita atenção ao habilitar esta opção, pois pode aumentar significativamente o tráfego no servidor.

Trim
Nesta opção é passado o nome do domínio, que é resolvido antes de realizar a procura no arquivo /etc/hosts. Desta forma não será necessário especificar o nome de domínio no arquivo, apenas os hosts básicos.
Ex.: trim centosbr.org

Multi
Esta opção terá efeito apenas na consulta hosts e especifica se um host poderá ter mais de um endereço IP no arquivo /etc/hosts
Ex.: multi off

Entendido com funciona cada opção do arquivo, segue um exemplo de um arquivo configurado:

Citando:

# Arquivo /etc/host.conf
#
# Tentará resolver os nomes localmente para depois solicitar a resolução ao BIND
order hosts,bind
#
# Não aceitará mais de um endereço IP no arquivo /etc/hosts
multi off
#
# Não será realizada a checagem de IP spoofing
nospoof off
#
# Serão regisrtadas as tentativas de “fingir IP”
alert on
#
# O domínio centosbr.org será resolvido antes de realizar a consulta no hosts
trim centosbr.org


Após editar o arquivo /etc/host.conf vamos configurar um arquivo chamado /etc/resolv.conf que especifica os servidores DNS para requisição de resolução de nomes e em que ordem devem ser contactados.

Podem ser usados três opções neste arquivo:

Domain
Especifica o nome de domínio local. Caso esta opção não esteja configurada, o resolver tenta obter este nome através da chamada de sistema getdomainname().
Ex.:
domain centosbr

NameServer
Especifica o endereço IP do servidor DNS. Esta opção pode ser usada três vezes, para especificar três servidores de nomes diferentes.
Ex.:
nameserver 192.168.0.1
nameserver 192.168.0.2
nameserver 192.168.0.3

Search
Quando se realiza uma consulta para resolução de nomes normalmente se coloca o nome do host.domínio, se o domínio não for especificado, esta opção lista os domínios a serem procurados. Caso esta opção não seja especificada no arquivo, a busca será realizada no domínio local e nos domínios pai.
Ex.:
search centosbr

Segue um arquivo /etc/resolv.conf configurado.

Citando:

#
# Arquivo /etc/resolv.conf
#
# Especifica o domínio local
domain centosbr
#
# Especifica o primeiro servidor a realizar a consulta
nameserver 192.168.0.1
#
# Especifica o segundo servidor a realizar a consulta
nameserver 192.168.0.2
#
# Especifica o terceiro servidor a realizar a consulta
nameserver 192.168.0.3


No exemplo acima não foi utilizada a opção search. Se for solicitada a consulta para um host cent01 primeiramente será realizada a consulta para cent01 depois para cent01.centosbr.

Com esta este arquivo configurado, finalizamos a configuração do resolver. Veremos agora como configurar o servidor de resolução de nomes, DNS Server, através do daemon named.

Antes de configurar o servidor DNS, precisamos entender a estrutura dele. Quando finalizamos a instalação do BIND no servidor, podemos verificar que os seguintes arquivos foram criados na pasta /var/named:

named.ca
Este arquivo possui todas as informações dos rootservers, espalhados pelo mundo. Estes rootservers são os grandes servidores de DNS do mundo, se seu servidor não sabe resolver uma solicitação de nome, encaminha para um desses servidores que realizará a resolução.

named.local
Neste arquivo esta a informação da zona local da máquina (localhost).

localhost.zone
Este é o arquivo de zona reversa, resolve endereço IP para nome.

Estes arquivos são padrões e não precisam ser editados.

Os hosts dentro de um domínio, tornam-se desatualizados e precisam ser alterados, ou inseridos novos hosts, ou até removidos, para este serviço é necessário um host com autoridade. Como nem todos os hosts podem der autoridade para tal processo, foram criadas zonas para delegar autoridade a alguns hosts.

Nas zonas são inseridas informações de hosts e dos subdomínios que fazem parte dela. As zonas de domínio são os arquivos responsáveis por informar ao DNS Server qual o servidor irá responder pelos diversos serviços de uma rede (ftp, e-mail, web, etc.)

Vamos ver como criar um arquivo de zona chamado centosbr.org.hosts:

Citando:

#vi /var/named/centosbr.org.hosts


Citando:

$ TTL 3600

@ IN SOA dns.centosbr.org. root.centosbr.org. (
2007061201 ; serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ; Minimun )
IN NS dns.centosbr.org

dns IN A 192.168.1.1
www IN A 192.168.1.3
ftp IN A 192.168.1.3
smtp IN A 192.168.1.8
pop3 IN A 192.168.1.8
mail IN A 192.168.1.9


Os registros gravados em um arquivo zone são chamados SRR (Standard Resource Records) e todos possuem o mesmo formato básico.

[nome] [ttl]

Onde os campos nome e TTL não são obrigatórios.

O campo classe pode possuir os seguintes valores:

IN
Servidor Internet
HS
Servidores hesiod
CH
Servidores chaosnet

No campo tipo poderão ser usados os seguintes valores:

SOA
Start Of Authority – Indica a autoridade para os dados do domínio em questão
@ (AT)
Define a localização do domínio
Serial
Serve para manter os dados com o servidor escravo sincronizados. Toda vez que o servidor escravo se conectar com o servidor mestre e o serial estiver com um número menor, este copia as informações do servidor primário, caso contrário as informações ficam as mesmas.
Refresh
Este é o intervalo de tempo para a sincronização do servidor escravo com o primário, em segundos
Retry
Caso o servidor primário pare seu funcionamento pelo tempo estipulado nesta opção, o servidor escravo tentará reativar a comunicação repentinamente.
Expire
Tempo em que uma informação poderá passar no servidor escravo sem conexão com o servidor primário. Caso este tempo seja expirado, as informações do servidor escravo são consideradas desatualizadas, em certos casos, o servidor DNS pode parar de resolver nomes.
Minimum
Indica o tempo mínimo de resposta de um servidor de uma requisição de resolução de nomes.
NS
Lista o servidor de nomes para o domónio.
A
Mapeamento de nome para endereço
PTR
Mapeamento de endereço para nome
CNAME
Nome Canônico, serve como um aliases para um hostame já existente.
TXT
Informações
WKS
Well Known Services – Servidores conhecidos
HINFO
Host Information – Informações sobre o host.
MX
Mail Exchange – Servidor de e-mail, esta opção é seguida de um número, entre 0-65535, que determina a prioridade do serviço, quanto menor o número, maior a sua prioridade.


Com nossa zona criada, vamos configurar o arquivo de configuração geral do BIND, o /etc/named.conf, neste arquivo vamos encontrar a configuração do host que deverá ter a porta 53 aberta, por da serviços de DNS, e tanbém informações do servidor de DNS externo, onde o DNS server irá realizar as buscas.

Neste arquivo iremos inserir todas as zonas, criadas anteriormente e também vamos fazer a configuração global do DNS, na seção options.

Nesta seção existem várias opções configuráveis e todas elas podem ser encontradas em http://www.zytrax.com/books/dns/ch7/statements.html.

Citando:

#vi /etc/named.conf


Citando:

options {
directory “/var/named”;
listen-on {127.0.0.1; 192.168.0.1;};
forwarders {200.202.193.75; 200.202.193.76;};
};


Neste início configuramos três opções:

Directory
Indica qual diretório estão os arquivos de zona.

Listen-On
Nesta opção irão ser colocados os endereços IP das interfaces em que o DNS server irá responder, incluindo a interface de loopback. Lembrado que para usar o IPV6, a opção seria listen-on-v6.

Forwarders
Aqui irão ser colocados os endereços IP dos servidores externos, os servidores da provedora de internet, onde o servidor DNS irá realizar a busca para resolução de nomes. Neste exemplo o endereço IP é o servidor DNS da Velox.

Lembrando que para realizar a resolução de nomes, é necessária uma autenticação, que poderá ser encontrada no arquivo /etc/rndc.key, se não for inserido a chave de identificação neste arquivo, temos que inserir a opção apontando para este arquivo logo após às configurações globais:

Citando:

include “/etc/rndc.key”;


Depois de configuradas as opções globais, vamos configurar as zonas:

Citando:

zone “.” {
type hint;
file “named.ca”;
}

zone “0.0.127.in-addr.arpa” {
type master;
file “named.local”;
}

zone “centosbr.org” {
type master;
file “centosbr.org.hosts”
}


Nas zonas, definimos o nome da zona, seguido do tipo e do arquivo.

Os valores para a opção type são:

master
Indica que é um servidor mestre.

hint
Indica um servidor de cache.

slave
Indica um servidor escravo.

A zona “.”, definida inicialmente, faz referência ao arquivo named.ca que tem a lista dos principais servidores DNS espalhados no mundo.

A zona 0.0.127.in-addr.arpa é referente ao arquivo named.local, que contém a informação de resolução reversa.

E a última zona, centosbr.org é referente ao arquivo criado anteriormente, referente a zona de nossa rede interna.

Com o arquivo configurado, podemos inicializar o nosso servidor DNS.

Citando:

#service named start


Para parar o serviço:

Citando:

#service named stop


E para reinicializar o serviço:

Citando:

#service named restart


Nós podemos aumentar a segurança do nosso DNS Server utilizando as seções de acl e view.

Na seção acl nós iremos criar listas de endereços IP que poderão ser citados posteriormente nas views ou dentro das zonas.

Existem acls “especiais” já criadas pelo BIND, são elas:

none
Indica: nenhum host.

any
Indica todos os hosts.

[localhost]
Indica os endereços IP de todas as interfaces do DNS server. Por exemplo, se o servidor tiver uma interface com o IP 192.168.0.1, esta acl irá indicar o IP 192.168.0.1 e o 127.0.0.1.

localnets
Indicará todos os hosts da rede em que pertence o DNS Server. Se o DNS Server tiver apenas uma interface com o endereço IP 192.168.0.1 e a máscara 255.255.255.0, ou 192.168.0.1/24, esta acl indicará os hosts de 192.168.0.0 até 192.168.0.255 e também o 127.0.0.1.

Com a seção view podemos realizar uma configuração para várias zonas de uma só vez.

Vamos imaginar que nossa rede seja dividida em várias Vlans diferentes, cada Vlan indica um departamento.

DNS Server – 192.168.0.1
Vlan1 – 192.168.1.0/24
Vlan2 – 192.168.2.0/24
Vlan3 – 192.168.3.0/24

E queremos aumentar a segurança e a performance na resolução de nomes para essas Vlans. Para isso vamos criar uma acl contendo estas redes e uma view que irá conter as configurações de resolução de nomes das zonas.

Citando:

acl “rede_interna” {
192.168.1.0/24;
192.168.2.0/24;
192.168.3.0/24;
}

view “interna” {
match-clients {
“rede_interna”;}
recursion yes;

zone “vlan01” {
type master;
file “vlan01.hosts”;
}

zone “vlan02” {
type master;
file “vlan02.hosts”;
}

zone “vlan03” {
type master;
file “vlan03.hosts”
}
}

view “externa” {
match-clients {
“any”;
!”rede_interna”;}
recursion no;

zone “.” {
type hint ;
file “named.ca” ;
}
}


Note que habilitamos a opção recursion apenas na rede interna, lembrando que uma pesquisa recursiva obriga ao servidor entregar uma resposta direta, diferente da pesquisa interativa, onde o servidor poderá indicar o caminho do próximo servidor, caso não possua a resposta. Na rede “externa” que significa, todas as redes exceto a rede interna, a opção recursion ficará desabilitada, evitando tráfego desnecessário e futuros problemas.

Então nosso arquivo de configuração final, seria do tipo:

Citando:
#
# Arquivo /etc/named.conf
#
#
option {
directory “/var/named”
listen-on { 127.0.0.1; 192.168.0.1; }
forwarders { 200.202.193.75; 200.202.193.76; }
}
include “/etc/rndc.key”

acl “rede_interna” {
192.168.1.0/24;
192.168.2.0/24;
192.168.3.0/24;
}

view “interna” {
match-clients {
“rede_interna”;}
recursion yes;

zone “vlan01” {
type master;
file “vlan01.hosts”;
}

zone “vlan02” {
type master;
file “vlan02.hosts”;
}

zone “vlan03” {
type master;
file “vlan03.hosts”
}
}

view “externa” {
match-clients {
“any”;
!”rede_interna”;}
recursion no;

zone “.” {
type hint ;
file “named.ca” ;
}
}

Nenhum comentário: