Guía completa de DNS cifrado en Linux con RocksDNS

RocksDNS ofrece resolución DNS cifrada mediante DoH, DoT y DoQ. En Linux no basta con poner las IPs en /etc/resolv.conf: para usar cifrado necesitas un cliente o resolvedor compatible. Esta guía cubre las opciones más habituales.

Servidores disponibles

DNS1 🇪🇸 España

  • DoH: https://dns.rocksdns.ovh/dns-query (puerto 443)
  • DoT: dns.rocksdns.ovh (puerto 853)
  • DoQ: dns.rocksdns.ovh (puerto 8853)
  • IPv4: 82.223.31.111
  • IPv6: 2001:ba0:22d:1c00::1

DNS2 🇩🇪 Alemania

  • DoH: https://dns2.rocksdns.ovh/dns-query (puerto 443)
  • DoT: dns2.rocksdns.ovh (puerto 853)
  • DoQ: dns2.rocksdns.ovh (puerto 8853)
  • IPv4: 116.203.57.216
  • IPv6: 2a01:4f8:1c1a:aadb::1

Importante: RocksDNS no admite DNS sin cifrar por el puerto 53. Poner estas IPs directamente en /etc/resolv.conf no activa DoH, DoT ni DoQ.

1. systemd-resolved con DoT

Buena opción en distribuciones modernas con systemd. resolved.conf admite DNS=, DNSOverTLS= y DNSSEC=. Usar #hostname junto a la IP fija el nombre TLS/SNI del servidor.

sudo mkdir -p /etc/systemd/resolved.conf.d
sudo nano /etc/systemd/resolved.conf.d/rocksdns.conf
[Resolve]
DNS=82.223.31.111#dns.rocksdns.ovh 116.203.57.216#dns2.rocksdns.ovh
DNSOverTLS=yes
DNSSEC=yes
Domains=~.
sudo systemctl restart systemd-resolved
resolvectl status

Comprueba que /etc/resolv.conf es un symlink a /run/systemd/resolve/stub-resolv.conf. Si no lo es, algunos gestores de red pueden estar sobreescribiendo la configuración.

2. Stubby (DoT)

Stubby actúa como resolvedor local DoT. Es una buena alternativa tanto con como sin systemd, y permite definir tls_auth_name y puerto TLS de forma explícita.

sudo apt install stubby
sudo nano /etc/stubby/stubby.yml
resolution_type: GETDNS_RESOLUTION_STUB
dns_transport_list:
  - GETDNS_TRANSPORT_TLS
listen_addresses:
  - 127.0.0.1@53
  - 0::1@53
upstream_recursive_servers:
  - address_data: 82.223.31.111
    tls_auth_name: "dns.rocksdns.ovh"
    tls_port: 853
  - address_data: 116.203.57.216
    tls_auth_name: "dns2.rocksdns.ovh"
    tls_port: 853
sudo systemctl enable --now stubby

Una vez activo, apunta /etc/resolv.conf a 127.0.0.1 para que el sistema use Stubby como resolvedor local.

3. dnscrypt-proxy (DoH)

dnscrypt-proxy 2 soporta DoH y otros modos. Para RocksDNS puedes usarlo como proxy local DoH definiendo un servidor estático.

sudo apt install dnscrypt-proxy
sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml
listen_addresses = ['127.0.0.1:53', '[::1]:53']

[static]
  [static.rocksdns]
  stamp = 'sdns://AgcAAAAAAAAAAAASZG5zLnJvY2tzZG5zLm92aAovZG5zLXF1ZXJ5'

Si prefieres no gestionar stamps DNS manualmente, Stubby con DoT suele ser más directo para esta configuración. dnscrypt-proxy es más potente si ya lo usas o quieres más flexibilidad de filtrado.

sudo systemctl enable --now dnscrypt-proxy

4. Métodos sin systemd

Si tu sistema no usa systemd, la vía más limpia es montar un resolvedor local cifrado y hacer que /etc/resolv.conf apunte a 127.0.0.1.

Stubby + openresolv

sudo apt install stubby openresolv
sudo nano /etc/stubby/stubby.yml
resolution_type: GETDNS_RESOLUTION_STUB
dns_transport_list:
  - GETDNS_TRANSPORT_TLS
listen_addresses:
  - 127.0.0.1@53
upstream_recursive_servers:
  - address_data: 82.223.31.111
    tls_auth_name: "dns.rocksdns.ovh"
    tls_port: 853
  - address_data: 116.203.57.216
    tls_auth_name: "dns2.rocksdns.ovh"
    tls_port: 853
