Usando dnsmasq con NetworkManager

15

Era bien sabido que NetworkManager no funciona bien con dnsmasq(ref: aquí ). He examinado la larga discusión aquí, pero todavía no estoy seguro de cuál es la forma recomendada de lidiar con la situación.

Todo lo que quiero hacer es usar dnsmasqpara proporcionar DNS y DHCP a mi red local. ¿Cuál sería la forma recomendada en este caso?

Parece que el problema persiste incluso para Ubuntu 14.04, incluso se dice que el error está solucionado.

A medida que se trabaja, las personas están deshabilitando a los esclavos de Nuevo México dnsmasq-basedebido a las siguientes razones:

El esclavo de NM dnsmasqutiliza opciones codificadas (en C) que proporcionan una funcionalidad extremadamente limitada.

  • No escucha en ethX ( --listen-address=127.0.0.1). Por lo tanto, no podemos usar nuestros servidores como servidores DNS para nuestras PC de red local, es decir, es completamente inútil para las LAN.
  • No almacena en caché las solicitudes ( --cache-size=0). Sin almacenamiento en caché ==> sin aceleración de consultas DNS. De nuevo, esto es muy significativo para las LAN, ya que hay muchos usuarios concurrentes.
  • Finalmente, también necesitamos la funcionalidad DHCP y TFTP de dnsmasq, por lo que incluso si NM + dnsmasq incluyera un servidor DNS real, tendríamos que ejecutar otro dnsmasq

Pero no estoy seguro de si todavía se mantienen y / o cómo la solución ha resuelto los problemas. Además, ninguno de ellos tiene muy claro exactamente qué hicieron y cómo lo hicieron para resolver su problema. Es decir, la parte de la solución falta en la larga discusión . ¿Alguien puede llenar los espacios en blanco por favor? Es decir,

El dnsmasqpaquete de Ubuntu provisto de fábrica no funciona, por el lado del servidor, por las razones anteriores. Y también, en el lado del cliente, "el dnsmasq instalado en esas computadoras portátiles Ubuntu no puede hacer una consulta DNS de LAN desde mi servidor DNS" , porque "el NetworkManager (computadoras portátiles Ubuntu) está causando que tengan una configuración extraña del servidor de nombres 127.0.1.1" ( ref: solución DNS para LAN o red doméstica local )

¿Cómo hacer que dnsmasq funcione sin problemas con NetworkManager, para proporcionar DNS y DHCP (y TFTP) a mi red local, tanto en el lado del servidor como del cliente?

TL'dr

para aquellos que buscan la respuesta De todas las respuestas a continuación, encontré que la solución más simple es la de @ brad, para el lado del servidor (todavía no hay una buena respuesta para el lado del cliente):

la única solución al problema es deshabilitar el dnsmasq de la unidad NM ... e instalar el dnsmasq "estándar" y luego configurarlo a través de su /etc/dnsmasq.confarchivo de configuración estándar .

xpt
fuente
2
Solo para Googlers (como yo): en las versiones más recientes de ubuntu, dnsmasq-core dentro de NetworkManager es algo más amigable. Ver aquí: askubuntu.com/questions/233195/…
A. Rabus

Respuestas:

3

También tengo tus problemas.

En principio, después de wiki.archlinux , parece que habilitar el almacenamiento en caché debería ser suficiente para crear un archivo que /etc/NetworkManager/dnsmasq.d/cachecontenga simplemente

$ cat /etc/NetworkManager/dnsmasq.d/cache 
cache-size=1000

Intenté esto pero, después de reiniciar NM, todavía no tengo caché:

# ps ax | grep dns
11724 ?        S      0:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d

Tenga en cuenta que el archivo conf citado siempre está vacío: no he podido configurar ninguna opción con este procedimiento.

En general, parece que la máscara dnsmasla esclavizada por NM en 14.04 (que es proporcionada por el paquete dnsmasq-base) está completamente bloqueada, por lo que no es posible habilitar el almacenamiento en caché, ni nada más (dhcp, tftp).

Si esto es correcto, creo que, como usted dice, la única solución al problema es desactivar el dnsmasq de la unidad NM al comentar la línea.

dns=dnsmasq

en el archivo /etc/NetworkManager/NetworkManager.confe instale el dnsmasq "estándar" y luego configúrelo a través de su /etc/dnsmasq.confarchivo de configuración estándar .

puntilla
fuente
Bienvenido a superusuario brad! ¡Gracias por tu ayuda!
xpt
1
En realidad, esto habilita el caché, ya que se está ejecutando con --conf-dir=/etc/NetworkManager/dnsmasq.d, cache-sizese utiliza el especificado en el archivo que creó. Puedes ver la diferencia usandodig
sirfz
6

Es posible anular la configuración poniéndola en /etc/NetworkManager/dnsmasq.d/*.conf. La configuración del archivo de configuración tiene prioridad sobre los indicadores de línea de comandos. Se aplican cuando NetworkManager inicia dnsmasq. Ejecutar sudo service network-manager restartpara volver a aplicar. (Si hay alguna duda: la respuesta de Brad perdió el hecho de que ps ax | grep dnsmuestra un --conf-dirargumento)

Por ejemplo:

echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

Según recuerdo, NetworkManager deshabilita el almacenamiento en caché de dnsmasq de forma predeterminada debido a las preocupaciones sobre el envenenamiento de la memoria caché. Para una máquina donde todos los usuarios son de confianza, puede no ser un problema.

NetworkManager no se integra con resolvconf, y el servidor de NM en 127.0.1.1no se usará localmente si el paquete resolvconf está instalado. resolvconf es parte de ubuntu-minimal y las instalaciones estándar de Debian; NetworkManager vuelve a implementar esa funcionalidad de una manera más integrada y menos basada en scripts.

NetworkManager hace asegúrese de no interferir con una instancia de dnsmasq mundial (unión a un bucle de retorno secundario IP y la configuración bind-interfacesa través /etc/dnsmasq.d/network-manager). Si instala una instancia global de dnsmasq y mantiene la instancia de NM, /etc/resolv.confvuelva a verificar cuál utilizará el host de forma predeterminada.

Si bien puede personalizar la instancia dnsmasq de NetworkManager como se muestra arriba, si desea un servidor DNS que se una a las interfaces públicas, debe instalar el dnsmasqpaquete (NetworkManager solo usa dnsmasq-base, que no configura una instancia global) y poner su configuración /etc/dnsmasq.d/*.conf. La instancia esclava de NetworkManager solo está destinada a enlazarse con la interfaz de bucle invertido y configurarla más allá de ese alcance correría el riesgo de romperla.


En resumen, para alguien que solo quiere almacenamiento en caché de DNS local:

sudo apt-get remove dnsmasq resolvconf dhcpcd5 rdnssd
echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

Para una LAN simple, la conexión compartida de NetworkManager debería ser suficiente. Pero para una LAN configurada a medida, con TFTP y así sucesivamente:

sudo apt-get install resolvconf dnsmasq
echo 192.168.0.50,192.168.0.150,12h |sudo tee -a /etc/dnsmasq.d/lan.conf
echo enable-tftp |sudo tee -a /etc/dnsmasq.d/lan.conf
sudo service dnsmasq restart
Tobu
fuente
Gracias. Aunque debería describir más detalladamente lo que hacen sus comandos "en resumen", es decir, las instrucciones también eliminan 4 paquetes si los tiene actualmente. Más enlaces y discusión en reddit.com/r/Ubuntu/comments/2j0va4/…
nealmcb
Muy de acuerdo con @nealmcb, Tobu, explique por qué "para alguien que solo quiere el almacenamiento en caché de DNS local" , deben eliminar el dnsmasqpaquete. entonces, ¿para qué echosirve el siguiente comando? ya que la dnsmasqvoluntad se habrá ido.
xpt
@xpt Tobu sugiere eliminar dnsmasq, pero aún debería haberlo dnsmasq-baseinstalado debido a NM.
Thalis Kalfigkopoulos 06/06/18
0

Quería asignar un MAC particular a una dirección IP particular y, para fines de estabilidad, mantener el Administrador de red / dnsmasq predeterminado tanto como sea posible.

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/src/dnsmasq/nm-dnsmasq-manager.c tiene el comentario sobre el uso de --conf-file para ignorar las configuraciones, pero más adelante en el archivo tenemos

/* dnsmasq exits if the conf dir is not present */
    if (g_file_test (CONFDIR, G_FILE_TEST_IS_DIR))
        nm_cmd_line_add_string (cmd, "--conf-dir=" CONFDIR);

Bajo Ubuntu 16.04 LTS, después de configurar un punto caliente de Wi-Fi y compartir otra conexión, ps auxgww | grep dnsmasqmuestra que el último argumento de línea de comando de cada uno de los procesos de dnsmasq es:

--conf-dir=/etc/NetworkManager/dnsmasq-shared.d

Por lo tanto, es posible crear archivos de configuración en ese directorio que se comparten entre todas las invocaciones de dnsmasq que inicia Network Manager.

Creé /etc/NetworkManager/dnsmasq-shared.d/Hue

dhcp-host=0c:4d:e9:a0:ce:cf,192.168.1.221

y reiniciado, aunque ejecutándose

sudo service network-manager restart

Habría funcionado.

Esto dio como resultado que mi dispositivo obtuviera la dirección IP adecuada.

