O DNS no 127.0.0.53 do systemd está ignorando algumas pesquisas

14

O DNS do systemd, estimado em 127.0.0.53, parece estar funcionando, exceto quando eu consulta máquinas locais por nome. Mas se eu os procurar e especificar especificamente o servidor DNS local (meu roteador), receberei a resposta correta. Mas o arquivo de configuração diz que também está usando o roteador como o endereço de pesquisa. Alguma ideia?

Estou executando o Ubuntu 18.04 no meu laptop Dell.

Resultados incorretos:

$ nslookup web1

Server:     127.0.0.53
Address:    127.0.0.53#53

** server can't find web1: SERVFAIL

Também falha

$ nslookup -i wlp3s0 web1
nslookup: couldn't get address for 'web1': not found

Resultados corretos:

$ nslookup web1 192.168.1.1

Server:     192.168.1.1
Address:    192.168.1.1#53

Name:   web1
Address: 192.168.1.107

Informações de configuração systemd-resolve

$ systemd-resolve --status

Global
          DNSSEC NTA: 10.in-addr.arpa
                      16.172.in-addr.arpa
                      168.192.in-addr.arpa
                      17.172.in-addr.arpa
                      18.172.in-addr.arpa
                      19.172.in-addr.arpa
                      20.172.in-addr.arpa
                      21.172.in-addr.arpa
                      22.172.in-addr.arpa
                      23.172.in-addr.arpa
                      24.172.in-addr.arpa
                      25.172.in-addr.arpa
                      26.172.in-addr.arpa
                      27.172.in-addr.arpa
                      28.172.in-addr.arpa
                      29.172.in-addr.arpa
                      30.172.in-addr.arpa
                      31.172.in-addr.arpa
                      corp
                      d.f.ip6.arpa
                      home
                      internal
                      intranet
                      lan
                      local
                      private
                      test

Link 3 (wlp3s0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 192.168.1.1
          DNS Domain: wp.comcast.net

Link 2 (enp2s0)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no

Informações de configuração NetworkManager

$ cat /etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=false

[device]
wifi.scan-rand-mac-address=no

Então, como faço para que o nslookup retorne a resposta correta? O link 3 parece ser a informação correta (minha conexão wifi) e meu DNS no roteador está retornando a resposta correta, mas o cache local nunca tenta procurar o endereço (ou assim parece).

Schworak
fonte
Confira esta postagem e veja se isso resolve o seu problema: askubuntu.com/questions/1034064/…
Eu não tenho dns = dnsmasq no meu arquivo de configuração. Estou atualizando minha pergunta para mostrar isso.
26418 schworak
Qual versão do Ubuntu você está executando e também pode atualizar sua postagem com a configuração de IP?
Estou executando o Ubuntu 18.04 em um laptop Dell.
28418 schworak
você poderia plz tentarnslookup -i wlp3s0 web1
cmak.fr 28/05

Respostas:

9

Seu arquivo resolv.conf não estava apontando para o lugar errado - ../run/systemd/resolve/stub-resolv.conf é para onde deveria apontar por padrão.

O problema é que systemd-resolvednão passa nomes não pontilhados para o DNS. Aparentemente, isso está funcionando "como projetado". Veja este problema do github que afirma que "resolvido nunca permitirá que pesquisas de rótulo único vazem no DNS unicast".

Se você concorda ou não com o raciocínio nessa edição github, não é uma maneira de corrigir isso. Nem sequer é necessário fazer alterações na configuração padrão da sua máquina Ubuntu:

  1. Primeiro, o DNS da sua LAN deve ter um nome de domínio.

    Se você estiver usando o dnsmasq, adicione o seguinte /etc/dnsmasq.confno servidor DNS:

    expand-hosts
    domain=your-domain # replace "your-domain" with domain of your choice
    

    Agora você deve conseguir resolver os nomes de host da LAN se adicionar o domínio:

    nslookup web1.your-domain
    
  2. Segundo, verifique se o nome do domínio da sua LAN também está definido no servidor DHCP, se for diferente do servidor DNS. No meu servidor DHCP (meu roteador), essa configuração é chamada apenas de "Nome de Domínio".

    Se você renovar sua concessão de DHCP na sua caixa Ubuntu, deverá ver uma diretiva de pesquisa em /run/systemd/resolve/stub-resolv.conf:

    nameserver 127.0.0.53
    search your-domain
    

Agora, olhando para cima, web1será expandido para web1.your-domain, o que resolverá o uso do DNS.

$ nslookup web1
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   web1.your-domain
Address: 192.168.1.107

Observe que se você usar em digvez de nslookup, dignão usará o caminho de pesquisa por padrão - use sua +searchopção para habilitá-lo.

Laurence Gonsalves
fonte
Antes de reiniciar, consulte web1.mydomain.com. Mas é claro que procurar apenas web1 não funcionou. Então, eu reiniciei e, durante toda a minha vida, não tenho idéia de onde ele está escolhendo o domínio da Comcast, mas agora, se eu pesquisar na web1, ele responde com o IP correto, mas mostra o domínio da comcast em vez do meu domínio. Resolve, então eu não estou muito preocupado, mas que diabos ????
schworak
@schworak Weird! O seu servidor DHCP também é seu modem Comcast? Você vê esse domínio aparecendo no /etc/resolv.confou no resultado de um nmcli -g allou de systemd-resolve --status? Talvez tente analisar o que está em sua concessão de DHCP ?
Laurence Gonsalves
Não é o modem da comcast. Eu tenho um roteador SysLink com o DDWRT em execução. As configurações de comcast são totalmente substituídas. O nome do comcast aparece no arquivo resolv.conf que é gerado automaticamente na inicialização. Não estou muito preocupado com isso, mas é estranho.
schworak
@LaurenceGonsalves Muito obrigado pelo link da edição do github. Eu havia encontrado soluções alternativas para o problema, mas isso realmente me ajudou a descobrir o problema raiz.
Gregory Arenius 15/03/19
19

Encontrei a correção que funcionou para mim.

meu arquivo resolv.conf estava apontando para o lugar errado. Isso parece um bug no Ubuntu, como aconteceu no meu laptop (a máquina em que notei esse problema) e em uma nova instalação do Ubuntu 18.04 Server.

O padrão

$ ls -l /etc/resolv.conf

lrwxrwxrwx 1 root root 39 Apr 26 12:07 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

Eu apaguei isso e apontei para o arquivo correto. Após a reinicialização, isso resolveu meu problema. E até consegui mudar de rede no meu laptop e o DNS mudou corretamente. É claro que em redes externas não consigo resolver nenhuma das minhas máquinas locais, mas isso é esperado. Assim que eu volto à minha rede local, todas as máquinas locais resolvem corretamente porque meu roteador é o DNS.

O conserto

$ sudo rm -f /etc/resolv.conf
$ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
$ ls -l /etc/resolv.conf

lrwxrwxrwx 1 root root 32 May 29 08:48 /etc/resolv.conf -> /run/systemd/resolve/resolv.conf

$ sudo reboot

Depois disso, tudo funcionou como eu esperava e o 127.0.0.53 não está mais sendo usado.

Os resultados corretos

$ nslookup web1

Server:     192.168.1.1
Address:    192.168.1.1#53

Name:   web1
Address: 192.168.1.107

$ nslookup google.com

Server:     192.168.1.1
Address:    192.168.1.1#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.7.174
Name:   google.com
Address: 2607:f8b0:4004:80e::200e
Schworak
fonte
Por favor, reporte esse bug usando ubuntu-bug resolvconf.
Chai T. Rex
Quando começo a enviá-lo, diz resolvconf (não instalado). Resolvconf e systemd-resolve são a mesma coisa?
31418 schworak
systemd-resolveé fornecido pelo systemdpacote , então tente ubuntu-bug systemd.
Chai T. Rex
Obrigado! Eu nunca tinha usado esse recurso de relatório de erros antes. Muito agradável.
schworak
1
Uau, isso é loucura. Obrigado. Este bug foi corrigido? É um bug específico do Docker? Eu acho que o resolv.confestá configurado dessa maneira para o DNS da rede de ponte docker, certo?
void.pointer