109.4 Lição 1
Certificação: |
LPIC-1 |
---|---|
Versão: |
5.0 |
Tópico: |
109 Fundamentos de rede |
Objetivo: |
109.4 Configurar o DNS do lado do cliente |
Lição: |
1 de 1 |
Introdução
Esta lição trata da configuração da resolução de nomes do lado do cliente. Falaremos também do uso de algumas ferramentas da linha de comando para resolução de nomes.
Não é viável memorizar e manter endereços IP, UIDs e GIDs e tantos outros números. Os serviços de resolução de nomes traduzem nomes fáceis de memorizar em números e vice-versa. Esta lição enfoca a resolução do nome do host, mas um processo semelhante ocorre para nomes de usuário, nomes de grupo, números de porta e muitos outros.
O processo de resolução de nome
Os programas que resolvem nomes em números quase sempre usam funções fornecidas pela biblioteca C padrão, que nos sistemas Linux é a glibc do projeto GNU. A primeira coisa que essas funções fazem é ler o arquivo /etc/nsswitch.conf
para obter instruções sobre como resolver esse tipo de nome. Esta lição trata da resolução de nomes de host, mas o mesmo processo também se aplica a outros tipos de resolução de nomes. Depois de ler /etc/nsswitch.conf
, o processo busca pelo nome da maneira especificada. Como /etc/nsswitch.conf
suporta plug-ins, o que vem a seguir pode ser qualquer coisa. Depois que a função termina de buscar o nome ou número, ela retorna o resultado para o processo de chamada.
Classes DNS
O DNS tem três classes de registro, IN, HS e CH. Nesta lição, todas as consultas de DNS serão do tipo IN. A classe IN se refere a endereços da internet que usam a pilha TCP/IP. CH significa ChaosNet, uma tecnologia de rede que teve vida curta e não está mais em uso. A classe HS refere-se ao Hesiod. O Hesiod é uma maneira de armazenar coisas como passwd e entradas de grupo no DNS. O Hesiod está além do escopo desta lição.
Entendendo /etc/nsswitch.conf
A melhor maneira de aprender mais sobre este arquivo é ler a página de manual que faz parte do projeto de páginas de manual do Linux. Ela está disponível na maioria dos sistemas. Pode ser acessada com o comando man nsswitch.conf
. Como alternativa, ela pode ser encontrada em https://man7.org/linux/man-pages/dir_section_5.html
Veja abaixo um exemplo simples de /etc/nsswitch.conf
tirado da man page:
passwd: compat group: compat shadow: compat hosts: dns [!UNAVAIL=return] files networks: nis [NOTFOUND=return] files ethers: nis [NOTFOUND=return] files protocols: nis [NOTFOUND=return] files rpc: nis [NOTFOUND=return] files services: nis [NOTFOUND=return] files # This is a comment. It is ignored by the resolution functions.
O arquivo é organizado em colunas. A coluna mais à esquerda é o tipo de banco de dados de nomes. O resto das colunas são os métodos que as funções de resolução devem usar para pesquisar um nome. Os métodos são seguidos pelas funções, da esquerda para a direita. As colunas com []
são usadas para fornecer uma lógica condicional limitada para a coluna imediatamente à esquerda.
Suponha que um processo esteja tentando resolver o nome do host learning.lpi.org
. Ele faria uma chamada apropriada à biblioteca C (provavelmente gethostbyname
). Esta função então lê /etc/nsswitch.conf
. Como o processo está procurando um nome de host, ele encontrará a linha que começa com hosts
. Em seguida, ele tenta usar o DNS para resolver o nome. A coluna seguinte, [!UNAVAIL=return]
indica que, se o serviço não estiver indisponível, não é necessário tentar a próxima fonte; ou seja, se o DNS estiver disponível, ele para de tentar resolver o nome do host, mesmo se os servidores de nome forem incapazes de fazê-lo. Se o DNS estiver indisponível, ele prossegue para a próxima fonte. Neste caso, a próxima fonte é files
.
Quando vemos uma coluna no formato [resultado=ação]
, isso significa que quando uma pesquisa do resolvedor na coluna à esquerda resultar em resultado
, então a ação
é executada. Se resultado
for precedido por !
, isso quer dizer que, se o resultado não for resultado
, a ação
deve ser executada. Para obter descrições dos resultados e ações possíveis, consulte a página do manual.
Agora, suponha que um processo esteja tentando resolver um número de porta para um nome de serviço. Ele leria a linha services
. A primeira fonte listada é NIS. NIS significa Network Information Service (às vezes apelidado de Páginas Amarelas). Este é um serviço antigo que permitia o gerenciamento central de coisas como usuários. Raramente é usado devido à sua fraca segurança. A coluna seguinte, [NOTFOUND=return]
, indica que se a pesquisa foi bem-sucedida, mas o serviço não foi encontrado, é preciso parar de procurar. Se a condição acima mencionada não se aplicar, ele usará arquivos locais.
Qualquer coisa à direita de #
é um comentário e é ignorado.
O arquivo /etc/resolv.conf
O arquivo /etc/resolv.conf
é usado para configurar a resolução do host via DNS. Algumas distribuições têm scripts de inicialização, daemons e outras ferramentas que gravam neste arquivo. Lembre-se disso ao editá-lo manualmente. Verifique a documentação de sua distribuição e de quaisquer ferramentas de configuração de rede, se esse for o seu caso. Algumas ferramentas, como o NetworkManager, deixam um comentário no arquivo informando que as alterações manuais serão sobrescritas.
Como no caso de /etc/nsswitch.conf
, existe uma página de manual associada ao arquivo. Ela pode ser acessada com o comando man resolv.conf
ou em https://man7.org/linux/man-pages/man5/resolv.conf.5.html.
O formato do arquivo é bastante simples. Na coluna da esquerda, temos a opção name
. O resto das colunas na mesma linha são os valores da opção.
A opção mais comum é nameserver
. Ela é usada para especificar o endereço IPv4 ou IPv6 de um servidor DNS. Na data em que esta lição foi escrita, era possível especificar até três servidores de nomes. Se o seu /etc/resolv.conf
não tiver a opção nameserver
, o sistema usará por padrão o servidor de nomes da máquina local.
Veja abaixo um exemplo simples, mas representativo de configurações que são comuns:
search lpi.org nameserver 10.0.0.53 nameserver fd00:ffff::2:53
A opção search
é usada para permitir pesquisas curtas. No exemplo, configuramos um único domínio para pesquisa, lpi.org
. Isso significa que qualquer tentativa de resolver um nome de host sem uma parte de domínio terá .lpi.org
incluído antes da pesquisa. Por exemplo, se pesquisarmos por um host chamado learning
, o resolvedor buscará por learning.lpi.org
. É possível configurar até seis domínios de pesquisa.
Outra opção comum é domain
. Ela é usada para definir o nome de domínio local. Se esta opção estiver ausente, o padrão é usar tudo após o primeiro .
no nome de host da máquina. Se o nome do host não contiver um .
, presume-se que a máquina faça parte do domínio raiz. Como no caso de search
, domain
pode ser usado para pesquisas curtas de nomes.
Lembre-se de que domain
e search
são mutuamente exclusivos. Se ambos estiverem presentes, será usada a última instância no arquivo.
Muitas opções podem ser definidas de forma a afetar o comportamento do resolvedor. Para configurá-las, use a palavra-chave option
, seguida pelo nome da opção a ser configurada e, se for o caso, um :
seguido pelo valor. Veja abaixo um exemplo de configuração da opção de tempo limite (timeout), ou seja, o período de tempo em segundos que o resolvedor espera por um servidor de nome antes de desistir:
option timeout:3
Existem outras opções para resolv.conf
, mas essas são as mais comuns.
O arquivo /etc/hosts
O arquivo /etc/hosts
é usado para resolver nomes para endereços IP e vice-versa. Há suporte a IPv4 e IPv6. A coluna da esquerda é o endereço IP, o resto são nomes associados a esse endereço. O uso mais comum de /etc/hosts
é para hosts e endereços nos quais o DNS não é possível, como endereços de loopback. No exemplo abaixo, são definidos os endereços IP dos componentes críticos da infraestrutura.
Eis um exemplo realístico de um arquivo /etc/hosts
:
127.0.0.1 localhost 127.0.1.1 proxy ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters 10.0.0.1 gateway.lpi.org gateway gw fd00:ffff::1 gateway.lpi.org gateway gw 10.0.1.53 dns1.lpi.org fd00:ffff::1:53 dns1.lpi.org 10.0.2.53 dns2.lpi.org fd00:ffff::2:53 dns2.lpi.org
systemd-resolved
O systemd inclui um serviço chamado systemd-resolved
. Ele fornece mDNS, DNS e LLMNR. Quando está em execução, ele escuta as solicitações de DNS em 127.0.0.53
. Ele não fornece um servidor DNS completo. Quaisquer solicitações de DNS que recebe são pesquisadas nos servidores configurados em /etc/systemd/resolv.conf
ou /etc/resolv.conf
. Se você deseja empregar o serviço, use resolve
para hosts
em /etc/nsswitch.conf
. Lembre-se de que o pacote do sistema operacional que possui a biblioteca systemd-resolution
pode não estar instalado por padrão.
Ferramentas de resolução de nomes
Existem muitas ferramentas de resolução de nomes disponíveis para os usuários do Linux. Esta lição cobre três delas. A primeira, getent
, é útil para ver como as solicitações do mundo real serão resolvidas. Outro comando é host
, que é ótimo para consultas de DNS simples. Um programa chamado dig
é prático para operações de DNS complexas que podem ajudar na resolução de problemas do servidor DNS.
O comando getent
O utilitário getent
é usado para exibir entradas de bancos de dados de serviços de nome. Ele é capaz de recuperar registros de qualquer fonte configurável por /etc/nsswitch.conf
.
Para usar o getent
, inclua o tipo de nome que deseja resolver após o comando e, opcionalmente, uma entrada específica a pesquisar. Se você especificar apenas o tipo de nome, o getent
tentará exibir todas as entradas referentes àqueke tipo de dados:
$ getent hosts 127.0.0.1 localhost 127.0.1.1 proxy 10.0.1.53 dns1.lpi.org 10.0.2.53 dns2.lpi.org 127.0.0.1 localhost ip6-localhost ip6-loopback $ getent hosts dns1.lpi.org fd00:ffff::1:53 dns1.lpi.org
A partir da versão 2.2.5 do glibc, é possível forçar o getent
a usar uma fonte de dados específica com a opção -s
. O exemplo abaixo demonstra isso:
$ getent -s files hosts learning.lpi.org ::1 learning.lpi.org $ getent -s dns hosts learning.lpi.org 208.94.166.198 learning.lpi.org
O comando host
host
é um programa simples para procurar entradas DNS. Sem opções, se host
receber um nome, ele retorna os conjuntos de registros A, AAAA e MX. Se um endereço IPv4 ou IPv6 for fornecido, ele produzirá o registro PTR, caso haja um disponível:
$ host wikipedia.org wikipedia.org has address 208.80.154.224 wikipedia.org has IPv6 address 2620:0:861:ed1a::1 wikipedia.org mail is handled by 10 mx1001.wikimedia.org. wikipedia.org mail is handled by 50 mx2001.wikimedia.org. $ host 208.80.154.224 224.154.80.208.in-addr.arpa domain name pointer text-lb.eqiad.wikimedia.org.
Se você estiver procurando por um tipo de registro específico, pode usar host -t
:
$ host -t NS lpi.org lpi.org name server dns1.easydns.com. lpi.org name server dns3.easydns.ca. lpi.org name server dns2.easydns.net. $ host -t SOA lpi.org lpi.org has SOA record dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300
host
também pode ser usado para consultar um servidor de nomes específico caso não se queira usar os que estão em /etc/resolv.conf
. Basta adicionar o endereço IP ou nome de host do servidor que se deseja usar como último argumento:
$ host -t MX lpi.org dns1.easydns.com Using domain server: Name: dns1.easydns.com Address: 64.68.192.10#53 Aliases: lpi.org mail is handled by 10 aspmx4.googlemail.com. lpi.org mail is handled by 10 aspmx2.googlemail.com. lpi.org mail is handled by 5 alt1.aspmx.l.google.com. lpi.org mail is handled by 0 aspmx.l.google.com. lpi.org mail is handled by 10 aspmx5.googlemail.com. lpi.org mail is handled by 10 aspmx3.googlemail.com. lpi.org mail is handled by 5 alt2.aspmx.l.google.com.
O comando dig
Outra ferramenta para consultar servidores DNS é o dig
. Esse comando é muito mais detalhado do que host
. Por padrão, dig
consulta os registros A. Ele provavelmente é prolixo demais para simplesmente buscar um endereço IP ou nome de host. O dig
funciona para pesquisas simples, mas é mais adequado para solucionar problemas de configuração do servidor DNS:
$ dig learning.lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> learning.lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63004 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: ca7a415be1cec45592b082665ef87f3483b81ddd61063c30 (good) ;; QUESTION SECTION: ;learning.lpi.org. IN A ;; ANSWER SECTION: learning.lpi.org. 600 IN A 208.94.166.198 ;; AUTHORITY SECTION: lpi.org. 86400 IN NS dns2.easydns.net. lpi.org. 86400 IN NS dns1.easydns.com. lpi.org. 86400 IN NS dns3.easydns.ca. ;; ADDITIONAL SECTION: dns1.easydns.com. 172682 IN A 64.68.192.10 dns2.easydns.net. 170226 IN A 198.41.222.254 dns1.easydns.com. 172682 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 170226 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 135 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Sun Jun 28 07:29:56 EDT 2020 ;; MSG SIZE rcvd: 266
Como vemos, o dig
fornece muitas informações. A saída é dividida em seções. A primeira seção exibe informações sobre a versão do dig
instalada e a consulta enviada, junto com as opções usadas para o comando. Em seguida vêm informações sobre a consulta e a resposta.
A seção seguinte mostra informações sobre as extensões EDNS usadas e a consulta. No exemplo, a extensão cookie é usada. O dig
está procurando um registro A para learning.lpi.org
.
A seção seguinte mostra o resultado da consulta. O número na segunda coluna é o TTL do recurso em segundos.
O restante da saída fornece informações sobre os servidores de nome do domínio, incluindo os registros NS para o servidor, junto com os registros A e AAAA dos servidores no registro NS do domínio.
Como host
, você pode especificar um tipo de registro com a opção -t
:
$ dig -t SOA lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> -t SOA lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16695 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: 185c67140a63baf46c4493215ef8906f7bfbe15bdca3b01a (good) ;; QUESTION SECTION: ;lpi.org. IN SOA ;; ANSWER SECTION: lpi.org. 600 IN SOA dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300 ;; AUTHORITY SECTION: lpi.org. 81989 IN NS dns1.easydns.com. lpi.org. 81989 IN NS dns2.easydns.net. lpi.org. 81989 IN NS dns3.easydns.ca. ;; ADDITIONAL SECTION: dns1.easydns.com. 168271 IN A 64.68.192.10 dns2.easydns.net. 165815 IN A 198.41.222.254 dns3.easydns.ca. 107 IN A 64.68.196.10 dns1.easydns.com. 168271 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 165815 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 94 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Sun Jun 28 08:43:27 EDT 2020 ;; MSG SIZE rcvd: 298
O dig tem muitas opções que permitem refinar a saída e a consulta enviada ao servidor. Essas opções começam com +
. Uma delas é a opção short
, que suprime todas as saídas, exceto o resultado:
$ dig +short lpi.org 65.39.134.165 $ dig +short -t SOA lpi.org dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300
Eis um exemplo de desativação da extensão EDNS cookie:
$ dig +nocookie -t MX lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> +nocookie -t MX lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47774 ;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 3, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;lpi.org. IN MX ;; ANSWER SECTION: lpi.org. 468 IN MX 0 aspmx.l.google.com. lpi.org. 468 IN MX 10 aspmx4.googlemail.com. lpi.org. 468 IN MX 10 aspmx5.googlemail.com. lpi.org. 468 IN MX 10 aspmx2.googlemail.com. lpi.org. 468 IN MX 10 aspmx3.googlemail.com. lpi.org. 468 IN MX 5 alt2.aspmx.l.google.com. lpi.org. 468 IN MX 5 alt1.aspmx.l.google.com. ;; AUTHORITY SECTION: lpi.org. 77130 IN NS dns2.easydns.net. lpi.org. 77130 IN NS dns3.easydns.ca. lpi.org. 77130 IN NS dns1.easydns.com. ;; ADDITIONAL SECTION: dns1.easydns.com. 76140 IN A 64.68.192.10 dns2.easydns.net. 73684 IN A 198.41.222.254 dns1.easydns.com. 76140 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 73684 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 2 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Mon Jun 29 10:18:58 EDT 2020 ;; MSG SIZE rcvd: 389
Exercícios Guiados
-
O que faz o comando abaixo?
getent group openldap
-
Qual a maior diferença entre o
getent
e as outras ferramentas apresentadas,host
edig
? -
Qual opção de
dig
ehost
é usada para especificar o tipo de registro que se deseja recuperar? -
Qual das opções a seguir é uma entrada correta de
/etc/hosts
?::1 localhost
localhost 127.0.0.1
-
Qual opção de
getent
é usada para especificar a fonte de dados a ser usada para realizar uma pesquisa?
Exercícios Exploratórios
-
Se o arquivo
/etc/resolv.conf
abaixo fosse alterado com um editor de texto, o que provavelmente aconteceria?# Generated by NetworkManager nameserver 192.168.1.20
As alterações serão sobrescritas pelo NetworkManager.
O NetworkManager atualizará sua configuração com as alterações realizadas.
As alterações não afetarão o sistema.
O NetworkManager será desabilitado.
-
O que significa a seguinte linha em
/etc/nsswitch.conf
?hosts: files [SUCCESS=continue] dns
-
Considerando o
/etc/resolv.conf
a seguir, por que o sistema não está resolvendo nomes através do DNS?search lpi.org #nameserver fd00:ffff::1:53 #nameserver 10.0.1.53
-
O que faz o comando
dig +noall +answer +question lpi.org
? -
Como passar por cima dos padrões de
dig
sem especificá-los na linha de comando?
Resumo
O comando getent
é uma ótima ferramenta para ver os resultados das chamadas do resolvedor. Para consultas DNS simples, host
é fácil de usar e produz uma saída direta. Se você precisa de informações detalhadas ou necessita ajustar uma consulta DNS, dig
é provavelmente a melhor opção.
Devido à capacidade de adicionar plug-ins de bibliotecas compartilhadas e configurar o comportamento do resolvedor, o Linux tem excelente suporte para a resolução de nomes e números de vários tipos. O programa getent
pode ser usado para resolver nomes graças às bibliotecas do resolvedor. host
e dig
permitem consultar os servidores DNS.
O arquivo /etc/nsswitch.conf
é empregado para configurar o comportamento do resolvedor. Você pode alterar as fontes de dados e adicionar lógicas condicionais simples para tipos de nome com múltiplas fontes.
O DNS é configurado editando-se /etc/resolv.conf
. Muitas distribuições têm ferramentas que gerenciam esse arquivo para você; portanto, consulte a documentação do seu sistema se as alterações manuais não persistirem.
O arquivo /etc/hosts
é usado para resolver nomes de host para IPs e vice-versa. Ele tipicamente é empregado para definir nomes, como localhost
, que não estão disponíveis através do DNS.
É possível deixar comentários nos arquivos de configuração abordados nesta lição. Qualquer texto à direita de #
é ignorado pelo sistema.
Respostas aos Exercícios Guiados
-
O que faz o comando abaixo?
getent group openldap
Ele lê
/etc/nsswitch.conf
, busca pelo grupoopenldap
nas fontes listadas e exibe informações a respeito dele caso o encontre. -
Qual a maior diferença entre o
getent
e as outras ferramentas apresentadas,host
edig
?getent
procura por nomes usando as bibliotecas do resolvedor, os outros simplesmente consultam o DNS. Ogetent
pode ser usado para a resolução de problemas em/etc/nsswitch.conf
e para configurar as bibliotecas de resolução de nomes que seu sistema está configurado para usar.host
edig
são usados para pesquisar registros de DNS. -
Qual opção de
dig
ehost
é usada para especificar o tipo de registro que se deseja recuperar?Ambos os programas usam
-t
para especificar o tipo de registro que se deseja consultar. -
Qual das opções a seguir é uma entrada correta de
/etc/hosts
entry?::1 localhost
X
localhost 127.0.0.1
::1 localhost
é a linha correta. A coluna da esquerda é sempre um endereço IPv4 ou IPv6. -
Qual opção de
getent
é usada para especificar a fonte de dados a ser usada para realizar uma pesquisa?A opção
-s
é usada para especificar a fonte de dados. Por exemplo:$ getent -s files hosts learning.lpi.org 192.168.10.25 learning.lpi.org $ getent -s dns hosts learning.lpi.org 208.94.166.198 learning.lpi.org
Respostas aos Exercícios Exploratórios
-
Se o arquivo
/etc/resolv.conf
abaixo fosse alterado com um editor de texto, o que provavelmente aconteceria?# Generated by NetworkManager nameserver 192.168.1.20
As alterações serão sobrescritas pelo NetworkManager.
X
O NetworkManager atualizará sua configuração com as alterações realizadas.
As alterações não afetarão o sistema.
O NetworkManager será desabilitado.
-
O que significa a seguinte linha em
/etc/nsswitch.conf
?hosts: files [SUCCESS=continue] dns
As pesquisas por nomes de host verificarão primeiro os arquivos de
/etc/hosts
e em seguida o DNS. Se uma entrada for encontrada nos arquivos e no DNS, a entrada no DNS será preferida. -
Considerando o
/etc/resolv.conf
a seguir, por que o sistema não está resolvendo nomes através do DNS?search lpi.org #nameserver fd00:ffff::1:53 #nameserver 10.0.1.53
Ambos os servidores DNS estão marcados como comentários e não há nenhum servidor DNS em execução no host local.
-
O que faz o comando
dig +noall +answer +question lpi.org
?Ele pesquisa o registro A de
lpi.org
e exibe apenas a consulta e a resposta. -
Como passar por cima dos padrões de
dig
sem especificá-los na linha de comando?Criando um arquivo
.digrc
em seu diretório inicial.