Sí, esto está mal porque significa que todas las invocaciones de dnsmasq por parte de NetworkManager obtendrán esta declaración, pero en este caso, es inofensivo porque solo importa si el MAC aparece en la red en cuestión. Si la red no es 192.168.1, entonces habrá problemas.

Esto es más robusto que reemplazar / usr / sbin / dnsmasq con un script como se propone en https://gist.github.com/magnetikonline/6236150

La solución correcta sería modificar cómo se invoca dnsmasq para usar adecuadamente los archivos de configuración de dnsmasq. Entiendo el deseo de que Network Manager "simplemente funcione", pero hacer que las herramientas sean a prueba de idiotas significa que solo los idiotas pueden usarlas.

Christopher Brooks
fuente
gracias por la respuesta Christopher, sin embargo, realmente no puedo seguir ... "Quería asignar un MAC particular a una dirección IP particular y para fines de estabilidad" ... "ps auxgww | grep dnsmasq muestra que el último argumento de línea de comando de cada uno de los procesos de dnsmasq " ... " Creé ... hubiera funcionado " ... " Sí, esto está mal " ... Es decir, realmente no puedo seguir tu línea de pensamiento , para tener sentido lo que estás tratando de decir aquí.
xpt
0

Mi solución podría romper Network Manager y mantener todo en una forma simple de hacer las cosas. Con la forma rota de NM de tratar con dnsmasq, simplemente lo anulo con mi método a continuación.

Una solución al problema era simplemente hacer lo siguiente:

sudo apt install dnsmasq
cp /etc/dnsmasq.conf ~/

Edite el ~/dnsmasq.confarchivo en su directorio de usuario como desee y guárdelo.

sudo rm -v /etc/dnsmasq.conf
sudo cp -v ~/dnsmasq.conf /etc/
sudo chattr +i /etc/dnsmasq.conf
sudo systemctl restart dnsmasq.service

Hice un simple alias bash y lo puse al final de mi archivo ~ / .bash_aliases para facilitar la edición del archivo dnsmasq.conf. Aquí está el alias:

alias="sudo chattr -i /etc/dnsmasq.conf && sudo nano -w /etc/dnsmasq.conf && sudo chattr +i /etc/dnsmasq.conf && sudo systemctl restart dnsmasq.service"

Por supuesto, puede elegir cualquier editor a su gusto para el segundo comando sudo en el alias, pero usé nano allí para facilitar a todos. Guarde el archivo, cierre y vuelva a abrir la pestaña / ventana del terminal de comandos. Eso debería permitir que el alias esté disponible para las pestañas / ventanas de terminal recién abiertas.

Simplemente ejecute eddmcdesde su cuenta de usuario y le pedirá su contraseña para ejecutar los comandos elevados.

Tenga en cuenta que siempre chattr +iel archivo. Esto es para que Network Manager no sobrescriba su configuración con la suya.

En las conexiones por cable de Ethernet no debería haber ningún problema. Desde que uso dnsmasq para el almacenamiento en caché dns en computadoras portátiles con conexión inalámbrica, descubrí que tengo que reiniciar manualmente el servicio dnsmasq.service después de conectarme a un punto de acceso. Creo que Network Manager puede realizar tareas como reiniciar los servicios al conectarse, pero aún no lo he investigado.

jpyper
fuente
0

A pesar de las afirmaciones de lo contrario, NetworkManager ignora por completo todos y cada uno de los archivos de configuración de dmsmasq, incluso aquellos en su propio directorio /etc/NetworkManager/dnsmasq-shared.d. La prueba está en el código fuente de NetworkManager ... Aquí está el comentario relevante:

/ * dnsmasq puede leer desde su ubicación de archivo de configuración predeterminada, que si esa ubicación es un archivo de configuración válido, se combinará con las opciones aquí y causará efectos secundarios indeseables. Como enviar direcciones IP falsas como la puerta de enlace o lo que sea. Así que dígale a dnsmasq que no use ningún archivo de configuración. * /

Aquí hay un enlace al código fuente relevante (líneas 139-144).

bsalnick
fuente
2
Un enlace para apuntar al código fuente para que los lectores puedan validar esto y leer el código asociado sería útil si es posible.
jamesc
1
Entonces, sí, uno no puede especificar un archivo de configuración explícito. --conf-file está codificado en / dev / null. Sin embargo, si observa la línea de comando completa utilizada para iniciar dnsmasq a través del NetworkManager, verá que se usa conf-dir: '/ usr / sbin / dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file = / var / run / NetworkManager / dnsmasq.pid --listen-address = 127.0.0.1 --cache-size = 400 --clear-on-reload --conf-file = / dev / null --proxy-dnssec --enable-dbus = org.freedesktop.NetworkManager.dnsmasq --conf-dir = / etc / NetworkManager / dnsmasq.d ', lo que significa que se leen todos los archivos en el directorio dado.
Hardy