COMO FAZER DNS Nicolai Langfeldt janl@math.uio.no Traduzido e Revisado por Conectiva Informática, info@conectiva.com.br, no dia 30 de Março de 1999. v2.1.1, 12 de novembro de 1998 COMO FAZER para facilitar a vida do administrador do DNS. ______________________________________________________________________ Índice geral 1. Preâmbulo 1.1 Aspectos Legais 1.2 Créditos e Pedidos de Ajuda 1.3 Dedicatória 2. Introdução. 3. Um Servidor de Nomes Somente Para Cache. 3.1 Iniciando o named 4. Um Domínio 4.1 Mas primeiro um pouco de teoria 4.2 Nosso Próprio Domínio 4.3 A zona reversa 5. Um Exemplo de Domínio Real 5.1 /etc/named.conf (ou /var/named/named.conf) 5.2 /var/named/root.hints 5.3 /var/named/zone/127.0.0 5.4 /var/named/zone/land-5.com 5.5 /var/named/zone/206.6.177 6. Manutenção 7. Converter da versão 4 para versão 8 8. Perguntas e Respostas 9. Como tornar-se um administrador de DNS. ______________________________________________________________________ 11.. PPrreeââmmbbuulloo Palavras chaves: DNS, bind, bind-4, bind-8, servidor de nomes, discagem, ppp, slip, isdn, Internet, domínio, nome de máquina, máquinas, resolução, named. 11..11.. AAssppeeccttooss LLeeggaaiiss (C)direitos autorais 1995 Nicolai Langfeldt. Não é permitido modificar os direitos autorais. Pode ser distribuído livremente, desde que seja preservada a indicação dos direitos autorais originais. 11..22.. CCrrééddiittooss ee PPeeddiiddooss ddee AAjjuuddaa Gostaria de agradecer a Arnt Gulbrandsen, que leu o rascunho deste trabalho inúmeras vezes e forneceu inúmeras sugestões úteis. Gostaria de agradecer ainda às pessoas que têm mandado sugestões e notas via e- mail. Este nunca será um documento acabado dado à multiplicidade de detalhes do assunto, então por favor envie-me mensagens descrevendo seus problemas e seus sucessos e isto pode tornar este COMO FAZER melhor. Ao enviar dinheiro, comentários e/ou perguntas, escreva para janl@math.uio.no. Caso espere uma resposta, por favor seja cortês _c_e_r_t_i_f_i_c_a_n_d_o_-_s_e que o endereço de retorno está correto e funcional. Também, ppoorr ffaavvoorr leia a seção de ``Perguntas e Respostas'' antes de enviar uma mensagem. 11..33.. DDeeddiiccaattóórriiaa Este COMO FAZER é dedicado a Anne Line Norheim Langfeldt. Embora ela provavelmente nunca o leia, pois afinal ela não é este tipo de garota. 22.. IInnttrroodduuççããoo.. OO qquuee éé ee oo qquuee nnããoo éé.. Para iniciantes, DNS é o Servidor de Nomes do Domínio. O DNS converte os nomes das máquinas para números IP, que são os endereços das máquinas, mapeando de nome para endereço e de endereço para nome. Este COMO FAZER documenta como definir tais mapeamentos usando o sistema Linux. Um mapeamento é simplesmente uma associação entre duas informações, neste caso um nome de máquina, como ftp.linux.org, e o número IP da máquina, como por exemplo 199.249.150.4. DNS é, para os não iniciados (você), uma das áreas mais opacas da administração de rede. Este COMO FAZER tentará clarificar alguns conceitos e aspectos sobre este tema. Ele descreve como configurar um nome do servidor DNS _s_i_m_p_l_e_s. Começando com um único servidor de cache e seguindo até a configuração de um servidor primário DNS para um domínio. Para configurações mais complexas pode-se checar a seção de ``Perguntas e Respostas'' deste documento. Caso não esteja lá descrito, pode ser necessário _l_e_r a documentação que acompanha os fontes. Esclareceremos em que consiste esta documentação no ``último capítulo''. Antes de começar, há que se configurar uma máquina para que ela possa se conectar interna e externamente e assim permitir as conexões à rede. Deve ser possível executar o comando telnet 127.0.0.1 e ter acesso à máquina local (teste agora!). É necessário ainda ter-se arquivos de exemplo /etc/nsswitch.conf (ou /etc/host.conf), /etc/resolv.conf e /etc/hosts como ponto de partida, uma vez que não explicaremos aqui a sua função. Caso ainda não se tenha tudo isso configurado e operando, o documento NET-3 ou o COMO FAZER PPP explicam como configurá-los. Ao nos referirmos a 'máquina local', estamos referenciando à máquina na qual se está tentando configurar o DNS e não a qualquer outra máquina que se possa ter à disposição e que esteja conectada à rede. Presumimos que esta máquina não está atrás de algum firewall que bloqueie as pesquisas de nomes. Caso seja necessária alguma configuração especial, por favor veja a seção de ``Perguntas e Respostas''. O serviço de nomes no Unix é feito por um programa servidor denominado named. Ele é integrante do pacote de bind que é coordenado por Paul Vixie para o Consórcio de Programas Para a Internet. O Servidor de nomes está incluído na maioria das distribuições Linux e é usualmente instalado como /usr/sbin/named. Caso se tenha um named à disposição pode-se usá-lo; caso contrário é possível obter-se um binário a partir de um site ftp Linux, ou conseguir os fontes mais recentes em ftp.isc.org:/isc/bind/src/cur/bind-8/. Este COMO FAZER trata sobre o bind em sua versão 8. A versão antiga do COMO FAZER, que tratava sobre o bind 4, ainda está ainda disponível em http://www.math.uio.no/~janl/DNS/ no caso de se necessitar utilizar o bind 4. Caso a página do manual sobre o servidor de nomes fale sobre named.conf então tem-se disponível o bind 8, caso mencione o named.boot então trata-se do bind 4. Caso se tenha o 4 e se esteja com problemas de segurança, deve-se atualizar para a versão 8 mais recente. O DNS é um banco de dados distribuído por toda a rede. É necessário ter-se extremo cuidado com tudo o que for colocado nele. Ao se colocar dados sem significado, outros utilizarão estes dados e certamente tudo ficará um pouco "estranho". O DNS deve estar sempre atualizado e arrumado, evitando-se assim problemas desagradáveis. Deve-se aprender a usá-lo, administrá-lo, depurá-lo para tornar-se um bom administrador da rede, evitando sobrecargas geradas por problemas de administração. Neste documento são afirmadas categoricamente algumas coisas que não são completamente verdadeiras (sendo então pelo menos meias verdades). Tudo em nome da simplificação. As coisas (provavelmente!) funcionarão quando o leitor acreditar no que está dito! DDiiccaa:: Devem ser feitas cópias de segurança de todos os arquivos. É aconselhável, ainda, que elas sejam alteradas de tempos em tempos. Assim se depois de todas as tentativas, nada funcionar, pode-se retornar à situação anterior. 33.. UUmm SSeerrvviiddoorr ddee NNoommeess SSoommeennttee PPaarraa CCaacchhee.. UUmmaa pprriimmeeiirraa aapprrooxxiimmaaççããoo àà ccoonnffiigguurraaççããoo ddoo DDNNSS,, qquuee ppooddee sseerr mmuuiittoo úúttiill ppaarraa uussuuáárriiooss qquuee uuttiilliizzaamm lliinnhhaass ddiissccaaddaass.. Um servidor de nomes somente para cache deve ser capaz de encontrar as respostas às pesquisas de nomes e endereços e deve ainda guardar as respostas, para a próxima em que sejam necessárias. Isto diminuirá o tempo de espera significativamente, especialmente quando se tem uma conexão lenta. Inicialmente é necessário ter-se um arquivo /etc/named.conf, o qual será lido quando o servidor de nomes for inicializado. Por enquanto ele pode conter simplesmente: ______________________________________________________________________ // Configuração do arquivo para um servidor de nomes somente para cache options{ directory "/var/named"; // Não comentar isto pode ajudar caso se tenha um firewall presente // e as coisas não estejam funcionando: // endereço de pesquisa: porta 53; }; zone "." { type hint; file "rott.hints "; }; zone "0.0.127.in-addr.arpa" { type master; file "pz/127.0.0"; }; ______________________________________________________________________ A linha `directory' indica onde os arquivos devem estar localizados. Todos os arquivos subseqüentes serão relativos a este. Assim pz é um diretório sob /var/named, ou seja estará localizado em /var/named/pz. /var/named é o diretório definido pelo _P_a_d_r_ã_o _d_e _S_i_s_t_e_m_a_s _d_e _A_r_q_u_i_v_o_s _L_i_n_u_x. O arquivo denominado /var/named/root.hints deve conter: ______________________________________________________________________ . 6D IN NS G.ROOT-SERVERS.NET. . 6D IN NS J.ROOT-SERVERS.NET. . 6D IN NS K.ROOT-SERVERS.NET. . 6D IN NS L.ROOT-SERVERS.NET. . 6D IN NS M.ROOT-SERVERS.NET. . 6D IN NS A.ROOT-SERVERS.NET. . 6D IN NS H.ROOT-SERVERS.NET. . 6D IN NS B.ROOT-SERVERS.NET. . 6D IN NS C.ROOT-SERVERS.NET. . 6D IN NS D.ROOT-SERVERS.NET. . 6D IN NS E.ROOT-SERVERS.NET. . 6D IN NS I.ROOT-SERVERS.NET. . 6D IN NS F.ROOT-SERVERS.NET. G.ROOT-SERVERS.NET. 5w6d16h IN A 192.112.36.4 J.ROOT-SERVERS.NET. 5w6d16h IN A 198.41.0.10 K.ROOT-SERVERS.NET. 5w6d16h IN A 193.0.14.129 L.ROOT-SERVERS.NET. 5w6d16h IN A 198.32.64.12 M.ROOT-SERVERS.NET. 5w6d16h IN A 202.12.27.33 A.ROOT-SERVERS.NET. 5w6d16h IN A 198.41.0.4 H.ROOT-SERVERS.NET. 5w6d16h IN A 128.63.2.53 B.ROOT-SERVERS.NET. 5w6d16h IN A 128.9.0.107 C.ROOT-SERVERS.NET. 5w6d16h IN A 192.33.4.12 D.ROOT-SERVERS.NET. 5w6d16h IN A 128.8.10.90 E.ROOT-SERVERS.NET. 5w6d16h IN A 192.203.230.10 I.ROOT-SERVERS.NET. 5w6d16h IN A 192.36.148.17 F.ROOT-SERVERS.NET. 5w6d16h IN A 192.5.5.241 ______________________________________________________________________ Este arquivo descreve o nome dos servidores raiz no mundo. Este conteúdo pode mudar com o passar do tempo e _t_e_m _q_u_e ser atualizado permanentemente. Veja a ``seção de manutenção'' para saber como mantê-lo atualizado. A próxima seção em named.conf é zone. Explicaremos o seu uso num capítulo adiante. Por hora somente façamos deste um arquivo chamado 127.0.0 no subdiretório pz: ______________________________________________________________________ @ IN SOA ns.linux.bogus.hostmaster.linux.bogus. ( 1 ; Serial 8H ; Atualização 2H ; Tentativas 1W ; Expiração 1D) ; TTL mínimo NS ns.linux.bogus. 1 PTR localhost ______________________________________________________________________ Em seguida, será necessário um arquivo /etc/resolv.conf com o seguinte conteúdo: ______________________________________________________________________ search subdomínio.seu\_domínio.edu.br seu\_domínio.edu.br nome\_do\_servidor 127.0.0.1 ______________________________________________________________________ A linha `search' especifica que o domínio deve ser pesquisado para qualquer nome de máquina com a qual se queira conectar. A linha `nameserver' especifica o endereço do servidor de nomes. Neste caso, a própria máquina, uma vez que é nela que o programa named é executado (já que 127.0.0.1 foi informado, não importando se a máquina tem também outro endereço). Caso se queira indicar vários servidores de nomes, deve-se criar uma linha `nameserver' para cada um deles. (Nota: O programa named nunca lê este arquivo, e sim o resolvedor que utilizar o named). Vamos ilustrar um pouco mais a função deste arquivo: caso um cliente tente procurar por itamaraca, então itamaraca.subdomínio.seu_domínio.edu.br será a primeira tentativa, então será tentado itamaraca.seu_domínio.edu.br e finalmente somente itamaraca. Se um cliente tentar procurar metalab.unc.edu, metalab.unc.edu.subdomínio.seu_domínio.edu.br será tentado inicialmente (sim, não faz muito sentido, mas é o jeito que ele funciona), então metalab.unc.edu.seu_domínio.edu.br, e finalmente metalab.unc.edu. Caso se queira colocar muitos domínios na linha search, isso pode provocar uma sobrecarga nos tempos de pesquisa. O exemplo presume que a máquina pertence ao domínio subdomínio.seu_domínio.edu.br, sendo provavelmente o servidor de nomes nome_da_máquina.subdomínio.seu_domínio.edu.br. A linha de busca não deve conter o TLD (Domínio Raiz `edu.br' neste caso). Caso seja necessário conectar-se com freqüência a máquinas de outros domínios, deve-se acrescentar aqueles domínios à linha de busca, como por exemplo: ______________________________________________________________________ search subdomínio.seu_domínio.edu.br seu_domínio.edu.br outro_domínio.com.br ______________________________________________________________________ e assim por diante. Obviamente deve-se utilizar nomes reais de domínios. Os aqui colocados servem somente como exemplos. Por favor atente para a falta de pontos no final dos nomes dos domínios. A seguir, dependendo da versão da biblioteca libc, tanto pode ser necessário atualizar o /etc/nsswitch.conf ou o /etc/host.conf. Caso se tenha o nsswitch.conf este será utilizado, caso contrário , atualizaremos o host.conf. //eettcc//nnsssswwiittcchh..ccoonnff Este é um arquivo longo que especifica onde podem ser obtidos diferentes tipos de dados, de que arquivos e de qual base de dados. Usualmente contém comentários úteis no topo, que podem ser lidos agora. Depois disso, deve ser encontrada uma linha que comece com `hosts:', onde se pode ler: ______________________________________________________________________ hosts: files dns ______________________________________________________________________ Caso não haja nenhuma linha iniciada com `hosts:' então deve ser incluída a linha acima. Ela indica que os programas devem primeiramente pesquisar o arquivo /etc/hosts, e após então verificar o DNS de acordo com o configurado no arquivo resolv.conf. //eettcc//hhoosstt..ccoonnff Provavelmente contém várias linhas, uma delas deve começar com order e deve ter o seguinte: ______________________________________________________________________ order hosts, bind ______________________________________________________________________ Se não houver nenhuma linha `order', então uma deve ser criada. Esta linha indica que a resolução de nomes de máquinas deve pesquisar inicialmente no arquivo /etc/hosts, e depois pesquisar junto ao servidor de nomes (definido em resolv.conf como 127.0.0.1). Estes dois últimos arquivos estão documentados na página de manual do utilitário resolver(8) (para acessá-la execute man 8 resolv) na maioria das distribuições Linux. Aquela página do manual é clara e em nossa opinião, todos devem lê-la (especialmente os administradores de DNS). Faça-o agora caso você seja um daqueles que diz para si mesmo: "Eu vou ler mais tarde", mas nunca o faz. 33..11.. IInniicciiaannddoo oo nnaammeedd Após tudo isto é hora de iniciar o servidor de nomes. Caso se esteja usando uma conexão discada, primeiro deve-se estabelecer a conexão. Deve-se digitar então `ndc start', sem opções. Caso isto não funcione, pode-se tentar `/usr/sbin/ndc start'. Caso isto não funcione, deve-se verificar a seção ``Perguntas e Respostas''. Agora é possível testar a configuração. Ao se visualizar o arquivo de mensagens syslog (usualmente chamado /var/adm/messages; podem ser examinados também o diretório /var/log e o arquivo syslog) ao se iniciar o servidor de nomes (executando-se tail -f/var/log/messages ) deve-se obter algo como: (linhas terminadas em \ continuam na linha seguinte) Feb 15 01:26:17 roke named[6091]: starting. named 8.1.1 Sat Feb 14 \ 00:18:20 MET 1998 ^Ijanl@roke.uio.no:/var/tmp/bind-8.1.1/src/bin/named Feb 15 01:26:17 roke named[6091]: cache zone "" (IN) loaded (serial 0) Feb 15 01:26:17 roke named[6091]: master zone "0.0.127.in-addr.arpa" \ (IN) loaded (serial 1) Feb 15 01:26:17 roke named[6091]: listening [127.0.0.1].53 (lo) Feb 15 01:26:17 roke named[6091]: listening [129.240.230.92].53 (ippp0) Feb 15 01:26:17 roke named[6091]: Forwarding source address is [0.0.0.0].1040 Feb 15 01:26:17 roke named[6092]: Ready to answer queries. Se houver alguma mensagem de erro, ela deve ser examinada. O named indicará o arquivo onde o problema se encontra (ou named.conf. ou root.hints, esperamos). O servidor de nomes deve ser finalizado e os arquivos devem ser corrigidos. Agora é hora de iniciar o nslookup para examinar o trabalho realizado até aqui. $ nslookup default Server: localhost Address: 127.0.0.1 > Caso este seja o resultado obtido, parabéns, está funcionando. Esperamos que sim. Caso se obtenha um resultado diferente, deve-se retornar e verificar todos os passos. Cada vez que se altere o arquivo named.conf será necessário reiniciar o servidor de nomes usando o comando ndc restart. Agora podemos fazer pesquisas no sistema. Podemos procurar por alguma máquina próxima; A pat.uio.no está próxima a mim na Universidade de Oslo: > pat.uio.no Server: localhost Address: 127.0.0.1 Name: pat.uio.no Address: 129.240.130.16 O nslookup agora perguntou ao seu servidor de nomes para procurar a máquina pat.uio.no. Este contactou uma dos servidores de nomes listados no arquivo root.hints , e perguntou a um deles qual o caminho para a máquina desejada. Pode levar bem pouco tempo antes de se obter o resultado, enquanto named procura todos os domínios definidos em /etc/resolv.conf. Ao se pesquisar novamente, tem-se: > pat.uio.no Server: localhost Address: 127.0.0.1 Non-authoritative answer: Name: pat.uio.no Address: 129.240.2.50 Note a linha `Non-authoritative answer:' que obtivemos desta vez. Isto indica que o servidor de nomes não saiu pela rede para perguntar sobre a máquina desejada. Ao invés disto procurou em seu cache e encontrou-o lá. Mas a informação do cache _p_o_d_e estar desatualizada (antiga). Então se está informado deste perigo (muito pequeno) quando o sistema informa `resposta Não autorizada:'. Quando o nslookup disser isto pela segunda vez para a mesma máquina, pode-se estar certo de que o cache está funcionando e fornecendo a informação certa. Pode sair-se do comando nslookup digitando-se `exit'. Agora que sabemos como configurar um servidor de nomes de cache, aproveite para tomar uma cerveja, leite, ou qualquer coisa que se queira para comemorar este fato memorável. 44.. UUmm DDoommíínniioo SSiimmpplleess .. CCoommoo ccoonnffiigguurraarr uumm ddoommíínniioo pprróópprriioo.. 44..11.. MMaass pprriimmeeiirroo uumm ppoouuccoo ddee tteeoorriiaa Antes de _r_e_a_l_m_e_n_t_e começarmos esta seção, forneceremos alguns ensinamentos sobre o funcionamento do DNS; é preciso lê-los porque é fundamental para um administrador de rede. Caso não se queira, deve-se pelo menos pesquisá-los rapidamente, até chegar aonde se quer ir no arquivo named.conf. DNS é uma sistema hierárquico. O mais alto nível é representado por `.' e denominado "raiz". Sob "." há diversos Domínios de Alto Nível (TLDs), sendo os mais conhecidos ORG, COM, EDU e NET, mas existem muitos mais. Ao se procurar uma máquina, a pesquisa ocorre recursivamente dentro da hierarquia, começando no topo. Caso se queira descobrir o endereço de prep.ai.mit.edu, o servidor de nomes local tem que encontrar um nome de servidor que responda pelo domínio edu. Ele pergunta a um servidor . (ele já conhece os servidores ., a partir do arquivo root.hints), e o servidor . fornecerá uma lista dos servidores do domínio edu: $ nslookup Default Server: localhost Address: 127.0.0.1 Começaremos perguntando por um servidor raiz: > server c.root -servers.net. Default Server: c.root -servers.net Address: 192.33.4.12 A seguir definiremos o tipo de pesquisa que desejamos fazer. Neste caso NS (registros de servidores de nomes): > set q=ns A seguir perguntaremos pelos servidores que respondem pelo domínio edu: > edu. O ponto após edu é significativo. Ele indica ao servidor que estamos pesquisando os servidores sob os quais o domínio edu está configurado (isto de alguma maneira simplifica a busca): edu nome do servidor = A.ROOT-SERVERS.NET edu nome do servidor = H.ROOT-SERVERS.NET edu nome do servidor = B.ROOT-SERVERS.NET edu nome do servidor = C.ROOT-SERVERS.NET edu nome do servidor = D.ROOT-SERVERS.NET edu nome do servidor = E.ROOT-SERVERS.NET edu nome do servidor = I.ROOT-SERVERS.NET edu nome do servidor = F.ROOT-SERVERS.NET edu nome do servidor = G.ROOT-SERVERS.NET A.ROOT-SERVERS.NET endereço na internet = 198.41.0.4 H.ROOT-SERVERS.NET endereço na internet = 128.63.2.53 B.ROOT-SERVERS.NET endereço na internet = 128.9.0.107 C.ROOT-SERVERS.NET endereço na internet = 192.33.4.12 D.ROOT-SERVERS.NET endereço na internet = 128.8.10.90 E.ROOT-SERVERS.NET endereço na internet = 192.203.230.10 I.ROOT-SERVERS.NET endereço na internet = 192.36.148.17 F.ROOT-SERVERS.NET endereço na internet = 192.5.5.241 G.ROOT-SERVERS.NET endereço na internet = 192.112.36.4 A resposta nos indica que *.root-servers.net serve edu., podemos então continuar perguntando, por exemplo ao servidor C.ROOT-SERVERS.NET. Agora queremos saber quem serve o próximo nível do nome da máquina: mit.edu.: > mit.edu. Server: c.root-servers.net Address: 192.33.4.12 Non-authoritative answer: mit.edu nameserver = W20NS.mit.edu mit.edu nameserver = BITSY.mit.edu mit.edu nameserver = STRAWB.mit.edu Authoritative answers can be found from: W20NS.mit.edu internet address = 18.70.0.160 BITSY.mit.edu internet address = 18.72.0.3 STRAWB.mit.edu internet address = 18.71.0.151 A resposta indica que strawb, w20ns e bitsy servem o domínio mit. Vamos selecionar um deles e perguntar-lhe sobre ai.mit.edu: > servidor W20NS.mit.edu. Os nomes das máquinas não são sensíveis a maiúsculas e minúsculas, mas sugerimos o uso do mouse para cortar e colar como estão na tela. Servidor: W20NS.mit.edu Endereço: 18.70.0.160 > ai.mit.edu. Server: W20NS.mit.edu Address: 18.70.0.160 Non-authoritative answer: ai.mit.edu nameserver = ALPHA-BITS.AI.MIT.EDU ai.mit.edu nameserver = GRAPE-NUTS.AI.MIT.EDU ai.mit.edu nameserver = TRIX.AI.MIT.EDU ai.mit.edu nameserver = MUESLI.AI.MIT.EDU ai.mit.edu nameserver = LIFE.AI.MIT.EDU ai.mit.edu nameserver = BEET-CHEX.AI.MIT.EDU ai.mit.edu nameserver = MINI-WHEATS.AI.MIT.EDU ai.mit.edu nameserver = COUNT-CHOCULA.AI.MIT.EDU ai.mit.edu nameserver = MINTAKA.LCS.MIT.EDU Authoritative answers can be found from: AI.MIT.EDU nameserver = ALPHA-BITS.AI.MIT.EDU AI.MIT.EDU nameserver = GRAPE-NUTS.AI.MIT.EDU AI.MIT.EDU nameserver = TRIX.AI.MIT.EDU AI.MIT.EDU nameserver = MUESLI.AI.MIT.EDU AI.MIT.EDU nameserver = LIFE.AI.MIT.EDU AI.MIT.EDU nameserver = BEET-CHEX.AI.MIT.EDU AI.MIT.EDU nameserver = MINI-WHEATS.AI.MIT.EDU AI.MIT.EDU nameserver = COUNT-CHOCULA.AI.MIT.EDU AI.MIT.EDU nameserver = MINTAKA.LCS.MIT.EDU ALPHA-BITS.AI.MIT.EDU internet address = 128.52.32.5 GRAPE-NUTS.AI.MIT.EDU internet address = 128.52.36.4 TRIX.AI.MIT.EDU internet address = 128.52.37.6 MUESLI.AI.MIT.EDU internet address = 128.52.39.7 LIFE.AI.MIT.EDU internet address = 128.52.32.80 BEET-CHEX.AI.MIT.EDU internet address = 128.52.32.22 MINI-WHEATS.AI.MIT.EDU internet address = 128.52.54.11 COUNT-CHOCULA.AI.MIT.EDU internet address = 128.52.38.22 MINTAKA.LCS.MIT.EDU internet address = 18.26.0.36 Desta forma, obtemos que museli.ai.mit.edu é um dos servidores de nomes de ai.mit.edu: > server MUESLI.AI.MIT.EDU Default Server: MUESLI.AI.MIT.EDU Address: 128.52.39.7 Agora mudaremos o tipo de pergunta. Já que encontramos o servidor de nomes, agora podemos perguntar tudo o que quisermos sobre prep.ai.mit.edu. > set q=any > prep.ai.mit.edu. Server: MUESLI.AI.MIT.EDU Address: 128.52.39.7 prep.ai.mit.edu CPU = dec/decstation-5000.25 OS = unix prep.ai.mit.edu inet address = 18.159.0.42, protocol = tcp ftp telnet smtp finger prep.ai.mit.edu preference = 1, mail exchanger = gnu-life.ai.mit.edu prep.ai.mit.edu internet address = 18.159.0.42 ai.mit.edu nameserver = beet-chex.ai.mit.edu ai.mit.edu nameserver = alpha-bits.ai.mit.edu ai.mit.edu nameserver = mini-wheats.ai.mit.edu ai.mit.edu nameserver = trix.ai.mit.edu ai.mit.edu nameserver = muesli.ai.mit.edu ai.mit.edu nameserver = count-chocula.ai.mit.edu ai.mit.edu nameserver = mintaka.lcs.mit.edu ai.mit.edu nameserver = life.ai.mit.edu gnu-life.ai.mit.edu internet address = 128.52.32.60 beet-chex.ai.mit.edu internet address = 128.52.32.22 alpha-bits.ai.mit.edu internet address = 128.52.32.5 mini-wheats.ai.mit.edu internet address = 128.52.54.11 trix.ai.mit.edu internet address = 128.52.37.6 muesli.ai.mit.edu internet address = 128.52.39.7 count-chocula.ai.mit.edu internet address = 128.52.38.22 mintaka.lcs.mit.edu internet address = 18.26.0.36 life.ai.mit.edu internet address = 128.52.32.80 Assim começando por . fomos capazes de descobrir os nomes dos servidores do próximo nível de domínio. Caso se esteja usando um servidor DNS próprio ao invés de usar todos aqueles outros servidores, o named certamente guardaria no cache todas as informações que tenha encontrado, não sendo necessária toda esta pesquisa na próxima vez que fosse realizada uma nova pesquisa de localização desta máquina. Um tema muito menos comentado, mas também muito importante é in- addr.arpa. Ele também está aninhado como um domínio 'normal'. in- addr.arpa permite-nos conseguir os nomes das máquinas através de seus endereços. Uma coisa importante aqui, é notar que ip#s são escritos ao contrário no campo in-addr.arpa. Caso se tenha o endereço da máquina: 192.128.52.43, named procederá exatamente como no exemplo prep.ai.mit.edu: encontrar servidores arpa., in-addr.arpa., 192.in- addr.arpa., 128.192.in-addr.arpa., 52.128.192.in-addr.arpa.. Encontrar então os registros necessários para 43.52.128.192.in-addr.arpa. Engenhoso não? (Diga `Sim', por favor!.) Porém não se preocupe endereços reversos somente são confusos nos dois primeiros anos. Acabamos de contar uma mentira. O DNS não funciona exatamente da maneira aqui descrita. Mas não tenha dúvida que é muito próximo disso. 44..22.. NNoossssoo PPrróópprriioo DDoommíínniioo Agora vamos definir nosso próprio campo. Vamos criar o domínio _l_i_n_u_x_._b_o_g_u_s e definir suas máquinas. Usaremos o nome de domínio bogus para estarmos certos de não estarmos perturbando ninguém. Mais uma coisa antes de começarmos: nem todos os caracteres são permitidos nos nomes das máquinas. Estamos limitados ao caracteres do alfabeto: a-z e ao números: 0-9, além do caracter '-' (hífen). Devemos nos restringir àqueles caracteres. Os caracteres maiúsculos e minúsculos são idênticos para o DNS, assim pat.uio.no é igual a Pat.UiO.No. Começaremos esta parte com uma linha em named.conf: ______________________________________________________________________ zone "0.0.127.in-addr.arpa" { type master; file "pz/127.0.0"; }; ______________________________________________________________________ Por favor note a falta de `.' no final dos nomes dos campos neste arquivo. Isto nos diz que podemos definir uma zona 0.0.127.in- addr.arpa, na qual somos os servidores principais e que as informações estão guardadas em um arquivo chamado pz/127.0.0. Nós já configuramos este arquivo anteriormente com o seguinte conteúdo: ______________________________________________________________________ @ IN SOA ns.linux.bogus.hostmaster.linux.bogus. ( 1 ; Serial 8H ; Atualização 2H ; Tentativas 1W ; Expiração 1D) ; TTL mínimo NS ns.linux.bogus. 1 PTR localhost ______________________________________________________________________ Por favor note o `.' no final de todos os nomes completos de campo neste arquivo, em contraste ao arquivo acima named.conf. Algumas pessoas gostam de começar cada arquivo de zona com uma diretiva $ORIGIN, mas isto é supérfluo. A origem (onde pertence o DNS na hierarquia) de um arquivo de zona é especificado na seção de zona do arquivo named.conf, a qual neste caso é 0.0.127.in-addr.arpa. Este `arquivo de zona ' contém 3 `registros de recursos' (RRs): SOA, NS e um PTR. SOA é a contração para Início de Autoridade. O `@' é uma observação especial que significa origem e desde que a coluna do campo para este arquivo diz 0.0.127.in-addr.arpa, a primeira linha realmente quer dizer 0.0.127.in-addr.arpa. IN SOA ... NS é o nome do servidor RR. Não há '@' no início desta linha, está _i_m_p_l_í_c_i_t_o desde que a última linha começou com o caracter '@'. Economiza-se assim alguma digitação e a possibilidade de cometer algum erro. Assim na linha NS se lê 0.0.127.in-addr.arpa. IN NS ns.linux.bogus Indicando ao DNS que a máquina é o servidor de nomes do domínio 0.0.127.in-addr.arpa é chamada ns.linux.bogus. 'ns' é um nome comum para servidor de nomes, mas como em servidores web são costumeiramente chamados www._d_o_m_í_n_i_o, este nome pode ser qualquer coisa. E finalmente o registro PTR diz que a máquina no endereço 1 na subrede 0.0.127.in-addr.arpa, ou seja, 127.0.0,1 é denominado localhost. O registro SOA é o preâmbulo para _t_o_d_o_s os arquivos de zona e deve haver exatamente um em cada arquivo de zona, devendo necessariamente ser o primeiro registro. Ele descreve a zona, sua origem (uma máquina servidor de nomes ns.linux.bogus), quem é a responsável por seu conteúdo (hostmaster@linux.bogus), qual a versão do arquivo de zona (serial: 1) e outras coisas que têm a ver com guarda de dados em cache e servidores secundários de DNS. Para os demais campos, Atualização, Tentativas, Expiração e TTL, pode-se usar os valores aqui indicados e se estará seguro. Agora reinicializaremos o servidor de nomes (através do comando ndc restart), e usaremos nslookup para examinar o que foi feito: $ nslookup Servidor Padrão: localhost Endereço: 127.0.0.1 > 127.0.0.1 Servidor: localhost Endereço: 127.0.0.1 Nome: localhost Endereço: 127.0.0.1 observamos então que é possível chegar a localhost a partir do endereço 127.0.0.1. Agora a nossa tarefa principal, no campo linux.bogus, vamos inserir uma nova seção chamada 'zone' no named.conf: ______________________________________________________________________ zone "linux.bogus" { notify no; type master; file "pz/linux.bogus"; }; ______________________________________________________________________ Note-se a ausência de `.' no nome do domínio no arquivo named.conf. No arquivo de zona do domínio linux.bogus colocaremos alguns dados totalmente inventados: ______________________________________________________________________ ; ; Arquivo zona para linux.bogus ; ; O arquivo completo de zone ; @ IN SOA ns.linux.bogus. hostmaster.linux.bogus. ( 199802151 ; serial, data de hoje + serial de hoje # 8H ; Atualização, segundos 2H ; Tentativa, segundos 1W ; Expiração, segundos 1D ) ; TTL, segundos ; NS ns ; Endereço Internet do nome do servidor MX 10 mail.linux.bogus ; Servidor de Correio Primário MX 20 mail.friend.bogus. ; Servidor de Correio Secundário ; localhost A 127.0.0.1 ns A 192.168.196.2 mail A 192.168.196.4 ______________________________________________________________________ Dois aspectos devem ser observados sobre o registro SOA. ns.linux.bogus _d_e_v_e ser uma máquina real com um registro A. Não é permitido ter um registro CNAME para a máquina mencionada no registro SOA. O nome não precisa ser 'ns', pode ser qualquer nome de máquina válido. Em seguida, a hostmaster.linux.bogus deve ser lido como hostmaster@linux.bogus, o qual deve ser um nome alternativo de correio, ou caixa postal, acessado pela(s) pessoa(s) que mantém o DNS e leiam a correspondência freqüentemente. Qualquer correspondência relativa ao domínio será enviada para o endereço relacionado aqui. O nome não precisa ser 'hostmaster', pode ser qualquer endereço e-mail válido, mas espera-se que o endereço e-mail 'hostmaster' _f_u_n_c_i_o_n_e bem. Há um novo tipo RR neste arquivo, o MX, ou registro de recurso de servidor de correio. Este arquivo diz aos sistemas de correspondência para onde enviar a correspondência endereçada para alguém@linux.bogus, ou seja no nosso caso mail.linux.bogus ou mail.friend.bogus. O número antes de cada nome de máquina define a prioridade. O RR com o número mais baixo tem prioridade. Caso ele não esteja ativo ou apresentar algum erro, a mensagem pode ser enviada a um outro servidor de mensagens com um número mais alto, um operador de correspondência secundário, ou seja, no nosso caso, mail.friend.bogus que tem prioridade 20. Ao se reiniciar o servidor de nomes executando-se ndc restart obteremos os seguintes resultados com o nslookup: $ nslookup > set q=any > linux.bogus Server: localhost Address: 127.0.0.1 linux.bogus origin = ns.linux.bogus mail addr = hostmaster.linux.bogus serial = 199802151 refresh = 28800 (8 horas) retry = 7200 (2 horas) expire = 604800 (7 dias) minimum ttl = 86400 (1 dia) linux.bogus nameserver = ns.linux.bogus linux.bogus preference = 10, mail exchanger = mail.linux.bogus.linux.bogus linux.bogus preference = 20, mail exchanger = mail.friend.bogus linux.bogus nameserver = ns.linux.bogus ns.linux.bogus internet address = 192.168.196.2 mail.linux.bogus internet address = 192.168.196.4 Com um exame mais apurado pode-se descobrir um pequeno problema. A linha linux.bogus preference = 10, mail exchanger = mail.linux.bogus.linux.bogus deveria ser linux.bogus preference = 10, mail exchanger = mail.linux.bogus Deliberadamente cometemos o erro para que o leitor aprenda com ele:-) Examinando o arquivo de zona, percebemos que na linha MX 10 mail.linux.bogus ; Servidor primário de correio está faltando um ponto. Ou seja há 'linux.bogus' demais. Caso um nome de máquina não seja seguido por um ponto num arquivo de zona, a origem será acrescentada ao final causando o duplo linux.bogus.linux.bogus. Portanto ______________________________________________________________________ MX 10 mail.linux.bogus. ; Servidor primário de correio ______________________________________________________________________ ou ______________________________________________________________________ MX 10 mail ; Servidor primário de correio ______________________________________________________________________ estão corretos. Particularmente, sugerimos a última forma, por ser mais econômica e menos sujeita a erros. Existem alguns bem conhecidos usuários de bind que discordam e outros que concordam com isto. Num arquivo de zona, o domínio pode tanto ser totalmente identificado e terminado com um `.' ou não deve ser incluído de forma alguma, utilizando então o padrão da origem. Devemos salientar que em um arquivo named.conf _n_ã_o deve haver `.' depois dos nomes dos domínios. Você não tem idéia de quantas vezes um `.' gerou uma enormidade de problemas e confundiu um punhado de administradores. Agora que já expressamos nosso ponto de vista. Estamos com o novo arquivo de zona e com informações extras: ______________________________________________________________________ ; ; Arquivo de zona para linux.bogus ; ; O arquivo de zona completo ; @ IN SOA ns.linux.bogus. hostmaster.linux.bogus. ( 199802151 ; serial, data de hoje + serial de hoje # 8H ; Atualizar, segundos 2H ; Tentativas, segundos 1W ; Expiração, segundos 1D ) ; TTL, segundos ; TXT "Linux.Bogus, os especialistas DNS " NS ns ; Endereço Internet do servidor de nomes NS ns.friend.bogus. MX 10 mail ; Servidor de correio primário MX 20 mail.friend.bogus. ; Servidor de correio secundário localhost A 127.0.0.1 gw A 192.168.196.1 HINFO "Cisco" "IOS" TXT "O roteador" ns A 192.168.196.2 MX 10 mail MX 20 mail.friend.bogus. HINFO "Pentium" "Linux 2.0" www CNAME ns donald A 192.168.196.3 MX 10 mail MX 20 mail.friend.bogus. HINFO "i486" "Linux 2.0" TXT "DEK" correio A 192.168.196.4 MX 10 mail MX 20 mail.friend.bogus. HINFO "386sx" "Linux 2.2" ftp A 192.168.196.5 MX 10 mail MX 20 mail.friend.bogus. HINFO "P6" "Linux 2.0.36" ______________________________________________________________________ Há diversos RRs novos: HINFO (INFOrmação da Máquina) tem duas partes, sendo aconselhável indicar os dois. A primeira parte é o hardware ou CPU da máquina, e a segunda parte é o software ou OS da máquina. O servidor de nomes 'ns' tem uma CPU Pentium e executa o Linux 2.0. CNAME (NOME Canônico) é uma maneira de dar a uma mesma máquina vários nomes. Assim www é um nome alternativo para o ns. O uso do registro CNAME é um pouco controvertido. Mas é seguro seguir a regra onde um registro MX, CNAME ou SOA _n_u_n_c_a deve referir-se a um registro CNAME , e devem referir-se somente a um registro A, sendo portanto incorreto ter-se: ______________________________________________________________________ itamaracabar CNAME www ; NÃO! ______________________________________________________________________ o correto seria: ______________________________________________________________________ itamaracabar CNAME ns ; SIM! ______________________________________________________________________ É também seguro supor que um CNAME não é um nome de máquina válido para um endereço e-mail, por exemplo webmaster@www.linux.bogus é um endereço ilegal, conforme a configuração acima. Não se deve esperar que muito administradores de servidores de mensagens usem esta configuração, mesmo se ela funcionar localmente. A maneira para evitar isto é usar registros de tipo A ( e talvez alguns outros também, como um registro MX): ______________________________________________________________________ www A 192.168.196.2 ______________________________________________________________________ Um grande número de magos do DNS, sugerem que o CNAME _n_ã_o seja utilizado. Por isso, devemos considerar esta sugestão _m_u_i_t_o seriamente. Mas como se pode perceber, este COMO FAZER e muitos sites não seguem esta regra. É possível carregar o novo banco de dados executando-se ndc reload, o que fará com que o named leia seus arquivos novamente. $ nslookup Default Server: localhost Address: 127.0.0.1 > ls -d linux.bogus Isto significa que todos os registros devem ser apresentados. O resultado será: <tscreen><verb> [localhost] $ORIGIN linux.bogus. @ 1D IN SOA ns hostmaster ( 199802151 ; nro. serial 8H ; atualizar 2H ; tentativas 1W ; expiração 1D ) ; mínimo 1D IN NS ns 1D IN NS ns.friend.bogus. 1D IN TXT "Linux.Bogus, os consultores DNS" 1D IN MX 10 mail 1D IN MX 20 mail.friend.bogus. gw 1D IN A 192.168.196.1 1D IN HINFO "Cisco" "IOS" 1D IN TXT "O roteador" mail 1D IN A 192.168.196.4 1D IN MX 10 mail 1D IN MX 20 mail.friend.bogus. 1D IN HINFO "386sx" "Linux 1.0.9" localhost 1D IN A 127.0.0.1 www 1D IN CNAME ns donald 1D IN A 192.168.196.3 1D IN MX 10 mail 1D IN MX 20 mail.friend.bogus. 1D IN HINFO "i486" "Linux 1.2" 1D IN TXT "DEK" ftp 1D IN A 192.168.196.5 1D IN MX 10 mail 1D IN MX 20 mail.friend.bogus. 1D IN HINFO "P6" "Linux 1.3.59" ns 1D IN A 192.168.196.2 1D IN MX 10 mail 1D IN MX 20 mail.friend.bogus. 1D IN HINFO "Pentium" "Linux 1.2" @ 1D IN SOA ns hostmaster ( 199802151 ; nro. serial 8H ; atualizar 2H ; tentativas 1W ; expiração 1D ) ; mínimo Parece ótimo. Como se pode ver parece muito com o arquivo de zona. Vamos verificar o que ele diz para www: > set q=any > www.linux.bogus. Server: localhost Address: 127.0.0.1 www.linux.bogus canonical name = ns.linux.bogus linux.bogus nameserver = ns.linux.bogus linux.bogus nameserver = ns.friend.bogus ns.linux.bogus internet address = 192.168.196.2 Em outras palavras, o nome real de www.linux.bogus é ns.linux.bogus, e ele fornece algumas informações adicionais que ele possua sobre ns, o suficiente para um programa conectar-se a ele. Agora estamos no meio do caminho. 44..33.. AA zzoonnaa rreevveerrssaa Agora os programas podem converter os nomes em linux.bogus para endereços com os quais eles podem se conectar. Porém é pedido também uma zona reversa, que torne o DNS capaz de converter um endereço em um nome. Este nome é usado por muitos servidores de espécies diferentes (FTP, IRC, WWW e outros) para decidir se eles querem conversar com a máquina local ou não, e em caso positivo, também qual a prioridade que deve ser dada a esta máquina. Para o acesso completo a todos os serviços da Internet, uma zona reversa é necessária. Deve-se colocar o seguinte em named.conf: ______________________________________________________________________ zone "196.168.192.in-addr.arpa" { notify no; type master; file "pz/192.168.196"; }; ______________________________________________________________________ Estes parâmetros são exatamente iguais para 0.0.127.in-addr.arpa e os conteúdos são semelhantes: ______________________________________________________________________ @ IN SOA ns.linux.bogus. hostmaster.linux.bogus. ( 199802151 ; Nro.Serial, data + nro. série 8H ; Atualizar 2H ; Tentativas 1W ; Expiração 1D) ; TTL mínimo NS ns.linux.bogus. 1 PTR gw.linux.bogus. 2 PTR ns.linux.bogus. 3 PTR donald.linux.bogus. 4 PTR mail.linux.bogus. 5 PTR ftp.linux.bogus. ______________________________________________________________________ Agora ao reinicializar o servidor de nomes (ndc restart) e examinar o trabalho realizado, utilizando-se o nslookup, teremos: ______________________________________________________________________ > 192.168.196.4 Server: localhost Address: 127.0.0.1 Name: mail.linux.bogus Address: 192.168.196.4 ______________________________________________________________________ Então caso tudo pareça correto, vamos examinar todas as demais informações: ______________________________________________________________________ > ls -d 196.168.192.in-addr.arpa [localhost] $ORIGIN 196.168.192.in-addr.arpa. @ 1D IN SOA ns.linux.bogus. hostmaster.linux.bogus. ( 199802151 ; nro. serial 8H ; atualizar 2H ; tentativas 1W ; expiração 1D ) ; ttl mínimo 1D IN NS ns.linux.bogus. 1 1D IN PTR gw.linux.bogus. 2 1D IN PTR ns.linux.bogus. 3 1D IN PTR donald.linux.bogus. 4 1D IN PTR mail.linux.bogus. 5 1D IN PTR ftp.linux.bogus. @ 1D IN SOA ns.linux.bogus. hostmaster.linux.bogus. ( 199802151 ; nro. serial 8H ; atualizar 2H ; tentativas 1W ; expiração 1D ) ; ttl mínimo ______________________________________________________________________ Parece bom! Há algumas coisas que devemos acrescentar. Os números IP usados nos exemplos acima foram tirados dos blocos de 'redes privadas', ou seja, eles não podem ser usados publicamente na Internet. Por isso eles são seguros para serem usados em um exemplo de um COMO FAZER. A segunda coisa é a linha notify no;, a qual indica que o servidor de nomes não notificará o servidor secundário (escravo), quando houver uma atualização para um dos arquivos de zona. No bind-8 o servidor de nomes pode notificar os outros servidores relacionados nos registros NS no arquivo de zona, toda vez que ela for atualizada. Isto é conveniente para o uso diário e usual, mas em nossas experiências particulares com zonas, esta característica deve ser desativada, afinal não queremos que a experiência polua toda a Internet, queremos? E claro, este domínio é totalmente inventado, assim como todos os endereços que estão nele. Para um exemplo real de um domínio real, veja a próxima seção. 55.. UUmm EExxeemmpplloo ddee DDoommíínniioo RReeaall OOnnddee lliissttaammooss aallgguunnss aarrqquuiivvooss _d_e _z_o_n_a _r_e_a_i_s Os usuários têm sugerido que seja incluído um exemplo real de um domínio em operação, bem como um exemplo detalhado. Usaremos este exemplo com a permissão de David Bullock da LAND-5. Estes arquivos eram atuais em 24 de setembro de 1996 e foram então editados para corresponder às restrições da bind-8 e às extensões usadas pelo autor. Assim, o que se vê aqui, difere um pouco do que se pode encontrar ao se perguntar aos servidores de nomes do LAND-5. 55..11.. //eettcc//nnaammeedd..ccoonnff ((oouu //vvaarr//nnaammeedd//nnaammeedd..ccoonnff)) Aqui encontramos as seções mestre de zona para as duas zonas reversas necessárias: a rede 127.0.0 , bem como a rede LAND-5 206.6.177, além de uma linha primária para o land-5.com. Note ainda que ao invés de colocar os arquivos em um diretório chamado pz, como foi feito anteriormente, eles foram colocados no diretório chamado zone. ______________________________________________________________________ // Arquivo de inicialização do servidor de nomes de LAND-5 options { directory "/var/named"; }; zone "." { type hint; file "root.hints"; }; zone "0.0.127.in-addr.arpa" { type master; file "zone/127.0.0"; }; zone "land-5.com" { type master; file "zone/land-5.com"; }; zone "177.6.206.in-addr.arpa" { type master; file "zone/206.6.177"; }; ______________________________________________________________________ Caso este arquivo seja definido como o arquivo named.conf de uma máquina local, _P_O_R _F_A_V_O_R use o parâmetro notify no; nas seções de zona para as duas zonas land-5, a fim de evitar acidentes. 55..22.. //vvaarr//nnaammeedd//rroooott..hhiinnttss Deve-se ter em mente que este é um arquivo dinâmico e o aqui descrito pode não significar a realidade atual. É sugerido utilizar um modelo atualizado, produzido pelo utilitário dig, conforme explicado anteriormente. ______________________________________________________________________ ; <<>> DiG 8.1 <<>> @A.ROOT-SERVERS.NET. ; (1 server found) ;; res options: init recurs defnam dnsrch ;; got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10 ;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13 ;; QUERY SECTION: ;; ., type = NS, class = IN ;; ANSWER SECTION: . 6D IN NS G.ROOT-SERVERS.NET. . 6D IN NS J.ROOT-SERVERS.NET. . 6D IN NS K.ROOT-SERVERS.NET. . 6D IN NS L.ROOT-SERVERS.NET. . 6D IN NS M.ROOT-SERVERS.NET. . 6D IN NS A.ROOT-SERVERS.NET. . 6D IN NS H.ROOT-SERVERS.NET. . 6D IN NS B.ROOT-SERVERS.NET. . 6D IN NS C.ROOT-SERVERS.NET. . 6D IN NS D.ROOT-SERVERS.NET. . 6D IN NS E.ROOT-SERVERS.NET. . 6D IN NS I.ROOT-SERVERS.NET. . 6D IN NS F.ROOT-SERVERS.NET. ;; ADDITIONAL SECTION: G.ROOT-SERVERS.NET. 5w6d16h IN A 192.112.36.4 J.ROOT-SERVERS.NET. 5w6d16h IN A 198.41.0.10 K.ROOT-SERVERS.NET. 5w6d16h IN A 193.0.14.129 L.ROOT-SERVERS.NET. 5w6d16h IN A 198.32.64.12 M.ROOT-SERVERS.NET. 5w6d16h IN A 202.12.27.33 A.ROOT-SERVERS.NET. 5w6d16h IN A 198.41.0.4 H.ROOT-SERVERS.NET. 5w6d16h IN A 128.63.2.53 B.ROOT-SERVERS.NET. 5w6d16h IN A 128.9.0.107 C.ROOT-SERVERS.NET. 5w6d16h IN A 192.33.4.12 D.ROOT-SERVERS.NET. 5w6d16h IN A 128.8.10.90 E.ROOT-SERVERS.NET. 5w6d16h IN A 192.203.230.10 I.ROOT-SERVERS.NET. 5w6d16h IN A 192.36.148.17 F.ROOT-SERVERS.NET. 5w6d16h IN A 192.5.5.241 ;; Total query time: 215 msec ;; FROM: roke.uio.no to SERVER: A.ROOT-SERVERS.NET. 198.41.0.4 ;; WHEN: Sun Feb 15 01:22:51 1998 ;; MSG SIZE sent: 17 rcvd: 436 ______________________________________________________________________ 55..33.. //vvaarr//nnaammeedd//zzoonnee//112277..00..00 Somente as informações básicas são obrigatórias, como o registro SOA e um registro que mapeie 127.0.0.1 para localhost. Nenhuma outra informação deve estar contida neste arquivo. Provavelmente ele nunca precisará ser atualizado, a menos que o endereço do servidor de nomes ou da máquina mestra seja alterado. ______________________________________________________________________ @ IN SOA land-5.com. root.land-5.com. ( 199909203 ; Nro. Serial 28800 ; Atualizar 7200 ; Tentativas 604800 ; Expiração 86400) ; TTL Mínimo NS land-5.com. 1 PTR localhost. ______________________________________________________________________ 55..44.. //vvaarr//nnaammeedd//zzoonnee//llaanndd--55..ccoomm Aqui teremos um registro SOA obrigatório com os registros NS necessários. Podemos ver que há um servidor secundário em ns2.psi.net. Este é o procedimento correto, _s_e_m_p_r_e ter um site como servidor secundário que esteja fora da rede local. Podemos verificar que ele tem uma máquina mestra chamada land-5, o qual cuida de muitos serviços diferentes da Internet, e que ele foi definido com diversos registros CNAME (uma alternativa seria usar os registros de recursos do tipo A). Como se pode verificar no registro SOA, o arquivo de zona tem origem em land-5.com e a pessoa de contato é root@land-5.com. hostmaster é outro endereço usado com freqüência na definição de pessoa de contato. O número serial está no formato habitual ano-mês-dia com o números seriais acrescentado, sendo esta provavelmente a sexta versão do arquivo de zona datada de 20 de setembro de 1996. Lembre-se que o número serial _d_e_v_e aumentar ordenadamente, onde hoje temos apenas _u_m dígito para serial#; assim depois da nona alteração no dia de hoje ele terá que esperar até amanhã antes de poder editar o arquivo novamente. É aconselhável o de dois dígitos para evitar este tipo de problema. ______________________________________________________________________ @ IN SOA land-5.com. root.land-5.com. ( 199609206 ; nro. serial, data de hoje + atualizações # 8H ; atualizar em segundos 2H ; tentativas em segundos 1W ; expiração em segundos 1D ) ; mínimo em segundos NS land-5.com. NS ns2.psi.net. MX 10 land-5.com. ; Servidor primário de correio Localhost A 127.0.0.1 Router A 206.6.177.1 land-5.com. A 206.6.177.2 ns A 206.6.177.3 www A 207.159.141.192 ftp CNAME land-5.com. mail CNAME land-5.com. news CNAME land-5.com. funn A 206.6.177.2 @ TXT "Corporação LAND-5" ; ; Estações de Trabalho ; ws-177200 A 206.6.177.200 MX 10 land-5.com. ; ws-177201 A 206.6.177.201 MX 10 land-5.com. ; Servidor primário de correio ws-177202 A 206.6.177.202 MX 10 land-5.com. ; Servidor primário de correio ws-177203 A 206.6.177.203 MX 10 land-5.com. ; Servidor primário de correio ws-177204 A 206.6.177.204 MX 10 land-5.com. ; Servidor primário de correio ws-177205 A 206.6.177.205 MX 10 land-5.com. ; Servidor primário de correio ; {Definições repetitivas retiradas - SNIP} ws-177250 A 206.6.177.250 MX 10 land-5.com. ; Servidor primário de correio ws-177251 A 206.6.177.251 MX 10 land-5.com. ; Servidor primário de correio ws-177252 A 206.6.177.252 MX 10 land-5.com. ; Servidor primário de correio ws-177253 A 206.6.177.253 MX 10 land-5.com. ; Servidor primário de correio ws-177254 A 206.6.177.254 MX 10 land-5.com. ; Servidor primário de correio ______________________________________________________________________ Ao examinarmos o servidor de nomes land-5, descobriremos que os nomes das máquinas estão no formato ws__n_ú_m_e_r_o. Como nas versões recentes do bind 4, o named começa a impor restrições nos caracteres que podem ser usados como nomes das máquinas. Por isso, o original não funcionava com bind-8 e foram substituídos então os '-'(travessões) por '_'(sublinhados). Uma outra coisa a ser notada é que as estações operacionais não possuem nomes individuais, mas um prefixo seguido pelas duas últimas partes dos números IP. Usando-se tal convenção, pode-se simplificar significativamente a manutenção, mas pode ser um pouco impessoal, e na verdade, se tornar uma fonte de descontentamento entre os usuários. Vemos também que funn.land-5.com é um nome alternativo para land-5.com, mas usando um registro A e não um registro CNAME. 55..55.. //vvaarr//nnaammeedd//zzoonnee//220066..66..117777 Comentaremos este arquivo em seguida. ______________________________________________________________________ @ IN SOA land-5.com. root.land-5.com. ( 199609206 ; Nro. Serial 28800 ; Atualizar 7200 ; Tentativa 604800 ; Expiração 86400) ; TTL Mínimo NS land-5.com. NS ns2.psi.net. ; ; Servidores ; 1 PTR router.land-5.com. 2 PTR land-5.com. 2 PTR funn.land-5.com. ; ; Estações de trabalho ; 200 PTR ws-177200.land-5.com. 201 PTR ws-177201.land-5.com. 202 PTR ws-177202.land-5.com. 203 PTR ws-177203.land-5.com. 204 PTR ws-177204.land-5.com. 205 PTR ws-177205.land-5.com. ; {Muitas definições repetidas foram suprimidas - SNIP} 250 PTR ws-177250.land-5.com. 251 PTR ws-177251.land-5.com. 252 PTR ws-177252.land-5.com. 253 PTR ws-177253.land-5.com. 254 PTR ws-177254.land-5.com. ______________________________________________________________________ A zona reversa é o aspecto da configuração que parece causar a maior dificuldade. É usada para se encontrar o nome da máquina, caso se tenha o seu endereço IP. Por exemplo: caso a máquina seja um servidor IRC que aceita conexões de clientes. No entanto este é um servidor Norueguês e por isso, somente serão aceitas conexões de clientes na Noruega e outros países escandinavos. Quando se obtém uma conexão de um cliente, a biblioteca C é capaz de indicar o número IP da máquina remota, porque o número IP do cliente está contido em todos os pacotes que são enviados para a rede. Pode-se então usar uma função chamada gethostbyaddr, a qual pesquisa o nome de uma máquina dado o número IP. Gethostbyaddr perguntará a um servidor DNS, o qual procurará pela máquina. Supondo-se que a conexão cliente foi originada por ws-177200.land-5.com. O número IP que a biblioteca C fornece para o servidor IRC é 206.6.177.200. Para descobrir o nome daquela máquina, precisamos encontrar 200.177.6.206.in-addr.arpa. O servidor DNS primeiramente encontrará os servidores arpa., então os servidores in- addr.arpa. seguidos pelos servidores reversos de 206, então 6 e finalmente é encontrando o servidor para a zona 177.6.206.in-addr.arpa em land-5. A partir deste se obterá a resposta, ou seja o registro 'PTR ws-177200.land-5.com', que indica que o nome de 206.6.177.200 é igual a ws-177200.land-5.com. Assim como com as explicações sobre a forma de pesquisa de prep.ai.mit.edu, esta descrição também é um pouco simplificada em relação ao que efetivamente ocorre. Voltando ao exemplo do servidor IRC. O servidor IRC só aceita conexões de países escandinavos, ou seja, *.no, *.se ou*.dk e o nome ws-177200.land-5.com claramente não combina com qualquer uma delas, sendo então negada a conexão. Caso _n_ã_o houvesse o mapeamento reverso de 206.2.177.200 através da zona in-addr.arpa, o servidor estaria incapacitado de encontrar o nome e teria que comparar 206.2.177.200 com *.no, *.se e *.dk, onde evidentemente nenhuma das opções coincidiria. Algumas pessoas afirmam que a pesquisa de mapeamentos reversos são importantes apenas para os servidores, ou ainda que não são importantes de forma alguma. A verdade nos parece bem diferente: muitos servidores ftp, notícias, IRC e até mesmo alguns http (WWW) _n_ã_o aceitarão conexões de máquinas das quais não seja possível encontrar o nome. Por isso os mapeamentos reversos são na verdade _o_b_r_i_g_a_t_ó_r_i_o_s. 66.. MMaannuutteennççããoo MMaanntteennddoo oo ssiisstteemmaa ffuunncciioonnaannddoo.. Há uma tarefa de manutenção que se deve executar no named, além de mantê-los funcionando, que é manter o arquivo root.hints atualizado. A maneira mais fácil é usar o utilitário dig, o qual deve ser executado inicialmente sem argumentos, gerando um root.hints adequado ao servidor. A seguir deve ser perguntado a um dos servidores relacionados o seguinte: dig @rootserver. Pode-se notar que a saída se parecerá muitíssimo como um arquivo root.hints. Ela deve ser salva em um arquivo (dig @e.root-servers.net . ns >root.hints.new) que servirá de substituto ao root.hints anterior. O servidor de nomes deverá ser então reiniciado para substituir o cache antigo. Al Longyear enviou este programa, o qual pode ser executado automaticamente para atualizar root.hints; basta configurar uma entrada no crontab para executá-lo por exemplo uma vez ao mês. O programa assume que se tenha um servidor de correio funcionando e que o nome alternativo de endereço de correio eletrônico 'hostmaster' está definido. ______________________________________________________________________ #!/bin/sh # # Atualiza as informações do cache do servidor de nomes uma vez ao mês # É executado automaticamente uma vez ao mês através de uma entrada no cron # ( echo "To: hostmaster <hostmaster>" echo "From: system <root>" echo "Subject: Atualização automática do arquivo named.conf " echo export PATH=/sbin:/usr/sbin:/bin:/usr/bin: cd /var/named dig @rs.internic.net . ns >root.hints.new echo "O arquivo named.conf foi atualizado, passando a conter a seguinte informações:" echo cat root.hints.new chown root.root root.hints.new chmod 444 root.hints.new rm -f root.hints.old mv root.hints root.hints.old mv root.hints.new root.hints ndc restart echo echo "O servidor de nomes foi reinicializado para garantir que a atualização foi completada". echo "O arquivo root.hints anterior foi renomeado para /var/named/root.hints.old." ) 2>&1 | /usr/lib/sendmail -t exit 0 ______________________________________________________________________ Alguns dos leitores mais avançados podem saber que o arquivo root.hints está também disponível via ftp na Internic. Por favor _n_ã_o use ftp para atualizar root.hints, o método acima é muito mais amigável para a rede. 77.. CCoonnvveerrtteerr ddaa vveerrssããoo 44 ppaarraa vveerrssããoo 88 Esta foi originalmente uma seção sobre o uso da bind 8 escrita por David E. Smith (dave@bureau42.ml.org). Ela foi editada para conter o novo nome da seção. Não há muito a acrescentar. Exceto pelo uso do servidor named.conf ao invés de servidor named.boot, tudo mais é idêntico; bind8 vem com um programa perl que converte arquivos de estilo velho para o novo formato. Exemplo de um named.boot (velho estilo) para um servidor de nomes somente para cache: ______________________________________________________________________ directory /var/named cache . root.hints primary 0.0.127.IN-ADDR.ARPA 127.0.0.zone primary localhost localhost.zone ______________________________________________________________________ Na linha de comando, no diretório bind8/src/bin/named (_p_r_e_s_u_m_e_-_s_e _a_q_u_i _q_u_e _s_e _t_e_n_h_a_m _o_s _f_o_n_t_e_s _d_a _d_i_s_t_r_i_b_u_i_ç_ã_o_. _C_a_s_o _s_e _l_o_c_a_l_i_z_e _s_o_m_e_n_t_e _o _p_a_c_o_t_e _b_i_n_á_r_i_o_, _o _p_r_o_g_r_a_m_a _e_s_t_a_r_á _p_o_r _p_e_r_t_o_. _-_e_d_.), digite: ______________________________________________________________________ ./named-bootconf.pl < named.boot > named.conf ______________________________________________________________________ o qual criará o seguinte named.conf: ______________________________________________________________________ options { directory "/var/named"; }; zone "." { type hint; file "root.hints"; }; zone "0.0.127.IN-ADDR.ARPA" { type master; file "127.0.0.zone"; }; zone "localhost" { type master; file "localhost.zone"; }; ______________________________________________________________________ Funciona para tudo o que puder estar presente em um arquivo named.boot, embora ele não acrescente todas as novas funcionalidades e opções de configuração que o bind8 permite. Aqui está um named.conf mais completo, o qual faz as mesmas coisas, mas de uma forma um pouco mais eficaz. ______________________________________________________________________ // Este é um arquivo de configuração para o named (BIND 8.1 ou mais recente). // Deve ser instalado em /etc/named.conf. // A única mudança feita no named.conf (à parte deste comentário:) é que a linha // de diretório foi descomentada, desde que já se tinha os arquivos de zona em // /var/named. options { directory "/var/named"; check-names master warn; /* padrão. */ datasize 20M; }; zone "localhost" IN { type master; file "localhost.zone"; check-names fail; allow-update { none; }; allow-transfer { any; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "127.0.0.zone"; check-names fail; allow-update { none; }; allow-transfer { any; }; }; zone "." IN { type hint; file "root.hints"; }; ______________________________________________________________________ bind8/src/bin/named/test tem este conteúdo e cópias dos arquivos de zonas, que muitos podem simplesmente começar a usar. Os formatos dos arquivos de zona e dos arquivos root.hints são idênticos, assim como são os comandos para atualizá-los. 88.. PPeerrgguunnttaass ee RReessppoossttaass Por favor leia esta seção com atenção antes de enviar mensagens ao autor. 1. Meu named necessita de um arquivo named.boot. Você está lendo o COMO FAZER errado. Por favor veja a versão antiga deste COMO FAZER que faz a converção do bind 4 em: http://www.math.uio.no/~janl/DNS/. 2. Como usar o DNS de dentro de um firewall? Algumas dicas: `retransmissores', `escravo' e dê uma olhada na lista de literatura no final deste COMO FAZER. 3. Como fazer para o DNS alternar através de diversos endereços disponíveis para um serviço, digamos, www.busy.site para obter um efeito de carga balanceada ou similar? Faça vários registros AA para www.busy.site e use a bind 4.9.3 ou posterior. Então o bind irá fornecer as respostas, porém _n_ã_o funcionará com versões mais antigas do bind. 4. Gostaria de configurar o DNS em uma intranet (fechada). O que eu faço? Pode-se omitir o arquivo root.hints e construir somente os arquivos de zona. Isto significa ainda que você não tem que conseguir um novo arquivo hint o tempo todo. 5. Como configurar um servidor de nomes secundário (escravo)? Caso o servidor primário/mestre tiver, por exemplo, o endereço 127.0.0.1, basta colocar uma linha no arquivo named.conf do secundário: ___________________________________________________________________ zone "linux.bogus" { type slave; file "sz/linux.bogus"; masters { 127.0.0.1; }; }; ___________________________________________________________________ Pode-se relacionar vários servidores mestres alternativos. O arquivo de zona pode ser copiado de dentro de uma lista de mestres, separada por ';' (ponto e vírgula). 6. Eu quero executar o bind quando estiver desconectado da rede. Há aspectos relacionados com isto: · Eu recebi esta mensagem de Ian Clark <ic@deakin.edu.au> onde ele explica a sua maneira de fazer isto: Eu executo named na minha máquina 'Masquerading', tendo dois arquivos root.hints, uma chamado root.hints.real que contém os nomes dos servidores de nomes raiz reais e o outro chamado root.hints.falso que contém... ---- ; root.hints.falso ; este arquivo não contém informações ---- Ao desconectar-se da rede, eu copio o arquivo root.hints.falso para root.hints e reinicio o named. Ao conectar-se novamente a rede, root.hints.real é copiado para root.hints e o named é reiniciado. Isto é feito pelos programas ip-down & ip-up respectivamente. A primeira vez que uma pergunta pesquisa é feita com a rede desconectada, o servidor de nomes não tem meios de obter o seu endereço e apresenta a seguinte mensagem: 28 de jan. 20:10:11 servidor de nomes hazchem [10147]: Nenhum servidor de nomes raiz foi localizado para a classe IN... Com a qual eu posso viver. Certamente parece funcionar para mim. É possível utilizar o servidor de nomes para máquinas locais, enquanto estiver desconectado da rede, sem o tempo de espera necessário para nomes de domínios externos e enquanto as pesquisas na rede por outros domínios "funcionam" a contento. · Recebi de Karl-Max Wanger informações sobre como bind interage com o NFS e o portmapper numa máquina fora da rede: Eu executo meu próprio named em todas as máquinas que ocasionalmente estejam conectadas a Internet via modem. O servidor de nomes atua somente como um cache, ele não tem de autoridade e pergunta tudo aos servidores de nomes indicados no arquivo root.cache. Como de costume no Slackware, ele é iniciado antes em nfsd e mountd. Com uma de minhas máquinas (um Libretto 30) eu tive o problema de algumas vezes poder montá-lo a partir de outro sistema conectado à rede local, mas na maior parte do tempo isso não ser possível. Obtive o mesmo resultado usando PLIP, um cartão Ethernet PCMCIA ou PPP sobre uma interface serial. Depois de algum tempo de tentativas e experiências, descobri que aparentemente o named ficava confuso com o processo de registro do nfsd e mountd junto ao portmapper, após a sua inicialização (estes servidores sempre foram inicializados da forma usual). Inicializando o named após nfsd e o mountd eliminou este problema completamente. Como não existem desvantagens em tal seqüência modificada de inicialização aconselho a todos que a utilizem para prevenir potenciais problemas. 7. Onde o nome do servidor somente de cache guarda seu cache? Há alguma maneira de controlar o tamanho do cache? O cache é mantido integralmente em memória, ele _n_ã_o é gravado em disco em nenhum momento. Toda vez que se finaliza o named, o cache é perdido. O cache _n_ã_o é controlável de nenhuma maneira. O named administra-o de acordo com algumas regras simples e é isso. Não se pode controlar o cache ou o tamanho do cache. Caso se deseje pode se alterar o programa named, porém isto não é recomendado. 8. O named salva o cache? Posso fazer com que ele o salve? Não, o servidor de nomes _n_ã_o salva o cache quando ele é finalizado. Isto significa que o cache tem que ser construído de novo cada vez que se reinicia o servidor de nomes. Não há nenhuma maneira de fazer com que o servidor de nomes salve o cache em um arquivo. Caso se deseje pode se alterar o programa named, porém isto não é recomendado. 99.. CCoommoo ttoorrnnaarr--ssee uumm aaddmmiinniissttrraaddoorr ddee DDNNSS.. DDooccuummeennttaaççããoo ee FFeerrrraammeennttaass.. A documentação real existe, on-line e impressa. A leitura de várias destas é necessária para tornar-se um administrador de DNS. Em formato impresso, o livro padrão é _D_N_S _e _B_I_N_D por C. Liu e P. Albitz de O'Reilly & Associates, Sebastopol, CA, ISBN 0-937175-82-X. Eu o li e digo-lhes que é excelente. Há também uma seção sobre DNS em _T_C_P_/_I_P _A_d_m_i_n_i_s_t_r_a_ç_ã_o _d_e _R_e_d_e, por Craig Huny da O'Reilly..., ISBN 0-937175-82-X. Uma outra sugestão para uma boa administração de DNS (ou bom para qualquer coisa) é _Z_e_n _e _a _A_r_t_e _d_a _M_a_n_u_t_e_n_ç_ã_o _d_a _M_o_t_o_c_i_c_l_e_t_a de Robert M. Prisig :-) Disponível em ISBN 0688052304 e outros. On-line pode-se encontrar material em <http://www.dns.net/dnsrd/>, <http://www.isc.org/bind.html>; um FAQ, uma referência manual (BOG; Guia de Operações de Bind) bem como documentos e definições de protocolos e programas DNS (estes, e a maioria, se não todos, dos rfcs mencionados abaixo, estão também contidos na distribuição de bind). Eu não li a maioria destes, mas também não sou um grande administrador de DNS. Arnt Gulbrandsen, por outro lado, leu o BOG e ficou entusiasmado com ele :-). O grupo de notícias comp.protocols.tcp- ip.domains também trata sobre DNS. Além disso há um número de RFCs sobre DNS, sendo estes provavelmente os mais importantes: RRFFCC 22005522 A. Gulbrandsen, P. Vixie, _U_m _D_N_S _R_R _p_a_r_a _a _e_s_p_e_c_i_f_i_c_a_ç_ã_o _d_a _l_o_c_a_l_i_z_a_ç_ã_o _d_o_s _s_e_r_v_i_ç_o_s_(_D_N_S _S_R_V_), Outubro de 1996 RRFFCC 11991188 Y. Rekhter, R. Moskowitz, D. Karrenberg, G. de Groot, E. Lear, _A_l_o_c_a_ç_ã_o _d_e _E_n_d_e_r_e_ç_o_s _p_a_r_a _I_n_t_e_r_n_e_t_s _P_a_r_t_i_c_u_l_a_r_e_s , 29/02/1996. RRFFCC 11991122 D. Barr, _E_r_r_o_s _C_o_m_u_n_s _n_a _O_p_e_r_a_ç_ã_o _e _C_o_n_f_i_g_u_r_a_ç_ã_o _c_o_m _D_N_S, 28/02/1996. RRFFCC 11991122 EErrrrooss B. Barr _E_r_r_o_s _n_a _R_F_C _1_9_1_2, está disponível em <http://www.cis.ohio-state.edu/~barr/rfc1912-errors.html>. RRFFCC 11771133 A. Romao, _F_e_r_r_a_m_e_n_t_a_s _p_a_r_a _d_e_p_u_r_a_ç_ã_o _d_o _D_N_S , 03/11/1994. RRFFCC 11771122 C. Farrell, M. Schulze, S. Pleitner, D. Baldoni, _C_o_d_i_f_i_c_a_ç_ã_o _D_N_S _p_a_r_a _L_o_c_a_l_i_z_a_ç_ã_o _G_e_o_g_r_á_f_i_c_a, 01/11/1994. RRFFCC 11118833 R. Ullmann, P. Mockapetris, L. Mamakos, C. Everhart, _N_o_v_a_s _D_e_f_i_n_i_ç_õ_e_s _d_e _R_R _D_N_S, 08/10/1990. RRFFCC 11003355 P. Mockapetris, _D_o_m_í_n_i_o_s _- _i_m_p_l_e_m_e_n_t_a_ç_ã_o _e _e_s_p_e_c_i_f_i_c_a_ç_ã_o, 01/11/1987. RRFFCC 11003344 P. Mockapetris, _D_o_m_í_n_i_o_s _- _c_o_n_c_e_i_t_o_s _e _i_n_s_t_a_l_a_ç_õ_e_s, 01/11/1987. RRFFCC 11003333 M. Lottor, _G_u_i_a _d_e _o_p_e_r_a_ç_õ_e_s _d_e _a_d_m_i_n_i_s_t_r_a_d_o_r_e_s _d_e _d_o_m_í_n_i_o_s, 01/11/1987. RRFFCC 11003322 M. Stahl, _G_u_i_a _d_e _a_d_m_i_n_i_s_t_r_a_d_o_r_e_s _d_e _d_o_m_í_n_i_o_s , 01/11/1987. RRFFCC 997744 C. Partridge, _R_o_t_e_a_m_e_n_t_o _d_e _c_o_r_r_e_i_o _e _d_o_m_í_n_i_o_s , 01/01/1986.