Estou executando dnsmasq
instalado como um NetworkManager
plugin na minha máquina Fedora 39 local. Tudo que preciso dnsmasq
é basicamente suporte para hosts
arquivos adicionais que posso organizar por tópicos.
Minhas configurações são:
/etc/dnsmasql.conf
:
user=dnsmasq
group=dnsmasq
interface=lo
bind-interfaces
conf-dir=/etc/NetworkManager/dnsmasq.d,*.conf
conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig
/etc/NetworkManager/conf.d/00-use-dnsmasq.conf
[main]
dns=dnsmasq
/etc/NetworkManager/dnsmasq.d/00-add-hosts.conf
log-queries
no-hosts
addn-hosts=/etc/hosts.d
address=/development/127.0.0.1
/etc/hosts.d
é um diretório com os arquivos hosts que contêm entradas que desejo "sinkhole":
0.0.0.0 1.example.com
0.0.0.0 2.example.com
...
dnsmasq
está instalado e funcionando, vejo o daemon em meus processos:
ps aux | grep dnsmasq
dnsmasq 61161 0.4 0.0 228096 4480 ? S 16:08 0:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/NetworkManager/dnsmasq.pid --listen-address=127.0.0.1 --cache-size=400 --clear-on-reload --conf-file=/dev/null --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d
Também vejo nos dnsmasq
logs de depuração que os arquivos dos hosts /etc/hosts.d
também são lidos:
Dec 30 16:18:40 fedora dnsmasq[61823]: chown of PID file /run/NetworkManager/dnsmasq.pid failed: Operation not permitted
Dec 30 16:18:40 fedora dnsmasq[61823]: DBus support enabled: connected to system bus
Dec 30 16:18:40 fedora dnsmasq[61823]: warning: no upstream servers configured
Dec 30 16:18:40 fedora dnsmasq[61823]: read /etc/hosts.d/private - 10 names
Dec 30 16:18:40 fedora dnsmasq[61823]: setting upstream servers from DBus
Dec 30 16:18:40 fedora dnsmasq[61823]: using nameserver 192.168.0.1#53(via wlp2s0)
Mas quando tento acessar domínios dos addn-hosts
arquivos hosts, eles não são resolvidos 0.0.0.0
como eu esperava. Esses arquivos hosts parecem ser ignorados.
Por outro lado, tudo o que eu adiciono ao sistema /etc/hosts
funciona conforme o esperado. Mesmo que eu tenha usado no-hosts
opções explicitamente na
dnsmasq
configuração e vejo que elas foram adicionadas à invocação do daemon.
Também vejo que dnsmasq
config é usado, porque a address=/development/127.0.0.1
linha funciona conforme o esperado:
$ ping -c 3 anything.development
PING anything.development (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.091 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.175 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.200 ms
É addn-hosts
que isso é ignorado de alguma forma.
Aqui está o meu /etc/resolv.conf
:
# Generated by NetworkManager
nameserver 127.0.0.1
options edns0 trust-ad
Anteriormente eu pensava que era isso systemd-resolved.service
que estava atrapalhando (pois anteriormente adicionou 127.0.0.53 ao meu resolv.conf
arquivo), mas agora que desabilitei o serviço:
systemctl status systemd-resolved.service
○ systemd-resolved.service - Network Name Resolution
Loaded: loaded (/usr/lib/systemd/system/systemd-resolved.service; disabled; preset: enabled)
Drop-In: /usr/lib/systemd/system/service.d
└─10-timeout-abort.conf
Active: inactive (dead)
Não tenho certeza do que há de errado com minhas configurações.
Olá e bem-vindo ao ServerFault, vrs! (Esta é minha primeira resposta e, creio, sua primeira pergunta?)
Você fez um bom trabalho ao descrever a situação, mas pode ser mais específico ao testar a resolução de nomes que está vendo. Você possui dig ou nslookup como ferramentas de linha de comando em seu sistema? Nesse caso, use-os para consultar diretamente o servidor de nomes na máquina, em vez de fazer qualquer coisa que você tenha feito.
Estou vendo que você não tem um servidor de nomes upstream definido em sua configuração (e ainda assim, obviamente, você está usando um servidor de nomes upstream). Suspeito que a resolução para os domínios na lista negra vem, na verdade, de seu upstream. Portanto, a primeira pergunta que faço é: minha instância dnsmasq local responde corretamente?
Aqui está o que o sucesso significa para mim:
Observe que o campo SERVER: da penúltima linha me garante que estou perguntando ao meu servidor local. Você pode especificar um nome de servidor ou endereço IP após a pergunta desta forma, o que mostra uma resolução normal (que é o que não queremos neste caso):
(Este sistema que estou usando aqui é bastante semelhante à sua configuração, mas 1) é uma máquina DNS/DHCP dedicada e 2) não tenho a complicação adicional de modularizar meu dnsmasq através do NetworkManager.)
O DNS pode ficar bastante complicado em situações como essa e não estou surpreso que nem você nem eu possamos ver imediatamente qual é o problema. Tente investigar especificamente o seu dnsmasq local e também adicione alguns detalhes sobre onde a resolução está ocorrendo, se não for no seu dnsmasq!
Obrigado por fazer uma boa pergunta. :)
Problema resolvido graças aos ótimos conselhos de @Tai Viinikka !
TLDR; Um servidor DNS
dnsmasq
executado em localhost não significa necessariamente que seja usado peloNetworkManager
, mesmo que isso/etc/resolv.conf
seja explicitamente indicado; Se a sua máquina local estiver usando o servidor DHCP do seu roteador, você também obteve as configurações do servidor DNS.TIL;
dig
usa um servidor DNS/etc/resolv.conf
por padrão, mesmo que uma conexão gerenciada peloNetworkManager
use o endereço do servidor DNS obtido do DHCP; daí a diferença comodig
e, digamos,curl
resolver o mesmo nome de host.Solução de problemas:
dnsmasq
está realmente funcionando conforme o esperado:Nome do host resolvido
0.0.0.0
(conforme indicado peloaddn-hosts
arquivo hosts) pelo127.0.0.1
(dnsmasq
servidor DNS local) conforme esperado.Por que então todas as solicitações de
curl
um navegador para o mesmo nome de host foram resolvidas não pelo meu DNS local dednsmasq
, mas, obviamente, por outro DNS upstream, apesar de/etc/resolv.conf
dizer:Isso significa que algo está substituindo as configurações de DNS. Devemos ser
NetworkManager
NetworkManager
está usando como DNS:Na verdade, em vez do que
/etc/resolv.conf
diz,NetworkManager
usa os endereços DNS do meu roteador WiFi. Isso ocorre porque uma conexão WiFI na minha máquina local usa asDHCP
configurações do roteador.dnsmasq
Antes de corrigir o DNS usado pelo
NetworkManager
, precisamos adicionar algum DNS upstream que será usado quando os arquivos hosts forem verificados. Esta é adnsmasq
aparência de toda a minha configuração agora:NetworkManager
configurações de conexão de:Abra
nm-connection-editor
(ou Configurações -> WiFi -> Rede à qual você está conectado Configurações) e entãoIPv4
:então para
IPv6
:IPv4
)Isso corresponde às mudanças em
/etc/NetworkManager/system-connections/YOUR-CONNECTION-NAME.nmconnection
:Agora, reinicie o
dnsmasq
e oNetworkManager
:e pronto!
NetworkManager
usa localhost como servidor DNS, todas as solicitações decurl
ou de um navegador da web são resolvidas usando-o, arquivos de hosts extras dednsmasq
sãoaddn-hosts
respeitados: