¿Cómo configurar systemd-resolve y systemd-networkd para usar el servidor DNS local para resolver dominios locales y el servidor DNS remoto para dominios remotos?

26

Estoy conectado a la red de área local con acceso a Internet a través de la puerta de enlace. Hay un servidor DNS en la red local que es capaz de resolver los nombres de host de las computadoras de la red local.

Me gustaría configurar systemd- resolve y systemd-networkd para que las solicitudes de búsqueda de nombres de host locales se dirijan (enruten) exclusivamente al servidor DNS local y las solicitudes de búsqueda de todos los demás nombres de host se dirijan exclusivamente a otro servidor DNS remoto.

Supongamos que no sé dónde están los archivos de configuración o si debo agregar más archivos y requerir que se especifiquen sus rutas en la respuesta.

Piotr Dobrogost
fuente

Respuestas:

28

En el archivo de configuración para la interfaz de red local, tenemos que especificar si queremos obtener la dirección del servidor DNS local del servidor DHCP usando la DHCP=opción :

[Network]
DHCP=yes

o especifique su dirección explícitamente usando la DNS=opción :

[Network]
DNS=10.0.0.1

Además, necesitamos especificar (en la misma sección) dominios locales usando la Domains=opción

Domains=domainA.example domainB.example ~example

Especificamos dominios locales domainA.example domainB.examplepara obtener el siguiente comportamiento (de systemd-resolve.service, página de manual de systemd-resolve ):

Las búsquedas de un nombre de host que termina en uno de los dominios por interfaz se enrutan exclusivamente a las interfaces coincidentes.

De esta manera hostX.domainA.exampleserá resuelto exclusivamente por nuestro servidor DNS local.

Especificamos ~exampleque todos los dominios que terminan en exampledeben ser tratados como dominios de solo ruta para obtener el siguiente comportamiento (de la descripción de este commit):

Los servidores DNS que tienen dominios de solo ruta solo deben usarse para los dominios especificados.

De esta manera hostY.on.the.internet, nuestro servidor DNS remoto global lo resolverá exclusivamente .

Nota

Idealmente, cuando se usa el protocolo DHCP, los nombres de dominio locales deben obtenerse del servidor DHCP en lugar de especificarse explícitamente en el archivo de configuración de la interfaz de red anterior. Ver UseDomains=opción . Sin embargo, todavía hay problemas pendientes con esta función: consulte el problema de la opción de dominios de búsqueda DHCP systemd-networkd .

Necesitamos especificar el servidor DNS remoto como nuestro servidor DNS global de todo el sistema. Podemos hacer esto en el /etc/systemd/resolved.confarchivo:

[Resolve]
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

No olvide volver a cargar la configuración y reiniciar los servicios:

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved

¡Precaución!

Las garantías anteriores se aplican solo cuando systemd- resolve resuelve los nombres ; consulte la página de manual para nss-resolve, libnss_resolve.so.2 y la página de manual para systemd- resolve.service , systemd-resolve .

Ver también:

Referencias

Piotr Dobrogost
fuente
66
¿Has considerado no usar .localen este ejemplo? Ciertamente, con avahi, se suponía que esto estaba reservado para MDNS y su mal uso era un gran no-no. Sería más claro para mí usar example.como .ejemplo .
sourcejedi
1
@sourcejedi Para referencia .localse define como dominio especial en RFC 6762 - DNS de multidifusión en la sección Nombres de DNS de multidifusión . Gracias, arreglado.
Piotr Dobrogost
Nota no relacionada: usted también puede aceptar respuestas.
intelfx
2
Creo que sería útil agregar la ubicación del archivo de configuración para la interfaz de red local . No estoy seguro de tener razón, /etc/systemd/network/*.network¿ verdad ? Encontrado aquí superuser.com/a/1365864
Pierre Cordier
1
Observo que esta respuesta "En el archivo de configuración ..." no responde al OP "Supongamos que no sé dónde están los archivos de configuración ..." Como alguien que ha llegado aquí en el mismo estado de ignorancia sobre el ubicación de archivos de configuración particulares, esta respuesta es incompleta.
Eric Towers
1

Solo para ampliar la excelente respuesta de @piotrDobrogost, no olvide configurar /etc/nsswitch.confpara usar systemd-resolvedcomo fuente de resolución DNS. Su hostsdirectiva debería tener el siguiente aspecto para su caso de uso particular:

/etc/nsswitch.conf

hosts:  files resolve dns

Por lo tanto, si limita la resolución solo a los dominios especificados en la Domainsdirectiva /etc/systemd/resolved.confcomo se detalla anteriormente en Piotr, se debe consultar DNS en el orden de las fuentes de resolución de nombres especificadas /etc/nsswitch.confcuando los dominios NO se encuentran en la Domainsdirectiva:

El siguiente enlace hace referencia al requisito de especificar resolución en el /etc/nsswitch.confque systemd-resolvedse consulta durante la resolución de nombre:

https://github.com/systemd/systemd/issues/940

Documentación de SystemD que he encontrado ser grave. Tuve que reconstruir un entendimiento de múltiples enlaces, incluida la respuesta de Piotr anterior ;-)

F1Linux
fuente
Al utilizar recomendada modo de funcionamiento del resuelta SystemD donde /etc/resolve.confes un enlace simbólico al /run/systemd/resolve/stub-resolv.confarchivo que a su vez contiene la dirección de la systemd-determinación talón de resolución de DNS que no hay necesidad de colocar resolveDirectiva en /etc/nsswitch.confarchivo como las solicitudes de DNS serán dirigidos (debido a la norma de nss-dnsla Directiva) a Stub resolver que actúa de acuerdo con las reglas de systemd-resolve .
Piotr Dobrogost
@PiotrDobrogost ¿Cómo podría controlar el orden de las fuentes de resolución de DNS? Sin consultar /etc/nsswitch.conf``? In the specimen config above, / etc / hosts` (" archivos ") se verificaría para IP estática : asignaciones de nombres y, si no se encuentra, se consultará el código resuelto resuelto por systemd. . No puedo ver cómo sería posible, por lo tanto, organizar las fuentes de resolución DNS sin usar /etc/nsswitch.conf. ¿Me estoy perdiendo un truco aquí?
F1Linux
No digo que no /etc/nsswitch.confsea ​​necesario. Estoy diciendo que cuando uno usa la resolución DNS de código auxiliar de systemd- resolve, entonces es suficiente tener la dnsdirectiva en la lista hosts:(presumiblemente después de la filedirectiva). No hay necesidad de resolvedirectivas allí, ya que es el stub resolver el punto de entrada a la lógica de systemd-nss-resolve
resolve
... En otras palabras, puede alcanzar la lógica de systemd-resolve ya sea a través de la resolvedirectiva ➟ nss-resolve NSS plug-in module ➟ systemd- resolve o a través de la dnsdirectiva ➟ nss-dns NSS plug-in module ➟ systemd-resolve's 'stub DNS resolver ➟ systemd-
resolve
@PiotrDobrogost Creo que llegué a la filescontinuación resolvecosita en el /etc/nsswitch.confde la segunda parte de su pregunta. Al volver a leerlo, parece que solo estabas hablando de verificar la memoria caché local para una IP: asignación de nombre y luego contactar a un reenviador si no se encuentra. Por lo general, configuro la filesprimera fuente de resolución de DNS para omitir el DNS y permitirme probar y no golpear los hosts de producción. T
F1Linux