echo 'name_servers="127.0.0.1"' | sudo tee /etc/resolvconf.conf
sudo resolvconf -u

Asegúrate de que Stubby arranca con el init de tu sistema: OpenRC, runit, s6 o el que uses.

dnscrypt-proxy + openresolv

Misma idea: dnscrypt-proxy escucha en 127.0.0.1:53 y resolv.conf apunta a localhost.

listen_addresses = ['127.0.0.1:53']
echo 'name_servers="127.0.0.1"' | sudo tee /etc/resolvconf.conf
sudo resolvconf -u

Verificación

Con systemd-resolved

resolvectl status
resolvectl query example.com

DoT

kdig @dns.rocksdns.ovh +tls google.com
kdig @dns2.rocksdns.ovh +tls google.com

DoQ

kdig @dns.rocksdns.ovh -p 8853 +quic google.com
kdig @dns2.rocksdns.ovh -p 8853 +quic google.com

DoH

curl -H 'accept: application/dns-json' \
'https://dns.rocksdns.ovh/dns-query?name=google.com&type=A'

Resolvedor local

dig @127.0.0.1 google.com

Herramientas externas

Solución de problemas

resolvectl status
systemctl status systemd-resolved stubby dnscrypt-proxy
journalctl -u stubby -f
journalctl -u dnscrypt-proxy -f
ping dns.rocksdns.ovh
ping dns2.rocksdns.ovh
  • Si usas Stubby, revisa que tls_auth_name coincide exactamente con el hostname del servidor.
  • Si usas systemd-resolved, comprueba que ningún gestor de red está sobreescribiendo /etc/resolv.conf.
  • Si usas método sin systemd, confirma que /etc/resolv.conf apunta a 127.0.0.1.
  • Si el puerto 853 está bloqueado en tu red, prueba DoH como alternativa.

Configuración avanzada

Puedes integrar RocksDNS con NetworkManager, netplan, OpenRC o contenedores. La idea base no cambia: el sistema consulta a un proxy local, y ese proxy habla con RocksDNS mediante DoT o DoH.

NetworkManager

Si usas NetworkManager, puedes delegar la resolución DNS a systemd-resolved añadiendo en /etc/NetworkManager/conf.d/dns.conf:

[main]
dns=systemd-resolved
sudo systemctl restart NetworkManager

Contenedores

En Docker o Podman, configura el DNS del contenedor apuntando a la IP del host o a un resolvedor local accesible desde la red del contenedor.

Automatización y monitoreo

Script de comprobación

#!/bin/sh
if kdig @dns.rocksdns.ovh +tls google.com >/dev/null 2>&1; then
  echo "RocksDNS DoT OK"
else
  echo "Fallo en DoT — comprueba Stubby o systemd-resolved"
fi

Monitoreo de tráfico

journalctl -u stubby -f
journalctl -u dnscrypt-proxy -f
sudo tcpdump -i any port 853 or port 443 or port 8853

Respaldo de configuración

sudo cp /etc/systemd/resolved.conf.d/rocksdns.conf ~/rocksdns.conf.bak
sudo cp /etc/stubby/stubby.yml ~/stubby.yml.bak
sudo cp /etc/dnscrypt-proxy/dnscrypt-proxy.toml ~/dnscrypt-proxy.toml.bak

Comandos útiles

resolvectl status
resolvectl flush-caches
resolvectl query example.com
kdig @dns.rocksdns.ovh +tls example.com
kdig @dns.rocksdns.ovh -p 8853 +quic example.com
dig @127.0.0.1 example.com
curl -H 'accept: application/dns-json' 'https://dns.rocksdns.ovh/dns-query?name=example.com&type=A'

Para terminar

En distribuciones modernas con systemd, systemd-resolved con DoT es la opción más limpia y sin dependencias extra. Si prefieres más control o no usas systemd, Stubby es la alternativa más directa. Para DoH, dnscrypt-proxy es la herramienta más completa aunque requiere algo más de configuración.

El puerto DoQ verificado es el 8853. Si encuentras algún problema con DoT o DoQ en tu red, DoH suele ser la opción más permisiva.

¿Quieres seguir configurando RocksDNS?

Empieza con uno de estos endpoints:

  • https://dns.rocksdns.ovh/dns-query
  • https://dns2.rocksdns.ovh/dns-query