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 -ln
y 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.1
es 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.conf
y agregar la línea dns=dnsmasq
y 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 -ln
resultado 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.conf
y una carpeta /etc/NetworkManager/dnsmasq.d/
donde se pueden escribir los archivos de configuración. Parece que esto último es para cuando dns=dnsmasq
está configurado y dnsmasq escucha en 127.0.0.1 ya que la edición /etc/dnsmasq.conf
no 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.conf
utilizar nombres de interfaz interface=eth0
o 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-interfaces
al archivo de configuración.
Alternativamente, en el archivo de configuración, especifique la lista negra de interfaces con except-interface=virtbr*
.
Fuentes: