Ignorar la configuración DNS que nos llega por DHCP (y usar dnsmasq)

Si seguimos los pasos indicados en Activar verificación de DNSSEC en "dnsmasq", tendremos un servicio dnsmasq capaz de verificar DNSSEC. Estupendo. Ahora solo hace falta que enviemos nuestras peticiones DNS a través de ese servicio dnsmasq.

Si estamos en un entorno de servidores, con direcciones IP fijas, etc., no hay mayor problema; bastaría con configurar apropiadamente el fichero /etc/resolv.conf [1].

[1] En un entorno de servidores yo no usaría dnsmasq, ya que está pensado para cosas "pequeñas" y domésticas. Mejor usar un servidor DNS de verdad como BIND.

En un entorno doméstico solemos tener una dirección IP dinámica asignada mediante un servicio DHCP que, típicamente, nos proporciona el router de la operadora de telecomunicaciones que nos da la conexión a internet. En esa negociación DHCP es muy normal configurar muchas cosas más además de la dirección IP, como servidores de tiempos, nombre de dominio, máscaras y ruta por defecto a internet. También nos suele entrar información sobre los servidores DNS que nuestra operadora quiere que usemos.

Hay mucha información en internet sobre cómo ignorar esa configuración de DNS a la hora de que el ordenador configure su red automáticamente al encenderlo. Lamentablemente mucha de ella está anticuada, es contradictoria o frágil. Con la irrupción, como un elefante en una tienda de cristal, de esa aberración de la filosofía Unix que es systemd, las cosas no han hecho sino complicarse aún más.

Voy a documentar cómo lo estoy haciendo yo cuando trabajo con Raspberry PI y la distribución Raspbian actual:

  1. Instalamos dnsmasq u otra alternativa como BIND, mucho más potente, pero tambien más complicado de configurar:

    # apt-get install dnsmasq
    apt-get install dnsmasq
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    The following additional packages will be installed:
      dns-root-data dnsmasq-base
    The following NEW packages will be installed:
      dns-root-data dnsmasq dnsmasq-base
    0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
    Need to get 406 kB of archives.
    After this operation, 909 kB of additional disk space will be used.
    Do you want to continue? [Y/n] y
    
  2. Configuramos dnsmasq editando el fichero /etc/dnsmasq.conf y ponemos las siguientes líneas por ahí:

    conf-file=/usr/share/dnsmasq-base/trust-anchors.conf
    dnssec
    dnssec-check-unsigned
    
    no-resolv
    no-poll
    server=8.8.8.8
    
    listen-address=127.0.0.1
    
    cache-size=5000
    

    El primer grupo activa la verificación DNSSEC, como se explicó en Activar verificación de DNSSEC en "dnsmasq". El segundo grupo indica a dnsmasq que ignore el fichero /etc/resolv.conf para identificar los servidores DNS a los que debe enviar las peticiones DNS que no pueda resolver de forma local a través de su caché. En este caso he puesto el 8.8.8.8 de Google. Mi privacidad ya no me dirige la palabra, pero esto es solo un ejemplo. Es buena idea indicarle varios servidores DNS diferentes, por si hubiese un problema de conectividad o caída de alguno de ellos. Aquí podemos poner los servidores que nos dé la gana, siempre que resuelvan peticiones recursivas desde direcciones desconocidas de internet y que soporten DNSSEC si lo hemos activado en nuestro dnsmasq. Hay detalles sobre estos requisitos en Activar verificación de DNSSEC en "dnsmasq".

    El tercer grupo es para que esta instancia de dnsmasq solo resuelva consultas de esta Raspberry PI, no de toda la red local.

    Por último, el cuarto grupo especifica un tamaño de caché más razonable que los patéticos 150 resultados que dnsmasq guarda por defecto.

  3. En las versiones actuales de Raspbian, la gestión del fichero /etc/resolv.conf se delega en la utilidad resolvconf. Vamos a decirle que no altere el fichero /etc/resolv.conf bajo ninguna circunstancia, que lo deje estar como lo hayamos configurado a mano. Para ello editamos el fichero /etc/resolvconf.conf y añadimos ahí una línea que ponga:

    resolvconf=NO
    
  4. Ahora editamos a mano el fichero /etc/resolv.conf y ponemos ahí lo siguiente:

    # Hemos desactivado "resolvconf", así que este fichero
    # ahora se mantiene a mano.
    nameserver 127.0.0.1
    

    Ponemos el comentario para ayudarnos a entender qué está pasando dentro de un año, cuando ya no recordemos los detalles.

  5. Una vez hecho esto, reiniciamos la Raspberry PI y comprobamos que a) el comando dig [2] hace las consultas a la dirección IP 127.0.0.1, que es la propia máquina, b) si volvemos a pedir la misma información con dig, la respuesta es instantánea porque el resultado está en la caché del dnsmasq y c) DNSSEC se verifica apropiadamente. Lo último lo podemos comprobar haciendo los experimentos detallados en Activar verificación de DNSSEC en "dnsmasq".

[2]

Para instalar el comando dig haremos:

# apt-get install dnsutils