GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Cómo configurar fácilmente un DNS sobre TLS Resolver con Nginx en Ubuntu

Este tutorial le mostrará cómo configurar su propio DNS sobre TLS (DoT) en Ubuntu con Nginx, por lo que sus consultas de DNS se pueden cifrar y proteger de miradas indiscretas.

Qué es DNS sobre TLS y por qué es importante

DNS (Domain Name System) es responsable de traducir los nombres de dominio a direcciones IP. Está diseñado en 1987 sin tener en cuenta la seguridad ni la privacidad. Por defecto, las consultas de DNS no están cifradas. Se envían en texto sin formato por cable y pueden ser explotados por entidades intermedias. Por ejemplo, el Gran Cortafuegos de China (GFW ) usa una técnica llamada envenenamiento de caché de DNS para censurar la Internet china. (También usan otros métodos, que están más allá del alcance de este artículo).

GFW verifica cada consulta de DNS que se envía a un servidor DNS fuera de China. Dado que el protocolo DNS de texto sin formato se basa en UDP, que es un protocolo sin conexión, GFW puede falsificar tanto la IP del cliente como la IP del servidor. Cuando GFW encuentra un nombre de dominio en su lista de bloqueo, cambia la respuesta de DNS. Por ejemplo, si un usuario de Internet chino quiere visitar google.com, GFW devuelve una dirección IP ubicada en China en lugar de la dirección IP real de Google, al sistema de resolución de DNS del usuario. Luego, la resolución de DNS devuelve la dirección IP falsa a la computadora del usuario, por lo que el usuario no puede visitar google.com.

DNS sobre TLS significa que las consultas de DNS se envían a través de una conexión segura cifrada con TLS, la misma tecnología que cifra el tráfico HTTP.

¿Por qué ejecutar su propio solucionador DoT?

Ya existen algunos solucionadores de DNS públicos como 1.1.1.1 y 9.9.9.9 que admiten DNS sobre TLS, por lo que puede usarlos si no tiene la habilidad o el tiempo para ejecutar el suyo. Sin embargo, algunas personas argumentan que esto todavía permite que los grandes proveedores de servicios de DNS recopilen información sobre los usuarios. Parecen tener más confianza en su ISP. Pero creo que si está paranoico con respecto a la privacidad, debe ejecutar su propio sistema de resolución de DoT, para que ni los grandes proveedores de servicios de DNS ni su ISP puedan espiarlo.

Actualmente, no todos los solucionadores de DNS (BIND, Unbound, Knot resolver, PowerDNS recursor, etc.) admiten DNS sobre TLS. En lugar de hacer una guía para un resolutor específico, le mostraré cómo configurar el proxy Nginx TLS para su resolutor de DNS existente para proporcionar el servicio DoT, así que no importa qué resolutor de DNS esté usando, puede seguir este tutorial.

Requisitos

Se supone que tiene un solucionador de DNS ejecutándose en su servidor Ubuntu. Puede usar cualquier resolución de DNS (BIND, Unbound, Knot resolver...) Yo personalmente uso BIND.

  • Configure su propio solucionador de DNS BIND9 en Ubuntu 16.04/18.04
  • Configure su propio solucionador de DNS BIND9 en Ubuntu 20.04

También necesita un nombre de dominio, porque los clientes de DNS deberán establecer una conexión TLS segura con nuestro sistema de resolución de DNS. Registré mi nombre de dominio de NameCheap porque el precio es bajo y ofrecen protección de privacidad whois gratis de por vida.

Una vez que cumpla con los requisitos anteriores, siga las instrucciones a continuación.

Paso 1:Instale Nginx en el servidor Ubuntu

Es muy fácil de hacer. Simplemente ejecute el siguiente comando.

sudo apt install nginx

Paso 2:obtenga un certificado TLS de confianza de Let's Encrypt

DNS sobre TLS requiere la instalación de un certificado TLS en el lado del servidor. Obtendremos e instalaremos el certificado Let’s Encrypt. La ventaja de usar el certificado Let's Encrypt es que es gratis, más fácil de configurar y confiable para el software del cliente.

Ejecute los siguientes comandos para instalar el cliente Let's Encrypt (certbot) desde el repositorio predeterminado de Ubuntu.

sudo apt install certbot

Para obtener un certificado TLS de Let's Encrypt, podemos crear un host virtual Nginx con el siguiente comando. Reemplazar dot.example.com con su propio nombre de dominio. No olvide crear un registro DNS A para este subdominio.

sudo nano /etc/nginx/conf.d/dot.example.com.conf

Copie el siguiente texto y péguelo en el archivo de host virtual.

server {
      listen 80;
      server_name dot.example.com;

      root /usr/share/nginx/html/;

      location ~ /.well-known/acme-challenge {
         allow all;
      }
}

Guarde y cierre el archivo. Vuelva a cargar Nginx para que los cambios surtan efecto.

sudo systemctl reload nginx

Una vez que se crea y habilita el host virtual, ejecute el siguiente comando para obtener el certificado Let's Encrypt usando el complemento webroot.

sudo certbot certonly --webroot --agree-tos --email [email protected] -d dot.example.com -w /usr/share/nginx/html/

Paso 3:Crear DNS sobre proxy TLS en Nginx

Edite el archivo de configuración principal de Nginx.

sudo nano /etc/nginx/nginx.conf

Agregue las siguientes líneas al final de este archivo. Tenga en cuenta que deben colocarse fuera de http contexto.

stream {
    # DNS upstream pool
    upstream dns {
        zone dns 64k;
        server 127.0.0.1:53;
    }

   # DoT server for decryption
   server {
        listen 853 ssl;
        ssl_certificate /etc/letsencrypt/live/dot.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/dot.example.com/privkey.pem;
        proxy_pass dns;
    }
}

En la configuración anterior, hacemos que Nginx finalice la conexión TLS en el puerto 853, luego redirigirá las solicitudes de DNS al solucionador de DNS local que escucha en 127.0.0.1:53 .

Guarde y cierre el archivo. Luego pruebe la configuración de Nginx y reinicie.

sudo nginx -t
sudo systemctl restart nginx

Si hay un firewall ejecutándose en el servidor Ubuntu, debe abrir el puerto TCP 853. Por ejemplo, si usa el firewall UFW, ejecute el siguiente comando.

sudo ufw allow 853/tcp

Dado que usamos DNS sobre TLS, no hay necesidad de preocuparse por el ataque de amplificación de DNS.

Paso 5:configurar el cliente Stubby DoT en el escritorio de Ubuntu

Stubby es un solucionador de stubs de DNS de código abierto desarrollado por el equipo de getdns. Un resolutor de código auxiliar es un pequeño cliente DNS en la computadora del usuario final que recibe solicitudes de DNS de aplicaciones como Firefox y las reenvía a un resolutor recursivo como 1.1.1.1 o 8.8.8.8. Stubby es especial porque admite DNS sobre TLS. De forma predeterminada, solo enviará solicitudes de DNS encriptadas.

Instale Stubby en el escritorio de Ubuntu desde el repositorio predeterminado.

sudo apt install stubby

Una vez instalado, stubby se ejecuta en segundo plano. comprobar su estado con:

systemctl status stubby

Stubby escucha en el puerto TCP y UDP 53 de localhost (127.0.0.1). De forma predeterminada, Stubby utiliza DNS de terceros sobre resolutores TLS. Necesitamos configurarlo para usar el nuestro.

sudo nano /etc/stubby/stubby.yml

Desplácese hacia abajo hasta upstream_recursive_servers: sección y agregue el siguiente texto sobre otros servidores DNS. Reemplace 12.34.56.78 con la dirección IP de su resolución DoT.

# My Own DNS over TLS resolver
  - address_data: 12.34.56.78
    tls_auth_name: "dot.example.com"

Luego busque la siguiente línea:

round_robin_upstreams: 1

Cambiar 1 a 0 . Esto hará que stubby siempre use su propio sistema de resolución de DNS sobre TLS. Si no está disponible, stubby usará otros servidores DNS. Guarde el archivo y reinicie stubby para que los cambios surtan efecto.

sudo systemctl restart stubby

Paso 6:Configure el escritorio de Ubuntu para usar Stubby

Aunque Stubby se está ejecutando, el sistema operativo no lo está utilizando. Haga clic en el icono de Network Manager en la esquina superior derecha de su escritorio. A continuación, seleccione la configuración con cable. (Si está utilizando Wi-Fi, seleccione la configuración de Wi-Fi).

Haz clic en el botón de engranaje.

Seleccione IPv4 pestaña, luego en la configuración de DNS, cambie Automatic a APAGADO, lo que evitará que su sistema Ubuntu obtenga la dirección del servidor DNS de su enrutador. Introduce 127.0.0.1 en el campo DNS. Haz clic en Apply botón para guardar los cambios.

Luego reinicie NetworkManager para que los cambios surtan efecto.

sudo systemctl restart NetworkManager

Una vez que se haya vuelto a conectar, puede ver que su sistema Ubuntu ahora usa 127.0.0.1 como servidor DNS en Details pestaña.

Cómo verificar si su tráfico DNS está encriptado

Podemos usar WireShark para monitorear el tráfico de DNS. Instale WireShark en el escritorio de Ubuntu.

sudo apt install wireshark

Si se le pregunta "¿Deberían los no superusuarios poder capturar paquetes?", responda Sí. Una vez que esté instalado, ejecute el siguiente comando para agregar su cuenta de usuario al grupo de wireshark para que pueda capturar paquetes.

sudo adduser your-username wireshark

Cierre sesión y vuelva a iniciarla para que los cambios surtan efecto. Luego abra WireShark desde el menú de su aplicación, seleccione su interfaz de red en WireShark. Por ejemplo, el nombre de mi interfaz Ethernet es enp5s0. Luego ingrese port 853 como filtro de captura. Esto hará que WireShark solo capture tráfico en el puerto 853, que es el puerto que utiliza DNS sobre TLS.

Haga clic en el botón en la esquina superior izquierda para comenzar a capturar. Después de eso, en la ventana de terminal, ejecute el siguiente comando para consultar el nombre de dominio usando dig utilidad. Por ejemplo, puedo consultar el registro A de mi nombre de dominio.

dig A linuxbabe.com

Ahora puede ver el tráfico de DNS capturado en WireShark. Las conexiones se realizaron sobre TCP y se cifraron con TLS, que es lo que queremos. Debe comprobar si la columna Destino incluye la dirección IP de su resolución DoT.

Si las consultas de DNS se envían sin encriptación, la computadora contactará al servidor DNS en el puerto 53. Puede capturar paquetes nuevamente con port 53 como filtro de captura, pero no verá ningún paquete en WireShark, lo que significa que stubby está cifrando sus consultas de DNS.


Ubuntu
  1. Cómo configurar el servidor de nombres DNS en Ubuntu 20.04

  2. Cómo configurar servidores de nombres DNS en Ubuntu 18.04

  3. Cómo configurar un cortafuegos con UFW en Ubuntu 20.04

  4. Cómo configurar bloques de servidor Nginx en Ubuntu 20.04

  5. Cómo configurar el solucionador de DNS no vinculado en Ubuntu 20.04

Configurar DNS sobre HTTPS (DoH) Resolver en Ubuntu con DNSdist

Cómo habilitar fácilmente TLS 1.3 en Nginx en Ubuntu 20.04, 18.04, 16.04

Configurar un solucionador de DNS local en Ubuntu 18.04, 16.04 con BIND9

Configurar el solucionador de DNS local en Ubuntu 20.04 con BIND9

Cómo instalar Nginx con Let's Encrypt TLS/SSL en Ubuntu 20.04

Cómo configurar un servidor Seafile con Nginx en Ubuntu 18.04