Académique Documents
Professionnel Documents
Culture Documents
Artigo adaptado do link: http://www.debianfordummies.org/wiki/index.php/DFD_DNS_HOWTO
Boa parte da usabilidade da Internet vem da facilidade que temos para localizar um computador
conectado. Apesar da maioria dos computadores só conseguirem localizar outros através de
endereços IP, nós humanos podemos localizálos facilmente através de um nome inteligível. É o
que acontece, por exemplo, quando acessamos a página oficial do sistema operacional Linux
através do nome www.linux.org, ao invés de precisarmos usar o número 198.182.196.56 que, cá
entre nós, é bem mais feio. Esta conversão de nome para números é feita automaticamente
através do mecanismo de DNS (sigla de Domain Name System).
Vamos aprender aqui a configurar uma máquina em uma rede para saber localizar as demais
pelo nome, ou seja, servir de "telefonista" para nossa rede. Ela vai receber pedidos do tipo
"Estou querendo falar com raulseixas. Qual o endereço dele?" e vai responder "Para falar com o
maluco beleza, tente 10.1.1.4". Neste artigo vamos utilizar o programa named, que é parte do
pacote BIND, disponível em praticamente todas as distribuições Linux. Ele é o programa que vai
ficar rodando para receber requisições de mapeamento de nomes em endereços IP e, claro,
respondêlas adeqüadamente.
Instalação inicial do Bind9
Obter e instalar o named em sua máquina Debian é fácil. Basta procurar em seu gerenciador
de pacotes preferidos pelo pacote bind9. Não é obrigatório, mas é sempre bom obter a
documentação, que está no pacote bind9doc.
# aptget install bind9
# aptget install bind9doc
O bondoso aptget vai então nos mostrar algumas mensagens e instalar os pacotes que
queremos. Depois que ele completar seu trabalho, já teremos nosso servidor DNS funcionando.
Não foi fácil?
Para tirar a prova, podemos pedir a ele o endereço para alguns nomes. Para isso vamos usar o
dig, um programa que faz parte do pacote dnsutils. Poderíamos também editar o arquivo
/etc/resolv.conf para utilizar o novo servidor de nomes, mas é mais higiênico fazermos isso
somente no final, quando tudo estiver funcionando perfeitamente.
# aptget install dnsutils
# exit
$ dig www.linux.org @127.0.0.1
; <<>> DiG 9.2.4 <<>> www.linux.org @127.0.0.1
;; global options: printcmd
;; Got answer:
;; >>HEADER<< opcode: QUERY, status: NOERROR, id: 55879
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
;www.linux.org. IN A
;; ANSWER SECTION:
www.linux.org. 41122 IN A 198.182.196.56
;; AUTHORITY SECTION:
linux.org. 41122 IN NS ns0.aitcom.net.
linux.org. 41122 IN NS ns.invlogic.com.
;; Query time: 7 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Dec 11 01:45:26 2005
;; MSG SIZE rcvd: 104
O que pedimos foi para o programa dig obter o endereço IP da máquina de nome
www.linux.org, utilizando para isso o servidor de nomes localizado em 127.0.0.1 (este é o
endereço da máquina onde o comando foi executado, ou seja, seu próprio computador). Ele nos
respondeu que o endereço é 198.182.196.56 (olhe a seção ANSWER SECTION).
Note que não informamos ao nosso servidor em lugar nenhum o endereço IP da máquina
www.linux.org, mesmo assim ele conseguiu nos fornecer um número. Ele foi capaz de fazer
isso porque se comunicou com uma das máquinas chamadas de servidoresraiz. O endereço IP
dessas máquinas fica, em um sistema Debian, gravado em um arquivo chamado,
sugestivamente, de db.root.
O problema é que esses endereços podem mudar com o tempo, apesar disso não ser muito
freqüente. Da última vez que instalei o pacote bind9 , ele veio com um db.root de 2003.
Felizmente, é fácil atualizar o arquivo. Só precisamos usar o dig (se você não instalou ainda,
faça agora). Vamos pedir a ele que obtenha a localização atual dos servidoresraiz e vamos
gravar a resposta em um arquivo.
# # Só para ter certeza que estamos no lugar certo
# pwd
/etc/bind
# dig ns . @a.rootservers.net. > db.root.new
Isso vai gravar a resposta do servidor a.rootservers.net. no arquivo db.root.new. Se este
servidor não responder, tente um dos outros (b.rootservers.net, c.root.servers.net e assim por
diante). Se estiver curioso, você pode dar uma olhada no conteúdo do arquivo. O próximo passo
é substituir o arquivo antigo pelo novo e reiniciar o programa servidor de nomes para que ele leia
o novo arquivo. Note que essas instruções são para uma instalação Debian padrão, sua
configuração pode ser um pouco diferente.
# mv db.root db.root.old
# mv db.root.new db.root
# /etc/init.d/bind9 restart
Stopping domain name service: named.
Starting domain name service: named.
Com isso nosso servidor DNS já pode resolver os nomes dos computadores na Internet.
Precisamos disso porque vamos substituir o servidor DNS antigo (que deve ser uma máquina do
seu provedor de Internet) por um novo e queremos que ele continue sendo capaz de fazer o que
o antigo fazia. Porém essa configuração ainda não inclui os nomes das máquinas internas, para
estas ainda precisamos dos endereços IP. Para "batizar" nossas máquinas vamos precisar de
um domínio interno.
Configurando um Domínio
O serviço de nomes (DNS) é organizado hierarquicamente em domínios, deste modo isolase o
conjunto de nomes pertencentes a um domínio dos nomes de outro. O controlador do domínio
pode adicionar quaisquer nomes dentro deste domínio e não haverá perigo de colisão de nomes
acidental. Estes nomes podem ser subdomínios (nomes que aceitam mais nomes subordinados)
ou hosts (nomes de máquinas específicas, sem subordinados). Para ficar mais claro, vamos
tomar como exemplo o domínio debianfordummies.org. Subordinados a este domínio podem
ser registrados vários subnomes como, por exemplo, o www.debianfordummies.org (que
provavelmente é o endereço que você acessou), o ftp.debianfordummies.org e o
mail.debianfordummies.org. Mais informações sobre domínios podem ser encontradas na
RFC 1035 (cuidado ao clicar neste link, leva a conteúdo extremamente interessante mas
também extremamente técnico). Vamos usar um domínio para identificar nossas máquinas.
Neste exemplo, todas elas estarão abrigadas sob o mesmo domínio, mas é fácil registrar mais
de um domínio uma vez que você pega o jeito. Recomendase utilizar um domínio controlado por
você, para evitar bloquear acidentalmente outro domínio externo. Daqui em diante vamos utilizar
um domínio chamado de meudominio.org.br, que ainda não existe (pelo menos não existia
quando este artigo foi escrito). Para fazer isso no nosso sistema Debian, vamos precisar
modificar um pouco o conteúdo do diretório /etc/bind . Primeiramente vamos adicionar uma
zona correspondente ao nosso domínio, adicionando o trecho abaixo ao final do arquivo
named.conf.local
zone "meudominio.org.br" {
type master;
file "/etc/bind/db.meudominio";
};
A segunda linha (type master) diz ao named (o programa que estamos usando como servidor
de nomes, lembra?) que ele possui os endereços para a zona meudominio.org.br e não
precisa consultar ninguém para responder por ela. A terceira indica o caminho do arquivo no
sistema de arquivos local onde ele vai encontrar o mapeamento de nomes para endereços IP. É
este arquivo que vamos criar agora.
Digamos que na nossa rede temos serviços web e ftp localizados na máquina 192.168.1.10, um
servidor de nomes na máquina 192.168.1.11 e um serviço de email numa terceira máquina
192.168.1.12. Esquematizando, temos o mapeamento abaixo.
ftp > 192.168.1.10 > servidor ftp
www > 192.168.1.10 > servidor web
ns > 192.168.1.11 > servidor dns secundario
mail > 192.168.1.12 > servidor de email
O que precisamos fazer é traduzir este mapeamento para a linguagem entendida pelo named.
Abra seu editor favorito e crie o arquivo /etc/bind/db.meudominio com o seguinte conteúdo.
$TTL 86400
@ IN SOA ns.meudominio.org.br. minhamaquina.meudominio.org.br. (
1130118145 ; Serial
10800 ; Refresh
3600 ; Retry
604800 ; Expire
86400 ) ; Minimum
meudominio.org.br. IN NS ns.meudominio.org.br.
ftp.meudominio.org.br. IN A 192.168.1.10
www.meudominio.org.br. IN A 192.168.1.10
ns.meudominio.org.br. IN A 192.168.1.11
meudominio.org.br. IN MX 10 mail.meudominio.org.br.
mail.meudominio.org.br. IN A 192.168.1.10
As quatro últimas linhas especificam nosso mapeamento, exatamente como definimos
anteriormente. Sempre que quisermos adicionar novos nomes, só precisamos editar este
arquivo. Se, por exemplo, quisermos adicionar endereços para as máquinas dos personagens
imaginários André e Beto, localizadas nos IPs 192.168.1.17 e 192.168.1.18, respectivamente,
basta adicionarmos ao final do arquivo /etc/bind/db.meudominio o trecho abaixo.
andre.meudominio.org.br. IN A 192.168.1.17
beto.meudominio.org.br. IN A 192.168.1.18
Observe ainda que é possível especificar que o mesmo IP responderá por mais de um nome. A
máquina 192.168.1.10 do nosso exemplo está respondendo pelos nomes ftp e www
simultaneamente. O contrário, especificar vários endereços para o mesmo nome, também é
possível. Para maiores detalhes, consulte o manual do bind .
Agora que terminamos de editar nossos arquivos é hora de fazer uma revisão rápida neles e
reiniciar o serviço de nomes, para que ele carregue os novos dados.
# /etc/init.d/bind9 restart
Stopping domain name service: named.
Starting domain name service: named.
Para testar nossa configuração, vamos usar novamente o dig. Do mesmo modo que
consultamos anteriormente o endereço para uma máquina na rede externa (a www.linux.org ),
agora vamos consultar o endereço para um nome de máquina na rede interna.
$ dig ftp.meudominio.org.br @127.0.0.1
; <<>> DiG 9.2.4 <<>> ftp.meudominio.org.br @127.0.0.1
;; global options: printcmd
;; Got answer:
;; >>HEADER<< opcode: QUERY, status: NOERROR, id: 41734
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;ftp.meudominio.org.br. IN A
;; ANSWER SECTION:
ftp.meudominio.org.br. 86400 IN A 192.168.1.10
;; AUTHORITY SECTION:
meudominio.org.br. 86400 IN NS ns.meudominio.org.br.
;; ADDITIONAL SECTION:
ns.meudominio.org.br. 86400 IN A 192.168.1.11
;; Query time: 6 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Dec 27 10:08:05 2005
;; MSG SIZE rcvd: 100
Configuração das máquinas cliente
Para ser capaz de resolver nomes uma máquina precisa ter acesso a um servidor de nomes.
Uma forma bastante comum de dar este acesso é gravar estaticamente o endereço do servidor
de nomes na máquina. Também há meios de informar o endereço do servidor de nomes
dinamicamente, quando a máquina entra na rede.
Neste ponto do artigo já temos um servidor de nomes funcionando, mas nossas máquinas na
rede ainda utilizam o servidor de nomes antigo. Se tentarmos acessar algum dos nomes sob
nosso domínio recémcriado, não vamos obter o endereço desejado simplesmente porque o
servidor que está sendo consultado não sabe da existência desses nomes.
Considerando que nosso servidor do exemplo está no endereço 192.168.1.11, podemos usar o
dig novamente para testar a conexão das outra máquinas da rede ao servidor DNS. O comando
é o mesmo que executamos anteriormente, mas agora vamos tentar de outra máquina da rede e
não do próprio servidor. Por isso não podemos mais usar seu endereço de retorno (o 127.0.0.1)
$ dig ftp.meudominio.org.br @192.168.1.11
; <<>> DiG 9.2.4 <<>> ftp.meudominio.org.br @192.168.1.11
;; global options: printcmd
;; Got answer:
;; >>HEADER<< opcode: QUERY, status: NOERROR, id: 41734
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;ftp.meudominio.org.br. IN A
;; ANSWER SECTION:
ftp.meudominio.org.br. 86400 IN A 192.168.1.10
;; AUTHORITY SECTION:
meudominio.org.br. 86400 IN NS ns.meudominio.org.br.
;; ADDITIONAL SECTION:
ns.meudominio.org.br. 86400 IN A 192.168.1.11
;; Query time: 7 msec
;; SERVER: 192.168.1.11#53(192.168.1.11)
;; WHEN: Tue Dec 27 13:24:18 2005
;; MSG SIZE rcvd: 100
Uma resposta parecida com esta indica que o servidor está visível externamente. Só precisamos
configurar as demais máquinas para utilizar o novo servidor como resolvedor de nomes.
Para redirecionar a resolução de nomes de um sistema Debian, basta modificar o arquivo
/etc/resolv.conf. Outros sistemas precisam ser configurados de outras formas, consulte sua
documentação para maiores informações. Provavelmente seu resolv.conf parece com isso
aqui.
search
nameserver 198.41.0.4
A cláusula nameserver especifica o endereço do servidor de nomes a ser utilizado pela
máquina. Podemos trocar ou adicionar o endereço do nosso novo servidor ao topo da lista.
Quando algum nome precisar ser resolvido, os servidores serão consultados em seqüência e a
resposta do primeiro será utilizada. O novo resolv.conf vai ficar mais ou menos assim.
search
nameserver 192.168.1.11
nameserver 198.41.0.4
Agora já podemos tentar executar um ping para as máquinas da rede utilizando seus nomes, ao
invés dos endereços. Outra forma de testar a nova configuração é executar o dig sem o
parâmetro do servidor de nomes (a parte da arroba), assim ele vai utilizar o servidor DNS padrão
do sistema.
Para facilitar ainda mais nossa vida, podemos mexer ainda na cláusula search. Esta cláusula
indica em quais domínios os nomes serão procurados, em ordem. Basicamente o sistema de
resolução de nomes vai colocar o sufixo do domínio automaticamente quando tentamos buscar
um nome qualquer. Ou seja, se adicionarmos o nosso domínio aqui, podemos nos referenteciar
às nossas máquinas apenas pelo primeiro nome como ftp, www ou andre. Não precisaremos
mais utilizar o nome completo. O resolv.conf finalmente fica assim.
search meudominio.org.br
nameserver 192.168.1.11
nameserver 198.41.0.4
A lista anterior estava vazia, isso significa que nenhuma busca em domínios era feita, por isso os
hosts precisavam ser especificados com nome e sobrenome. Mas agora nosso domínio está
sendo usado, por isso agora podemos escrever somente ping ftp ou digitar na barra do nosso
navegador apenas www.
Esta foi uma pequena introdução ao DNS, na verdade nem arranhamos a superfície direito. Para
quem quiser se aprofundar, aí estão algumas referências.
Configurando DNS Reverso
O DNS reverso é um meio de que outras maquinas podem ter certeza de que você é você, por
exemplo, é normal servidores de email, checarem se o seu dns é mesmo valido, um exemplo pra
voce ver como isso funciona seria usando o comando host
host terra.com.br
ele retornará a seguinte saida
terra.com.br has address 200.176.3.142
fazendo o contrario,
host 200.176.3.142
obtemos o seguinte resultado
142.3.176.200.inaddr.arpa domain name pointer www.terra.com.br.
Então esse é o dns reverso
adicione ao fim do arquivo, a seguinte entrada
zone "1.168.192.inaddr.arpa" {
type master;
file "/etc/bind/db.11";
}
note que se usamos o ip 192.168.1.11 no nosso servidor, então a zone será 1.168.192.in
addr.arpa, isso corresponde ao ip ao contrario sem o ultimo numero. Bom, aqui fazemos
referencia ao arquivo db.11, então precisamos crialo e dentro dele e entraremos com o seguinte
endereço
;
; BIND reverse data file for meudominio.org.br
;
$TTL 604800
@ IN SOA meudominio.org.br. ns.meudominio.org.br. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
IN NS meudominio.org.br.
11 IN PTR ns.meudominio.org.br.
olhando com atenção nas duas ultimas linhas, podemos ver o seguinte
IN NS meudominio.org.br.
é o dominio principal
11 IN PTR ns.meudominio.org.br.
o ip e o host.dominio da maquina
agora que você configurou, você pode reiniciar o bind
/etc/init.d/bind9 restart
agora para testar, vamos usar o comando host
host ns.meudominio.org.br
ns.meudominio.org.br has address 192.168.1.11
host 192.168.1.11
11.1.168.192.inaddr.arpa domain name pointer ns.meudominio.org
viu, agora você tem um reverso de seus endereços, você pode usar também, o mesmo arquivo
para vários outros hosts, como no exemplo abaixo:
11 IN PTR ns.meudominio.org.br.
12 IN PTR www.meudominio.org.br.
13 IN PTR mail.meudominio.org.br.