es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualizar automáticamente las entradas DNS en un contenedor Docker utilizando la opción –network host.

Tengo un contenedor de Docker que utiliza la red del host y cuando ejecuto el contenedor, toma el mismo resolv.conf de la máquina host.

docker run -ti –network host ubuntu:18.04 /bin/bash

He configurado una interfaz VPN en mi host que utiliza un servidor DNS adicional 10.10.0.5 y un dominio de búsqueda usando el servidor DNS myvpndomain.com.

Pero el problema es que cuando inicio el contenedor sin estar conectado a la VPN, toma mi resolv.conf habitual de /etc. Pero una vez que se inicia el contenedor y enciendo mi interfaz VPN, puedo ver todas las máquinas en la red de la VPN, incluido el servidor DNS de la VPN: 10.10.0.5 (puedo hacer ping en él), pero la configuración de resolución DNS no se actualiza automáticamente desde el host, necesito reiniciar el contenedor para obtener la nueva configuración DNS.

Configuración DNS en la máquina host después de conectarse a la VPN:

cat /etc/resolv.conf

search myvpndomain.com
nameserver 10.10.0.5
nameserver 80.58.61.250
nameserver 80.58.61.254

Configuración DNS dentro del contenedor después de conectarse a la VPN:

cat /etc/resolv.conf

nameserver 80.58.61.250
nameserver 80.58.61.254

Para actualizar la configuración DNS después de conectarme a mi VPN, he probado dos soluciones hasta ahora:

1) Agregar un enlace de montaje enlazado al archivo /etc/resolv.conf del host al contenedor -v /etc/resolv.conf:/etc/resolv.conf para ejecutar el comando, pero no funciona, no sé por qué incluso al actualizar resolv.conf del host, el resolv.conf montado en el contenedor no se actualiza.

2) Agregar –dns 127.0.0.53 –dns-search myvpndomain.com al comando de ejecución, esto funciona bien ya que utiliza systemd-resolver y también agrega el dominio de búsqueda requerido. Pero me gustaría no depender de systemd-resolver para lograr esto.

¿Conoce una solución más limpia que no implique usar systemd-resolver?

¿Tal vez usar el DNS interno de Docker 127.0.0.11 + dnsmasq?

PD: Es obligatorio utilizar la red del host en el contenedor –network host

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible solución podría ser utilizar dnsmasq dentro del contenedor y configurarlo para que reenvíe las consultas de DNS al(los) servidor(es) DNS del host. De esta manera, cuando se inicia la interfaz VPN y se añaden nuevos servidores DNS al archivo /etc/resolv.conf del host, dnsmasq reenviará las consultas a ellos sin necesidad de reiniciar el contenedor.

    Para lograr esto, podrías crear un nuevo Dockerfile basado en la imagen de Ubuntu 18.04 que incluya dnsmasq:

    FROM ubuntu:18.04
    
    RUN apt-get update && \
        apt-get install -y dnsmasq
    
    ENTRYPOINT ["dnsmasq", "-k"]
    

    Luego, construye la imagen:

    docker build -t my-dnsmasq-image .
    

    Finalmente, ejecuta el contenedor con la opción –network host y especifica el(los) servidor(es) DNS del host como servidores DNS ascendentes para dnsmasq:

    docker run -ti --network host \
        --dns 127.0.0.11 \
        --dns-search myvpndomain.com \
        -v /etc/resolv.conf:/etc/resolv.conf \
        my-dnsmasq-image \
        --server=10.10.0.5 \
        --server=80.58.61.250 \
        --server=80.58.61.254
    

    Esto iniciará dnsmasq dentro del contenedor y lo configurará para que reenvíe las consultas de DNS al(los) servidor(es) DNS del host especificados en las opciones –server. El archivo resolv.conf del contenedor se actualizará automáticamente cuando se inicie la interfaz VPN, sin la necesidad de reiniciar el contenedor.

    Nota: Es posible que necesites ajustar las opciones –server dependiendo de tu configuración específica de VPN.

Comments are closed.