dnsmasq em virbr0 (libvirt) e gerenciador de rede

dnsmasq em virbr0 (libvirt) e gerenciador de rede

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 -lne 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.confe adicionar a linha dns=dnsmasqe 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 -lnsaí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.confe uma pasta /etc/NetworkManager/dnsmasq.d/onde os arquivos de configuração podem ser gravados. Parece que o último é para quando dns=dnsmasqestá definido e o dnsmasq escuta em 127.0.0.1, já que a edição /etc/dnsmasq.confnã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.confpode usar nomes de interface interface=eth0ou 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-interfacesao arquivo de configuração.

Como alternativa, no arquivo de configuração, especifique lista negra de interface com except-interface=virtbr*.

Fontes:

informação relacionada