Quero lidar dnsmasq
primeiro com as consultas DNS recebidas e encaminhar a pergunta somente systemd-resolved
se o próprio dnsmasq não tiver a resposta.
Para ser bem claro: eu sei como desabilitar systemd-resolved
o "DNSStubListener" do para que ele dnsmasq
seja o único servidor DNS em execução no meu sistema, mas não é isso que estou perguntando.
Até onde eu entendi, isso significa que preciso ter systemd-resolved
o stub resolver do 's rodando, mas também preciso ter certeza de que systemd-resolved
ele não responde à consulta DNS de entrada antes dnsmasq
. Mas como?
(Quanto ao motivo: quero usar o servidor DNS apontado pelo DHCP para tráfego "normal" da Internet, o que significa que não posso codificar servidores DNS upstream no dnsmasq
arquivo de configuração. Mas também quero ter dnsmasq
controle sobre bloqueio de DNS, nomes de host especiais para VMs em execução local, roteamento de parte, mas não de todo o tráfego por meio de uma conexão VPN ou situações semelhantes.)
Eu poderia usar a opção "DNSStubListener=no" para systemd-resolved
, mas também definir "DNSStubListenerExtra=....", com localhost como endereço IP, mas um número de porta não padrão, e usar esse endereço como dnsmasq
servidor DNS upstream primário de ? Esse tipo de configuração seria estável?
Editar (após respostas já fornecidas): Isso é no Ubuntu 24.04 Desktop.
Você não especificou qual versão do Ubuntu está usando. O seguinte é baseado no Ubuntu 24.04 Server.
Se eu entendi o que você quer fazer corretamente, você quer configurar o Dnsmasq como seu resolvedor DNS primário no localhost e usar
systemd-resolved
como seu servidor de encaminhamento em vez de quaisquer servidores de uplink. Assim, você quersystemd-resolved
encaminhar para quaisquer servidores de uplink, mas não armazenar em cache nenhuma consulta. Você quer, em última análise, que o cache seja deixado para o Dnsmasq .Então, algumas coisas precisam ser feitas:
127.0.0.1
na porta 53/etc/resolv.conf
por nenhum servidor de nomessystemd-resolved
como seu servidor de encaminhamento, que por sua vez usa quaisquer servidores de uplink fornecidos via DHCP./etc/resolv.conf
:127.0.0.1
como um servidor de nomes. Embora o Dnsmasq não faça referência a esse arquivo, ele é referenciado por muitos aplicativos ao fazer uma consulta DNS. Por exemplo,dig
eping
. Então você quer que esses aplicativos consultem o Dnsmasq via127.0.0.1
.systemd-resolved
:127.0.0.53
uma porta53
127.0.0.1
no porto5353
Supondo que o Dnsmasq já esteja instalado, comece parando ambos
systemd-resolved
ednsmasq
:1. Configurar
dnsmasq
Edite
/etc/default/dnsmasq
e defina o seguinte:Ambos precisam ser definidos mesmo que o
resolvconf
aplicativo não esteja instalado por padrão no Ubuntu 24.04 Server. Isso ocorre porque/sbin/resolvconf
ele é um symlink para/bin/resolvectl
. Para mais informações, veja a Nota abaixo.Edite
/etc/dnsmasq.conf
e defina o seguinte:bind-interfaces
é definido para que o serviço não escute em todos os endereços em todas as interfaces. Esta configuração é para o serviço escutar somente na interface de loopback e nenhuma interface externa. Além disso, o serviço escuta somente em127.0.0.1:53
em vez de0.0.0.0:53
.Da página de manual do Dnsmasq :
Inicie
dnsmasq
o serviço e verifique seu status:Verifique se ele está escutando na porta
53
em127.0.0.1
:2. Crie um novo
/etc/resolv.conf
Remover
/etc/resolv.conf
Crie um novo
/etc/resolv.conf
com o servidor de nomes Dnsmasq :3. Configurar
systemd-resolved
Edite
/etc/systemd/resolved.conf
e defina o seguinte:Isso desabilita o ouvinte Stub para
systemd-resolved
at127.0.0.53:53
e permite que ele escute no endereço127.0.0.1:5353
.Da página de manual resolved.conf(5) :
Inicie
systemd-resolved
o serviço e verifique seu status:Verifique se ele está escutando na porta
5353
em127.0.0.1
:Testando
Execute uma consulta. Se configurada corretamente, a consulta deve ser resolvida.
Para testar se está tudo certo,
systemd-resolved
você precisa reiniciar o DNSmasq para limpar o cache e depois pararsystemd-resolved
antes de executar a consulta novamente.Enfatizo isso, porque
systemd-resolved
será iniciado sempre que o Dnsmasq for reiniciado. Veja a Nota abaixo.Portanto:
Reinicie o Dnsmasq para limpar o cache
sudo systemctl restart dnsmasq
Parar
systemd-resolved
sudo systemctl stop systemd-resolved
Verifique se
systemd-resolved
não está em execuçãosystemctl status systemd-resolved
oups -aux | grep systemd-resolved
Execute novamente a consulta. O tempo deve expirar.
Armazenamento em cache
A pergunta original pedia para desabilitar o cache dentro
systemd-resolved
e deixá-lo exclusivamente para o Dnsmasq . Embora isso possa ser feito, pode haver um benefício em alternar para o outro lado. Como @kos indicou em um comentário,systemd-resolved
também é consultado via D-Bus, que seria capaz de tirar vantagem do cache se fosse habilitado parasystemd-resolved
.Portanto, é muito fácil configurar isso para que o cache seja habilitado
systemd-resolved
e desabilitado para o Dnsmasq .Edite
/etc/dnsmasq.conf
e defina o seguinte para desabilitar o cache do Dnsmasq :De acordo com a página de manual do Dnsmasq :
Edite
/etc/systemd/resolved.conf
e comente da seguinte forma para reativar o cache parasystemd-resolved
, que é a configuração padrão:Observação
Sempre que o serviço Dnsmasq é parado e iniciado, o serviço chama um script auxiliar,
/usr/share/dnsmasq/systemd-helper
. Isso faz referência a outro arquivo,/usr/share/dnsmasq/init-system-common
. Sempre que o Dnsmasq é parado,/sbin/resolvconf
é chamado com o seguinte:Observe que
/sbin/resolvconf
é chamado e, como mencionei anteriormente,/sbin/resolvconf
é um link simbólico para/bin/resolvctl
.Portanto, como
resolvectl
é um componente desystemd-resolved
, ele iniciarásystemd-resolved
. Mais informações podem ser encontradas aqui .Menciono isso porque, ao testar, você verá que ele
systemd-resolved
será iniciado automaticamente, sem que você saiba.Curiosamente,
/sbin/resolvconf
também é chamado ao iniciar o serviço Dnsmasq .Mas se você se lembra, nós definimos
DNSMASQ_EXCEPT="lo"
em/etc/default/dnsmasq
. Como tal,/sbin/resolvconf
não é chamado ao iniciar o Dnsmasq , mas seria se this não fosse definido.Se você já viu o seguinte erro ao analisar a saída de
systemctl status dnsmasq
, isso ocorre porqueDNSMASQ_EXCEPT="lo"
não está definido (comentado) e está tentando registrar as configurações de DNS associadas ao dispositivo de loopback, o que não consegue fazer.Este erro pode ser visto executando o comando diretamente:
Editar: Uma resposta muito mais elaborada foi dada acima Resposta original abaixo
Sim, pareceu funcionar.
Ou seja, eu fiz isso:
Em
/etc/systemd/resolved.conf.d/dnsmasqcompatibility.conf
:E em /etc/dnsmasq.conf:
Ao digitar isso em um terminal
host www.google.com 127.0.0.1
, obtive isto:E isso foi em
/var/log/dnsmasq.log
:(e assim por diante)
Também pude confirmar que, ao interromper o
systemd-resolved
serviço, as pesquisas de DNS expiraram.Eu provavelmente também deveria adicionar
no-resolv
,/etc/dnsmasq.conf
para forçar todas as consultas a serem passadas para a porta 5053, mas não sei se isso faria alguma diferença, já que estaria usando os servidores DNS conhecidos desystemd-resolved
qualquer maneira, independentemente se os endereços IP foram obtidos de um arquivo ou de um segundo servidor DNS (por meio de consulta encaminhada).Deixe systemd-resolved lidar com servidores DHCP e usar server=127.0.0.53 no Dnsmasq. Tenha /etc/resolv.conf apontado para 127.0.0.1 onde o Dnsmasq está escutando. Mas você teria problemas de systemd-resolved, por exemplo, validação DNSSec com bugs. Você foi avisado.