En entornos Linux modernos, especialmente aquellos basados en systemd, el servicio systemd-resolved
gestiona la resolución de nombres mediante mecanismos dinámicos. Sin embargo, en algunos escenarios como servidores minimalistas, contenedores o entornos personalizados, puede ser necesario desactivar este servicio y establecer una configuración DNS estática mediante el archivo tradicional /etc/resolv.conf
.
El script configurar_dns_resolv.sh
automatiza esta tarea de forma segura y controlada.
Objetivo
Este script tiene como finalidad:
- Deshabilitar
systemd-resolved
, si está activo. - Eliminar el enlace simbólico
/etc/resolv.conf
creado por dicho servicio. - Escribir un nuevo archivo
/etc/resolv.conf
con una lista definida de servidores DNS personalizados. - Establecer los permisos correctos sobre el archivo.
Código del script
#!/bin/bash
# Lista de servidores DNS (puedes modificar estas direcciones)
DNS_SERVERS=("8.8.8.8" "1.1.1.1")
# Desactivar y detener systemd-resolved si está en uso
if systemctl is-active --quiet systemd-resolved; then
echo "Deteniendo y deshabilitando systemd-resolved..."
systemctl stop systemd-resolved
systemctl disable systemd-resolved
fi
# Eliminar symlink si existe
if [ -L /etc/resolv.conf ]; then
echo "Eliminando enlace simbólico /etc/resolv.conf"
rm -f /etc/resolv.conf
fi
# Crear nuevo archivo resolv.conf
echo "Configurando /etc/resolv.conf con los DNS especificados..."
> /etc/resolv.conf # Vacía el archivo
for dns in "${DNS_SERVERS[@]}"; do
echo "nameserver $dns" >> /etc/resolv.conf
done
chmod 644 /etc/resolv.conf
# Mostrar el resultado
echo "Contenido actual de /etc/resolv.conf:"
cat /etc/resolv.conf
Explicación técnica
1. Lista de servidores DNS
DNS_SERVERS=("8.8.8.8" "1.1.1.1")
Define los servidores DNS a utilizar. Puedes sustituir estas IPs por otras como OpenDNS (208.67.222.222
), Quad9, Cloudflare, o servidores internos.
2. Gestión de systemd-resolved
systemctl stop systemd-resolved
systemctl disable systemd-resolved
Se detiene y deshabilita el servicio que, en muchas distribuciones, gestiona /etc/resolv.conf
mediante un enlace simbólico al archivo /run/systemd/resolve/stub-resolv.conf
.
3. Eliminación del symlink
rm -f /etc/resolv.conf
Permite reemplazar el archivo simbólico con un archivo plano editable.
4. Generación de nuevo resolv.conf
echo "nameserver $dns" >> /etc/resolv.conf
Se escribe cada servidor DNS en el nuevo archivo, uno por línea. Se asegura un formato válido para la resolución de nombres.
5. Permisos
chmod 644 /etc/resolv.conf
Otorga permisos de lectura para todos y escritura solo para el propietario (root), tal como se espera para archivos de configuración del sistema.
Ventajas de este enfoque
- Control total sobre los DNS utilizados, sin depender de servicios dinámicos.
- Ideal para entornos cerrados o minimalistas (como contenedores o servidores sin NetworkManager).
- Fácil de adaptar y automatizar, incluso en scripts de provisión o cloud-init.
Consideraciones
- Algunos sistemas pueden volver a generar
/etc/resolv.conf
tras reinicios si usanNetworkManager
,dhclient
onetplan
. En estos casos se recomienda:- Añadir el archivo a una lista de exclusión.
- Configurar los servicios para no sobrescribirlo.
- Este script requiere privilegios de root para modificar archivos del sistema y gestionar servicios.
Ejecución
Para ejecutar el script:
sudo bash configurar_dns_resolv.sh
Conclusión
El script configurar_dns_resolv.sh
es una solución sencilla, clara y eficaz para quienes necesiten una resolución DNS estática y persistente sin depender de systemd-resolved
. Es especialmente útil para administradores de sistemas, profesionales de ciberseguridad o entornos donde se requiere un mayor control sobre la red.