Linux

Resolución definitiva al error de DNS y resolv.conf sobrescrito en Linux

Introducción al problema de resolución de nombres y resolv.conf en entornos Linux

Uno de los dolores de cabeza más recurrentes para los administradores de sistemas y usuarios avanzados de Linux es la gestión de las direcciones IP de los servidores de nombres (DNS). En el corazón de este subsistema se encuentra el archivo estático tradicional /etc/resolv.conf, el cual contiene las directrices necesarias para que el sistema operativo traduzca nombres de dominios legibles por humanos (como google.com) en direcciones IP ruteables por las interfaces de red.

Sin embargo, en las distribuciones modernas de Linux (como Ubuntu, Debian, Fedora o RHEL), la gestión de redes ha evolucionado hacia arquitecturas más dinámicas controladas por demonios y gestores como NetworkManager, systemd-resolved o dhcpcd. Como resultado directo de esta automatización, es extremadamente común que al reiniciar el equipo, reiniciar el servicio de red o cambiar de red Wi-Fi, los cambios manuales aplicados sobre /etc/resolv.conf desaparezcan por completo o el archivo sea sobrescrito, quedando apuntando a servidores DNS locales inútiles (como 127.0.0.53) o directamente vacíos.

Esta guía técnica exhaustiva detalla la anatomía de este fallo crónico, sus causas raíz subyacentes y proporciona cuatro métodos de solución avanzados para blindar tu configuración de red de manera permanente.

Análisis profundo: ¿Por qué Linux sobrescribe el archivo resolv.conf?

Para solucionar eficazmente este comportamiento, primero debemos comprender qué mecanismos del sistema operativo intervienen en su alteración. Tradicionalmente, /etc/resolv.conf era un archivo de texto plano editable por el administrador o generado mediante scripts del cliente DHCP (como dhclient). No obstante, el ecosistema actual ha introducido capas de abstracción:

  • systemd-resolved: Un servicio local de resolución de nombres que actúa como un stub resolver, escuchando en la dirección 127.0.0.53 y redirigiendo las consultas a los servidores upstream configurados por NetworkManager u otros backends.
  • NetworkManager: El demonio encargado de gestionar la conectividad de red que, por defecto, intenta sobrescribir activamente el archivo /etc/resolv.conf para adaptarlo al perfil de conexión activo (Ethernet, Wi-Fi, VPN).
  • Enlaces simbólicos (Symlinks): En muchas distribuciones actuales, /etc/resolv.conf ya no es un archivo real, sino un enlace simbólico que apunta a archivos generados dinámicamente como /run/systemd/resolve/stub-resolv.conf o /run/systemd/resolve/resolv.conf.

Cuando un usuario edita directamente el archivo sin tener en cuenta estos demonios, cualquier evento de red desencadenará una actualización que reemplazará el archivo por la configuración predeterminada del sistema, rompiendo la conectividad o generando fallos de resolución de tipo Temporary failure in name resolution.

Método 1: Configuración avanzada mediante NetworkManager y el archivo NetworkManager.conf

Si tu distribución utiliza NetworkManager (lo cual es estándar en Ubuntu, Fedora, CentOS y derivados), la forma más limpia y recomendada de evitar que se sobrescriba el archivo de configuración DNS es indicarle al demonio que utilice un backend estático o que deshabilite la gestión automática del archivo.

  1. Abre el archivo de configuración principal de NetworkManager utilizando tu editor de texto preferido con privilegios de superusuario:
    sudo nano /etc/NetworkManager/NetworkManager.conf
  2. Localiza la sección [main] y añade o modifica la directiva dns asignándole el valor none o configurando un plugin específico como systemd-resolved:
    [main] plugins=ifupdown,keyfile dns=none
  3. Guarda los cambios y sal del editor (en nano, presiona Ctrl+O, Enter y luego Ctrl+X).
  4. Elimina el enlace simbólico actual de resolv.conf si apunta a systemd-resolved y crea un archivo plano estático:
    sudo rm /etc/resolv.conf
  5. Crea el nuevo archivo de configuración estática con tus servidores DNS preferidos (por ejemplo, Cloudflare y Google):
    echo -e "nameserver 1.1.1.1\nnameserver 8.8.8.8" | sudo tee /etc/resolv.conf
  6. Aplica los cambios reiniciando el servicio de NetworkManager:
    sudo systemctl restart NetworkManager

