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ÍNIOSO 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 SERVERO 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.
ResolversSão programas ou rotinas de bibliotecas que extraem as informações solicitadas aos servidores DNS.
Servidores DNSSã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.
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 ServerServidor primário do domínio, Possui autorização para resolução de nomes dentro de todo o domínio.
Secondary Master ServerServidor 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 ServerServidor escravo. Este servidor encaminho as requisições para uma lista conhecida de servidores de encaminhamento, porém não guarda nenhuma informação.
Forwarder ServerServidores de encaminhamento. Encaminha requisições para servidores remotos
Caching ServerRespondem à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ÇÃOA instalação do BIND pode ser feita por
Citando:
CONFIGURAÇÃOPara 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.confCitando:
Neste arquivo podemos informar ao resolver, quais serviços usar e em que ordem. Segue algumas opções do arquivo
host.conf.
OrderEspecifica a ordem em que os mecanismos de resolução de nomes serão tentados. Estes mecanismos podem ser:
Ex.: order hosts,bind
hostsTenta resolver o nome localmente através do arquivo
/etc/hostsbindSolicita a resolução de nomes a um servidor BIND
nisTenta a resolução de nomes através do protocolo NIS (Network Information Service).
AlertAlerta se houve alguma tentativa de “fingir” um endereço IP, esta tentativa ficará registrada através do recurso syslog.
Ex.: alert on
NoSpoofSe 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.
TrimNesta 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
MultiEsta opção terá efeito apenas na consulta
hosts e especifica se um host poderá ter mais de um endereço IP no arquivo
/etc/hostsEx.: 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:
DomainEspecifica 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
NameServerEspecifica 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
SearchQuando 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.caEste 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.localNeste arquivo esta a informação da zona local da máquina (localhost).
localhost.zoneEste é 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:
INServidor Internet
HSServidores hesiod
CHServidores chaosnet
No campo
tipo poderão ser usados os seguintes valores:
SOAStart Of Authority – Indica a autoridade para os dados do domínio em questão
@ (AT)Define a localização do domínio
SerialServe 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.
RefreshEste é o intervalo de tempo para a sincronização do servidor escravo com o primário, em segundos
RetryCaso o servidor primário pare seu funcionamento pelo tempo estipulado nesta opção, o servidor escravo tentará reativar a comunicação repentinamente.
ExpireTempo 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.
MinimumIndica o tempo mínimo de resposta de um servidor de uma requisição de resolução de nomes.
NSLista o servidor de nomes para o domónio.
AMapeamento de nome para endereço
PTRMapeamento de endereço para nome
CNAMENome Canônico, serve como um aliases para um hostame já existente.
TXTInformações
WKSWell Known Services – Servidores conhecidos
HINFOHost Information – Informações sobre o host.
MXMail 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:
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:
DirectoryIndica qual diretório estão os arquivos de zona.
Listen-OnNesta 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.
ForwardersAqui 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:
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:
masterIndica que é um servidor mestre.
hintIndica um servidor de cache.
slaveIndica 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:
Para parar o serviço:
Citando:
E para reinicializar o serviço:
Citando:
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:
noneIndica: nenhum host.
anyIndica 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.
localnetsIndicará 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” ;
}
}