Quero executar o dnsmasq em minha máquina local para configurar um curinga para resolver 127.0.0.1 para fins de teste.
No entanto, quando iniciei o dnsmasq com o systemd, recebi a seguinte mensagem de erro:
[root@dhcppc4 ~]# systemctl status dnsmasq -l
● dnsmasq.service - DNS caching server.
Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Fri 2015-10-09 21:49:58 BST; 14s ago
Process: 2652 ExecStart=/usr/sbin/dnsmasq -k (code=exited, status=2)
Main PID: 2652 (code=exited, status=2)
Oct 09 21:49:58 dhcppc4 systemd[1]: Started DNS caching server..
Oct 09 21:49:58 dhcppc4 systemd[1]: Starting DNS caching server....
Oct 09 21:49:58 dhcppc4 dnsmasq[2652]: dnsmasq: failed to create listening socket for port 53: Address already in use
Oct 09 21:49:58 dhcppc4 systemd[1]: dnsmasq.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Oct 09 21:49:58 dhcppc4 systemd[1]: Unit dnsmasq.service entered failed state.
Oct 09 21:49:58 dhcppc4 systemd[1]: dnsmasq.service failed.
Confuso sobre como a porta 53 é usada sem nenhum servidor DNS atual em execução (e confirmado com dig @127.0.0.1
), executei netstat -ln
e encontrei um processo escutando na porta 53 no endereço 192.168.122.1
:
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
udp 0 0 192.168.122.1:53 0.0.0.0:*
Um ifconfig mostra que 192.168.122.1
é a interface virtual virbr0.
Depois de uma rápida pesquisa no Google e no wiki, entendo que a libvirt fornece rede virtual ao host para abstrair interfaces físicas. Libvirt usa um switch de rede virtual através do qual todo o tráfego é roteado[1]. O switch de rede virtual padrão, virbr0, é criado quando o daemon é iniciado pela primeira vez.
Posso então confirmar que posso enviar consultas via DIG para dnsmasq nesta interface:
[grobinson@dhcppc4 ~]$ dig @192.168.122.1 +short
a.root-servers.net.
j.root-servers.net.
m.root-servers.net.
b.root-servers.net.
i.root-servers.net.
k.root-servers.net.
l.root-servers.net.
d.root-servers.net.
g.root-servers.net.
c.root-servers.net.
h.root-servers.net.
e.root-servers.net.
f.root-servers.net.
Questão 1: Não entendo o motivo de o dnsmasq escutar nesta interface virtual. Para /etc/resolv.conf, posso ver que os servidores DNS configurados no servidor DHCP informam à máquina para direcionar consultas aos servidores DNS do Google. Qual é a sua utilidade?
# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 8.8.4.4
Acho que posso editar /etc/NetworkManager/NetworkManager.conf
e adicionar a linha dns=dnsmasq
e reiniciar o gerenciador de rede com o systemd. A partir daqui, o gerenciador de rede é configurado para direcionar consultas ao dnsmasq no endereço de loopback e pode ser visto com uma simples chamada para dig:
[grobinson@dhcppc4 ~]$ dig @127.0.0.1 +short
l.root-servers.net.
g.root-servers.net.
i.root-servers.net.
...
A netstat -ln
saída agora mostra dois soquetes vinculados e escutando na porta 53:
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
Questão 2: como é que o gerenciador de rede pode iniciar o dnsmasq em 127.0.0.1 e eu não consigo com o systemctl? Isso ocorre porque a configuração padrão está tentando escutar todas as interfaces, o que falha no virbr0? Só preciso indicar a interface desejada?
Questão 3: Parece que existem duas opções de configuração para dnsmasq: /etc/dnsmasq.conf
e uma pasta /etc/NetworkManager/dnsmasq.d/
onde os arquivos de configuração podem ser gravados. Parece que o último é para quando dns=dnsmasq
está definido e o dnsmasq escuta em 127.0.0.1, já que a edição /etc/dnsmasq.conf
não tem efeito nas consultas para @127.0.0.1. O primeiro poderia ser para dnsmasq na libvirt?
Responder1
Por padrão, libvirt inicia uma instância dnsmasq para cada uma de suas pontes de interface virtual. Isso é feito para fornecer serviço DHCP às VMs em execução em uma rede virtual.
http://wiki.libvirt.org/page/VirtualNetworking
Essencialmente, a ponte virbr é criada pela libvirt toda vez que você ativa uma VM usando as configurações padrão. Se quiser evitar que isso aconteça, você mesmo precisa criar a ponte antes de iniciar uma VM e, em seguida, iniciá-la no modo "ponte", especificando sua ponte personalizada como argumento. Aqui está uma página de manual que explica isso muito bem. Veja a opção --network:
https://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatvirtinstalloptions.htm
Cada vez que você cria uma "rede virtual" na libvirt, ela também inicia uma instância do dnsmasq para ela. Então, novamente, você precisa parar de usar as redes virtuais da libvrt e usar o manual.
Responder2
Se você deseja que suas alterações locais em /etc/hosts sejam propagadas para suas VMs usando a mesma interface, você pode simplesmente SIGHUP no processo libvirt local.
Responder3
Configure sua instância dnsmasq para uma lista explícita de interfaces que você deseja escutar.
Você /etc/dnsmasq.conf
pode usar nomes de interface interface=eth0
ou IP de interface listen-address=192.168.0.1
. Mesmo com este conjunto, o dnsmasq irá se ligar de forma útil a todas as interfaces, então desabilite isso adicionando bind-interfaces
ao arquivo de configuração.
Como alternativa, no arquivo de configuração, especifique lista negra de interface com except-interface=virtbr*
.
Fontes: