Como desativar o DNS resolvido pelo sistema e resolver o DNS com dnsmasq?

Respostas:

35

dnsmasq os pacotes ainda estão disponíveis nas versões 16.10 e 17.04.

  1. Instale dnsmasqe dependências (ou pelo menos baixe seus pacotes) antes de desativarsystemd-resolved :

    sudo apt-get install dnsmasq
    
  2. Desabilite systemd-resolvede verifique se dnsmasqestá em execução:

    sudo systemctl stop systemd-resolved
    sudo systemctl disable systemd-resolved
    
    systemctl status dnsmasq
    
  3. Tempere dnsmasqa gosto. Após aplicar suas configurações, reinicie dnsmasq:

    sudo systemctl stop dnsmasq
    sudo systemctl start dnsmasq
    

Após a etapa 2, você pode ficar sem um resolvedor do sistema em funcionamento até a etapa 3 ser concluída. Pode ser necessário reiniciar o subsistema de rede (ou simplesmente reiniciar) para começar a dnsmasqfuncionar com as configurações padrão. Nos meus testes, adicionar um servidor DNS conhecido /etc/dnsmasq.confe reiniciá-lo dnsmasqfoi suficiente para fazê-lo funcionar em um ambiente de liveCD.

quixotesco
fonte
Ótima resposta e aparentemente a única solução ao desativar o NetworkManager não é aceitável!
bogl
3
Para mim, esta foi uma grande resposta, mas também exigiu os passos adicionais de resposta de @ blabla, acrescentando dns=dnsmasqconfig para/etc/NetworkManager/NetworkManager.conf
Roberto Tyley
O mesmo aqui. Depois de lutar com a mudança resolvida pelo sistema e sem ligação para o dnsmasq, ele fez o truque no ubuntu 17.10. Eu tive que usar as adições de blabla embora.
Alberto L. Bonfiglio
17

Além da resposta de @quixotic:

Verifique se você possui /etc/NetworkManager/NetworkManager.conf:

[main]
dns=dnsmasq

se você precisar adicioná-lo, reinicie o NetworkManager assim:

sudo systemctl restart NetworkManager

e /etc/resolv.confprecisa ser um link simbólico para /var/run/NetworkManager/resolv.conf. poderia ser feito assim

sudo rm /etc/resolv.conf; sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
blabla
fonte
Na verdade, eu o configurei dns=defaulte funciona bem porque tenho os servidores de nomes definidos pelo NetworkManager em vez de serem definidos no dnsmasq; isso funciona para mim - o NM obtém os servidores de nomes das configurações definidas na configuração do NM do KDE através da bandeja do sistema. Eu uso IP fixo na minha rede doméstica FWIW.
pbhj
1
Esta etapa foi uma adição necessária à resposta do @ quixotic para mim (ubuntu 17.04, instalação completa, não LiveCD).
Roberto Tyley
0

De acordo com o manual do systemd-resolved , o systemd-resolved fornece serviços de resolução de nomes por meio de três interfaces diferentes:

  1. "APIs com recursos completos e resolvidos pelo sistema expostos no barramento"
  2. "um ouvinte de stub DNS local no endereço IP 127.0.0.53 na interface de loopback local"
  3. A API glibc getaddrinfo (3), conforme definida pelo RFC3493 e suas funções relacionadas ao resolvedor, incluindo gethostbyname (3). Essa API é amplamente suportada, inclusive além da plataforma Linux. No seu formato atual, ele não expõe as informações de status de validação DNSSEC no entanto, e é apenas síncrono. Essa API é suportada pelo glibc Name Service Switch (nss (5)). O uso do módulo NSS da glibc nss-resolve (8) é necessário para permitir que as funções do resolvedor NSS da glibc resolvam os nomes de host via resolvido pelo sistema.

Parece que as duas primeiras interfaces não interferem na resolução normal do DNS e, para mim, o problema provavelmente residirá na terceira.

No manual do nss-resolve :

Para ativar o módulo NSS, adicione "resolve" à linha que começa com "hosts:" em /etc/nsswitch.conf. Especificamente, é recomendável colocar "resolve" no início da linha "hosts:" do /etc/nsswitch.conf (mas após as entradas "arquivos" ou "minhas máquinas"), logo antes da entrada "dns", se existir, seguida de "[! UNAVAIL = return]", para garantir que as consultas DNS sempre sejam roteadas via systemd-resolved (8) se estiver em execução, mas sejam roteadas para nss-dns se este serviço não estiver disponível

Portanto, o que é necessário é fazer com que "dns" preceda "resolve" no "host:" linha de /etc/nsswitch.conf . E então getaddrinfodeve simplesmente aderir ao /etc/resolv.conf .

Essa solução evita apenas que o sistema resolvido processe todas as solicitações de resolução de DNS e não se restringe a um gerenciador de rede específico. E também garante que o serviço LLMNR e mDNS esteja funcionando normalmente.

(Não estou familiarizado com o funcionamento da resolução de nomes no Linux e também não tenho certeza sobre o que entendi nestes manuais. Por favor, indique se eu entendi algo errado. Thx :))

Dummmy
fonte
0

Para o (X) Ubuntu 18.04 (veja minha resposta em stackexchange ).

Aqui está uma cópia (devo fazer uma cópia?)

Aqui está a solução para (X) Ubuntu 18.04 Bionic.

Instale o dnsmasq

sudo apt install dnsmasq

Desative o ouvinte resolvido pelo sistema na porta 53 (não toque em /etc/systemd/resolved.conf, pois pode ser substituído na atualização):

$ cat /etc/systemd/resolved.conf.d/noresolved.conf 
[Resolve]
DNSStubListener=no

e reinicie

$ sudo systemctl restart systemd-resolved

(alternativamente, desative-o completamente por $ sudo systemctl disable systemd-resolved.service)

Exclua /etc/resolv.conf e crie novamente. Isso é importante, porque resolv.conf é um link simbólico para /run/systemd/resolve/stub-resolv.conf por padrão. Se você não excluir o link simbólico, o arquivo será substituído pelo systemd na reinicialização (mesmo que tenhamos desabilitado o systemd-resolved!). O NetworkManager (NM) também verifica se é um link simbólico para detectar a configuração resolvida pelo sistema.

$ sudo rm /etc/resolv.conf
$ sudo touch /etc/resolv.conf

Desative a substituição do /etc/resolv.conf pelo NM (também existe uma opção rc-manager, mas ela não funciona, apesar de ser descrita em um manual):

$ cat /etc/NetworkManager/conf.d/disableresolv.conf 
[main]
dns=none

e reinicie-o:

$ sudo systemctl restart NetworkManager

Diga ao dnsmasq para usar o resolv.conf do NM:

$ cat /etc/dnsmasq.d/nmresolv.conf 
resolv-file=/var/run/NetworkManager/resolv.conf

e reinicie-o:

$ sudo systemctl restart dnsmasq

Use dnsmasq para resolver:

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1
Sena
fonte