Evite consultas DNS adicionais quando a "pesquisa" não está definida

3

O host em questão está executando o Arch Linux com o nome do host configurado como foo.example.org . Não há diretiva search em /etc/resolv.conf .

Se eu ping example.com ou curl example.com ou wget example.com ( example.com não existe, NXDOMAIN), haveria quatro consultas DNS, um par de consultas A / AAAA para example.com e um par de A / AAAA consultas para example.com.example.org .

Estou surpreso ao descobrir que o resolvedor glibc tentaria example.com.example.org mesmo quando não houver uma diretiva search em /etc/resolv.conf .

Como eu poderia parar isso? Possíveis soluções / soluções alternativas que tentei:

  • Altere o nome do host de foo.example.org para foo . As consultas adicionais para example.com.example.org não são enviadas. Mas eu não quero mudar o nome do host.
  • Adicione uma diretiva search invalid a /etc/resolv.conf . As consultas adicionais para example.com.example.org não são enviadas. Mas example.com.invalid são enviados em vez disso. (Observe que. Inválidos são TLD reservados da ICANN)

Como eu poderia fazer o processo de resolução de example.com parar na primeira tentativa (NXDOMAIN) sem continuar tentando example.com.something-else ?

    
por Zhuoyun Wei 12.04.2018 / 19:43

2 respostas

3

Em primeiro lugar, esta é a seção relevante de resolv.conf(5) :

   domain Local domain name.
          Most queries for names within this domain can  use  short  names
          relative to the local domain.  If set to '.', the root domain is
          considered.  If no domain entry is present, the domain is deter‐
          mined  from  the  local hostname returned by gethostname(2); the
          domain part is taken to  be  everything  after  the  first  '.'.
          Finally,  if  the  hostname  does not contain a domain part, the
          root domain is assumed.

   search Search list for host-name lookup.
          The search list is normally determined  from  the  local  domain
          name;  by default, it contains only the local domain name.  This
          may be changed by listing the desired domain search path follow‐
          ing the search keyword with spaces or tabs separating the names.
          Resolver queries having fewer than ndots dots (default is 1)  in
          them  will  be attempted using each component of the search path
          in turn until a match is found.  For environments with  multiple
          subdomains  please  read  options ndots:n below to avoid man-in-
          the-middle attacks and unnecessary  traffic  for  the  root-dns-
          servers.  Note that this process may be slow and will generate a
          lot of network traffic if the servers for the listed domains are
          not local, and that queries will time out if no server is avail‐
          able for one of the domains.

          The search list is currently limited to six domains with a total
          of 256 characters.

Ou seja, search não está simplesmente desativado por padrão; se search não for especificado, ele usará domain ou, se isso também não for especificado, usará qualquer parte do domínio presente em que gethostname(2) retorna (ou seja, qualquer coisa após o primeiro ponto no nome de host do sistema local). p>

A implementação real é um pouco estranha, no entanto. O que acontece na prática (como observado em glibc 2.26) é este:

Se não houver search , não domain e o nome do host de acordo com gethostname(2) não tiver parte de domínio, a pesquisa estará desativada.

Se, por outro lado, você especificar search . (ou domain . e não search ) ele ainda procura, mas o resultado retornado será o mesmo que se não o fizesse, ele apenas torna redundante o mesmo consultas. (Bug?)

Esse é um comportamento estranho, no qual "o domínio raiz é assumido" leva a uma busca desabilitada enquanto a especificação explícita do domínio raiz gera consultas redundantes.


Quanto a como definir o nome do host do sistema, existem diferentes escolas de pensamento.

Usar o FQDN através da placa é provavelmente a abordagem mais óbvia nos dias de hoje, pois elimina qualquer possível ponto de interrogação sobre qual domínio será usado para construir o FQDN.

Se você tiver o nome do host do sistema configurado apenas para o nome do host real (sem domínio), obterá valores diferentes de gethostname(2) e gethostname(3) (o último gera dinamicamente o FQDN, conforme necessário, usando o resolvedor uma entrada em /etc/hosts para o sistema local). Dependendo do que um aplicativo solicitar, ele obterá apenas o nome do host ou o FQDN, como pode ser visto com, por exemplo, hostname vs hostname --fqdn .

Menos esperado é como a escolha acima também afeta a capacidade de desativar search .
Mas, por mais estranho que pareça, a linha de fundo parece ser que, se você quiser desabilitar globalmente a pesquisa, se os nomes que você procura são explicitamente absolutos (possuem um ponto final) ou não, as versões atuais do glibc parecem desabilitar corretamente a pesquisa se gethostname(2) retorna um nome de host sem um domínio.

    
por 13.04.2018 / 00:07
2

O comportamento para anexar o domínio do hostname se nenhum domínio ou pesquisa for adicionado ao /etc/resolv.conf é esperado e documentado na página man do resolv.conf.

Você faz com que o resolvedor pare de tratar seu nome de host não totalmente qualificado adicionando um ponto no final para declarar explicitamente que está totalmente qualificado.

Nome do host no exemplo.org, nenhum domínio no /etc/resolv.conf:

[root@test ~]# hostname
test.example.org
[root@test ~]# cat /etc/resolv.conf
nameserver 8.8.8.8

Pesquisa de nome de host não qualificada tem example.org anexado:

[root@test ~]# ping -c 1 www
PING www.example.org (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=57 time=82.8 ms

--- www.example.org ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 82.891/82.891/82.891/0.000 ms

Adicionar um ponto no final impede:

[root@test ~]# ping -c 1 www.
ping: www.: Name or service not known
    
por 12.04.2018 / 21:50