dnsmasq en virbr0 (libvirt) y administrador de red

dnsmasq en virbr0 (libvirt) y administrador de red

Quiero ejecutar dnsmasq en mi máquina local para configurar un comodín para resolver en 127.0.0.1 con fines de prueba.

Sin embargo, cuando fui a iniciar dnsmasq con systemd recibí el siguiente mensaje de error:

[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.

Confundido en cuanto a cómo se toma el puerto 53 sin un servidor DNS actual en ejecución (y lo confirmé con dig @127.0.0.1), ejecuté netstat -lny encontré un proceso escuchando en el puerto 53 en la dirección 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:* 

Un ifconfig muestra que 192.168.122.1es la interfaz virtual virbr0.

Después de una búsqueda rápida en Google y wiki, entiendo que libvirt proporciona redes virtuales al host para abstraer interfaces físicas. Libvirt utiliza un conmutador de red virtual a través del cual se enruta todo el tráfico.[1]. El conmutador de red virtual predeterminado, virbr0, se crea cuando el demonio se inicia por primera vez.

Luego puedo confirmar que puedo enviar consultas a través de DIG a dnsmasq en esta interfaz:

[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.

Pregunta 1: No entiendo la razón detrás de que dnsmasq escuche en esta interfaz virtual. Para /etc/resolv.conf puedo ver que los servidores DNS configurados en el servidor DHCP le dicen a la máquina que dirija las consultas a los servidores DNS de Google. ¿Cuál es su uso?

# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 8.8.4.4

Encuentro que puedo editar /etc/NetworkManager/NetworkManager.confy agregar la línea dns=dnsmasqy luego reiniciar el administrador de red con systemd. A partir de aquí, el administrador de red está configurado para dirigir consultas a dnsmasq en la dirección de bucle invertido y se puede ver con una simple llamada a excavar:

[grobinson@dhcppc4 ~]$ dig @127.0.0.1 +short
l.root-servers.net.
g.root-servers.net.
i.root-servers.net.
...

El netstat -lnresultado ahora muestra dos sockets vinculados y escuchando en el puerto 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 

Pregunta 2: ¿Cómo es que el administrador de red puede iniciar dnsmasq en 127.0.0.1 y yo no puedo con systemctl? ¿Es porque la configuración predeterminada intenta escuchar en todas las interfaces, lo que falla para virbr0? ¿Solo necesito indicar la interfaz deseada?

Pregunta 3: Parece que hay dos opciones de configuración para dnsmasq: /etc/dnsmasq.confy una carpeta /etc/NetworkManager/dnsmasq.d/donde se pueden escribir los archivos de configuración. Parece que esto último es para cuando dns=dnsmasqestá configurado y dnsmasq escucha en 127.0.0.1 ya que la edición /etc/dnsmasq.confno tiene efecto en las consultas a @127.0.0.1. ¿Podría el primero ser para dnsmasq en libvirt?

Respuesta1

De forma predeterminada, libvirt inicia una instancia de dnsmasq para cada uno de sus puentes de interfaz virtual. Esto se hace para proporcionar servicio DHCP a las máquinas virtuales que se ejecutan en una red virtual.

http://wiki.libvirt.org/page/VirtualNetworking

Básicamente, libvirt crea el puente virbr cada vez que enciende una VM usando la configuración predeterminada. Si desea evitar que esto suceda, debe crear el puente usted mismo antes de iniciar una máquina virtual y luego iniciarla en modo "puente", especificando su puente personalizado como argumento. Aquí hay una página de manual que lo explica bastante bien. Mire debajo de la opción --network:

https://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatvirtinstalloptions.htm

Cada vez que crea una "red virtual" en libvirt, también inicia una instancia de dnsmasq para ella. Entonces, nuevamente, debe dejar de usar las redes virtuales de libvrt y volverse manual.

Respuesta2

Si desea que sus cambios locales en /etc/hosts se propaguen a sus máquinas virtuales usando la misma interfaz, simplemente puede hacer SIGHUP en el proceso libvirt local.

Respuesta3

Configure su instancia dnsmasq con una lista explícita de interfaces en las que desea que escuche.

Puede /etc/dnsmasq.confutilizar nombres de interfaz interface=eth0o IP de interfaz listen-address=192.168.0.1. Incluso con esta configuración, dnsmasq se vinculará útilmente a todas las interfaces, así que desactívelo agregándolo bind-interfacesal archivo de configuración.

Alternativamente, en el archivo de configuración, especifique la lista negra de interfaces con except-interface=virtbr*.

Fuentes:

información relacionada