Método 2: Configuración del Stub Resolver de Systemd (systemd-resolved)

En entornos donde deseas mantener las ventajas de systemd-resolved pero necesitas forzar servidores DNS específicos de manera persistente (evitando que el proveedor de internet - ISP - imponga los suyos a través de DHCP), debes configurar el archivo de configuración global de systemd.

  1. Abre el archivo de configuración del resolvedor de systemd:
    sudo nano /etc/systemd/resolved.conf
  2. Busca las líneas comentadas correspondientes a DNS= y FallbackDNS=. Descoméntalas (eliminando el símbolo # inicial) y añade las direcciones IP deseadas separadas por espacios:
    [Resolve] DNS=1.1.1.1 8.8.8.8 FallbackDNS=9.9.9.9 8.8.4.4 Domains=~ LLMNR=no MulticastDNS=no Cache=yes DNSStubListener=yes
  3. Guarda el archivo y asegúrate de que el enlace simbólico del sistema apunte correctamente al stub resolver:
    sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
  4. Reinicia y habilita el servicio systemd-resolved para aplicar los cambios de manera definitiva:
    sudo systemctl restart systemd-resolved
  5. Verifica el estado actual de la resolución ejecutando:
    resolvectl status

Método 3: Inmutabilidad del archivo mediante atributos del núcleo (chattr)

Cuando los métodos basados en demonios fallan debido a configuraciones de red automatizadas muy agresivas (como clientes VPN corporativos o scripts de aprovisionamiento en la nube), se puede recurrir a una solución drástica a nivel de sistema de archivos: otorgar el atributo de inmutabilidad al archivo resolv.conf.

Advertencia técnica: Este método impedirá que cualquier proceso del sistema, incluidos los scripts legítimos de actualización de red, modifiquen el archivo. Deberás revertir este atributo manualmente si en el futuro necesitas cambiar los DNS.

  1. Primero, configura manualmente el archivo con los servidores DNS deseados:
    echo -e "nameserver 1.1.1.1\nnameserver 1.0.0.1" | sudo tee /etc/resolv.conf
  2. Aplica el atributo de inmutabilidad utilizando el comando chattr (Change Attribute):
    sudo chattr +i /etc/resolv.conf
  3. Para verificar que el atributo se ha aplicado correctamente, ejecuta un listado extendido:
    lsattr /etc/resolv.conf
    Debería mostrar una letra 'i' indicando que es inmutable (----i--------).
  4. Si en el futuro necesitas modificar el archivo, deberás remover primero la inmutabilidad de la siguiente manera:
    sudo chattr -i /etc/resolv.conf

Método 4: Uso de herramientas de gestión de red avanzadas y perfiles estáticos (Netplan)

En distribuciones orientadas a servidores como Ubuntu Server (versiones 18.04 en adelante), la red se administra de forma nativa mediante Netplan. Modificar directamente resolv.conf en estos entornos es un error conceptual, ya que Netplan regenera toda la pila de red al aplicar configuraciones.

  1. Localiza el archivo de configuración YAML de Netplan ubicado en el directorio /etc/netplan/ (el nombre puede variar, por ejemplo, 01-netcfg.yaml o 50-cloud-init.yaml):
    sudo nano /etc/netplan/01-netcfg.yaml
  2. Edita la estructura YAML para declarar explícitamente los servidores de nombres dentro de la interfaz de red correspondiente:
    network: version: 2 renderer: networkd ethernets: eth0: dhcp4: true nameservers: addresses: [1.1.1.1, 8.8.8.8] search: [localdomain]
  3. Guarda el archivo y aplica la configuración de Netplan mediante el comando de prueba y ejecución:
    sudo netplan try
    Si la red se corta, Netplan revertirá automáticamente los cambios en unos segundos. Si es correcta, confirma los cambios.
  4. Aplica de forma definitiva la configuración ejecutando:
    sudo netplan apply

Implementando cualquiera de estas estrategias avanzadas según los requerimientos específicos de tu arquitectura Linux, garantizarás una estabilidad absoluta en la resolución de nombres de dominio y evitarás cortes de conectividad inesperados.