GNU/Linux >> Tutoriales Linux >  >> Ubuntu

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

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

¿Qué es DNS sobre HTTPS 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.

HTTPS es la forma estándar de cifrar páginas web HTTP de texto sin formato. Con DNS sobre HTTPS (DoH), sus consultas de DNS se cifrarán, por lo que ningún tercero podrá ver sus consultas de DNS.

¿Por qué ejecutar su propio solucionador DoH?

Ya existen algunos solucionadores de DNS públicos como 1.1.1.1 y 9.9.9.9 que admiten DNS sobre HTTPS, por lo que puede usarlos si no tiene la habilidad o el tiempo para ejecutar el suyo propio. A partir de la versión 61 de Firefox, puede habilitar DNS sobre HTTPS en la configuración del navegador, lo cual es un gran progreso para la seguridad y privacidad de Internet. Firefox usa los solucionadores de Cloudflare (1.1.1.1) de forma predeterminada. Sin embargo, algunas personas argumentan que esto permite que Cloudflare recopile información sobre los usuarios de Firefox. Parecen tener más confianza en su ISP que en Cloudflare. Pero creo que si está paranoico con respecto a la privacidad, debe ejecutar su propio solucionador DoH, de modo que ni Cloudflare ni su ISP puedan espiarlo.

DoH frente a DoT

Además de DNS sobre HTTPS, existe otro protocolo que también tiene como objetivo cifrar las consultas de DNS. Se llama DNS sobre TLS (Punto). Anteriormente, escribí una guía para usar DNS sobre TLS en el escritorio de Ubuntu, pero ahora voy a cambiar a DNS sobre HTTPS.

Para las personas que viven en países con una severa censura de Internet como China, es más ventajoso usar DoH.

  • DoT opera en puerto TCP 853 , que se puede bloquear fácilmente con un cortafuegos nacional.
  • DoH opera en puerto TCP 443 , que es el puerto estándar para los sitios web HTTPS, lo que hace que DoH sea muy difícil de bloquear, porque si el puerto TCP 443 está bloqueado, casi todos los sitios web HTTPS también estarán bloqueados.

Mi resolución DoH se ejecuta en un VPS (servidor privado virtual) ubicado fuera de China y el Gran Cortafuegos de China no puede interceptar mis consultas de DNS. Incluso puedo ocultar la dirección IP de mi resolución DoH detrás de Cloudflare CDN (red de entrega de contenido).

Otra ventaja de DoH es que permite que las aplicaciones web accedan a la información de DNS a través de las API de navegador existentes, por lo que no se necesita una resolución de stub.

Compatibilidad con DoH en los principales solucionadores de DNS

  • ENLACE admitirá DoH en la versión 9.17, que aún está en desarrollo. El repositorio de Ubuntu 20.04 y 21.04 viene con BIND 9.16.
  • Nudo resolver admite DoH desde la versión 4.0.0. La última versión actual es 5.11. Tiene un repositorio oficial para Debian, Ubuntu, CentOS, Fedora.
  • Sin consolidar es compatible con DoH desde la versión 1.12.0.
  • recursor de PowerDNS no es compatible con DoH en este momento.

En realidad, prefiero ejecutar la resolución DoH con DNSdist , que agregó compatibilidad con DoH en la versión 1.4.0. La última versión actual es 1.5. Tiene un repositorio oficial para Debian, Raspbian, Ubuntu y CentOS. DNSdist es un equilibrador de carga de DNS que puede reenviar consultas de DNS a un resolutor de DNS back-end, por lo que no importa qué resolutor de DNS esté usando, puede usar DNSdist para ejecutar su propio servidor DoH. DNSdist está desarrollado por el equipo de PowerDNS.

Requisitos

Se supone que tiene un solucionador de DNS ejecutándose en su servidor Ubuntu. Puede usar cualquier resolución de DNS (BIND, Knot resolver, Unbound...) 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

Una vez que su sistema de resolución de DNS esté en funcionamiento, siga las instrucciones a continuación.

Paso 1:Instalar DNSdist en Ubuntu Server

Si utiliza un Ubuntu no LTS , debe instalar dnsdist desde el repositorio predeterminado (sudo apt install dnsdist ). Si utiliza Ubuntu LTS , se recomienda instalar DNSdist desde el repositorio ascendente, por lo que tendrá la última versión estable. Primero, debe crear un archivo de lista de fuentes para DNSdist.

Ubuntu 20.04

echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu focal-dnsdist-15 main" | sudo tee /etc/apt/sources.list.d/pdns.list

Ubuntu 18.04

echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu bionic-dnsdist-15 main" | sudo tee /etc/apt/sources.list.d/pdns.list

Ubuntu 16.04

echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu xenial-dnsdist-15 main" | sudo tee /etc/apt/sources.list.d/pdns.list

A continuación, creamos un archivo de preferencias para DNSdist para anclar el paquete, por lo que no instalaremos DNSdist accidentalmente desde otro repositorio.

sudo nano /etc/apt/preferences.d/dnsdist

Agregue las siguientes líneas al archivo.

Package: dnsdist*
Pin: origin repo.powerdns.com
Pin-Priority: 600

Guarde y cierre el archivo. Luego ejecute el siguiente comando para importar la clave pública de PowerDNS, para que el administrador de paquetes APT pueda verificar la interidad de los paquetes de software descargados de este repositorio.

curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -

A continuación, actualice la lista de repositorios e instale DNSdist.

sudo apt update

sudo apt install dnsdist

De forma predeterminada, DNSdist intenta vincularse al puerto 53. Debido a que tiene un solucionador de DNS existente como BIND escuchando en el puerto 53, el dnsdist.service no se iniciaría.

Dado que solo estamos implementando un solucionador DoH y no nos importa el equilibrio de carga de DNS, podemos configurar DNSdist para escuchar en otro puerto. Edite el archivo de configuración de DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

No hay contenido en este archivo. Por ahora, simplemente agregue la siguiente línea en este archivo, para que DNSdist escuche en el puerto TCP y UDP 5353, en lugar del puerto 53.

setLocal("127.0.0.1:5353")

Guarde y cierre el archivo. Luego reinicie DNSdist.

sudo systemctl restart dnsdist

Comprueba su estado.

systemctl status dnsdist

Debería estar activo (en ejecución) .

Paso 2:Instale el cliente Let's Encrypt (Certbot) en el servidor Ubuntu

DNS sobre HTTPS 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 comprobar el número de versión, ejecute

certbot --version

Salida de muestra:

certbot 0.40.0

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

Recomiendo usar el standalone o webroot complemento para obtener el certificado TLS para dnsdist.

Complemento independiente

Si no hay un servidor web ejecutándose en su servidor Ubuntu, puede usar el complemento independiente para obtener el certificado TLS de Let's Encrypt. Cree un registro DNS A para el subdominio (doh.example.com), luego ejecute el siguiente comando.

sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d doh.example.com

donde:

  • certonly :Obtenga un certificado pero no lo instale.
  • --standalone :use el complemento independiente para obtener un certificado
  • --preferred-challenges http :Realice el desafío http-01 para validar nuestro dominio, que utilizará el puerto 80.
  • --agree-tos :Acepte los términos de servicio de Let's Encrypt.
  • --email :la dirección de correo electrónico se utiliza para el registro y la recuperación de la cuenta.
  • -d :Especifique su nombre de dominio.

Como puede ver en la siguiente captura de pantalla, obtuve el certificado con éxito.

Uso del complemento webroot

Si su servidor Ubuntu tiene un servidor web escuchando en los puertos 80 y 443, entonces es una buena idea usar el complemento webroot para obtener un certificado porque el complemento webroot funciona con casi todos los servidores web y no necesitamos instalar el certificado. en el servidor web.

Primero, debe crear un host virtual para doh.example.com.

Apache

Si está utilizando Apache, entonces

sudo nano /etc/apache2/sites-available/doh.example.com.conf

Y pegue las siguientes líneas en el archivo.

<VirtualHost *:80>        
        ServerName doh.example.com

        DocumentRoot /var/www/dnsdist
</VirtualHost>

Guarde y cierre el archivo. Luego cree el directorio raíz web.

sudo mkdir /var/www/dnsdist

Establezca www-data (usuario de Apache) como propietario de la raíz web.

sudo chown www-data:www-data /var/www/dnsdist -R

Habilite este servidor virtual.

sudo a2ensite doh.example.com

Vuelva a cargar Apache para que los cambios surtan efecto.

sudo systemctl reload apache2

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 doh.example.com -w /var/www/dnsdist

Nginx

Si está utilizando Nginx, entonces

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

Pegue las siguientes líneas en el archivo.

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

      root /var/www/dnsdist/;

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

Guarde y cierre el archivo. Luego cree el directorio raíz web.

sudo mkdir -p /var/www/dnsdist

Establezca www-data (usuario de Nginx) como propietario de la raíz web.

sudo chown www-data:www-data /var/www/dnsdist -R

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 doh.example.com -w /var/www/dnsdist

Paso 4:habilite DoH en DNSdist

Edite el archivo de configuración de DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Agregue las siguientes líneas al archivo.

-- allow query from all IP addresses
addACL('0.0.0.0/0')

-- add a DoH resolver listening on port 443 of all interfaces
addDOHLocal("0.0.0.0:443", "/etc/letsencrypt/live/doh.example.com/fullchain.pem", "/etc/letsencrypt/live/doh.example.com/privkey.pem", { "/" }, { doTCP=true, reusePort=true, tcpFastOpenSize=0 })

-- downstream resolver
newServer({address="127.0.0.1:53",qps=5, name="resolver1"})

Guarde y cierre el archivo. DNSdist se ejecuta como _dnsdist usuario, por lo que debemos proporcionar el _dnsdist permiso de usuario para leer el certificado TLS con los siguientes comandos.

sudo apt install acl

sudo setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/

Luego verifique la sintaxis del archivo de configuración.

sudo dnsdist --check-config

Si la sintaxis es correcta, reinicie DNSdist.

sudo systemctl restart dnsdist

Tenga en cuenta que si hay un servidor web escuchando en el puerto TCP 443, DNSdist no se reiniciará. Puede detener temporalmente el servidor web. Explicaré cómo hacer que el servidor web y DNSdist usen el puerto TCP 443 al mismo tiempo al final de este artículo.

Cuando Certbot renueva el certificado TLS, debe volver a otorgar el permiso, pero puede agregar el comando en el archivo crontab.

sudo crontab -e

Así:

@daily certbot renew --quiet && setfacl -R -m u:_dnsdist:rx /etc/letsencrypt/

Paso 5:Configurar DoH en el navegador web Firefox

Ve a Preferencias -> Generales y desplácese hacia abajo para configurar Configuración de red . Habilite DNS sobre HTTPS y configure su propio solucionador DoH.

Luego podemos ajustar las configuraciones de DoH yendo a about:config pestaña en Firefox.

modo.trr.red

Por defecto, el network.trr.mode el parámetro en Firefox está establecido en 2 , lo que significa que si la consulta DoH falla, Firefox pasará la consulta DNS al sistema host. Quiero usar siempre el solucionador DoH, así que cambie el network.trr.mode a 3 por lo que no se utilizará el sistema de resolución de host. Esto nos permite tener una manera fácil de probar si su resolución DoH está funcionando.

red.trr.permitir-rfc1918

Esto se establece en false de forma predeterminada, lo que significa que si la respuesta DNS incluye direcciones IP privadas, se considerará una respuesta incorrecta que no se utilizará. Si usa la zona de política de respuesta en BIND, probablemente tenga algunos nombres de host que apunten a direcciones IP privadas, luego establezca este valor en true .

red.trr.dirección de arranque

Firefox necesita buscar la dirección IP del resolutor DoH para poder enviar consultas de DNS. Puede poner la dirección IP en este campo para eliminar esta consulta inicial.

Pruebas

Ahora ingrese un nombre de dominio como linuxbabe.com en la barra de direcciones de Firefox. Si la página web se carga normalmente, es una buena señal de que su resolución DoH está funcionando. Luego vaya a la consola de terminal de su servidor DNS y verifique los registros de consulta de DNS. Uso BIND, así que ingreso el siguiente comando para verificar el registro de consultas de DNS.

Ubuntu 20.04

sudo journalctl -eu named

Ubuntu 18.04

sudo journalctl -eu bind9

Como puede ver en el registro de BIND a continuación, Firefox consultó los siguientes dominios.

  • www.linuxbabe.com :mi sitio web
  • fuentes.gstatic.com :Esto sirve fuentes de Google en mi sitio web
  • cdn.shareaholic.net :un widget para compartir en mi sitio web
  • boletín.linuxbabe.com :mi plataforma de marketing por correo electrónico autohospedada.
  • translate.google.com :el widget de traducción de Google en mi sitio web

El registro de consulta anterior me dice que mi resolución de DNS sobre HTTPS está funcionando. Si detengo el sistema de resolución BIND (sudo systemctl stop named ), Firefox me dice que no puede encontrar ese sitio. Y cuando inicio BIND, la página web se carga de nuevo.

Paso 6:configurar el cliente DoH en el escritorio de Ubuntu

Sé que hay 3 clientes DNS de código abierto en Linux que admiten DNS encriptado.

  • resuelto por systemd
  • rechoncho
  • dnscrypt-proxy

Actualmente, dnscrypt-proxy es la mejor implementación de cliente DoH en Linux, así que le mostraré cómo usarla. Ejecute el siguiente comando para instalar dnscrypt-proxy en su escritorio Ubuntu.

sudo apt install dnscrypt-proxy

Se iniciará automáticamente, como puedes ver con:

sudo systemctl status dnscrypt-proxy

Si no se inició, puede ejecutar el siguiente comando para iniciarlo.

sudo systemctl enable dnscrypt-proxy --now

Compruebe la dirección de escucha.

sudo ss -lnptu | grep dnscrypt-proxy

En mi computadora, dnscrypt-proxy escucha en 127.0.2.1:53 . Hay otro servicio systemd (dnscrypt-proxy-resolvconf.service ) instalado por dnscrypt-proxy,

systemctl status dnscrypt-proxy-resolvconf

Este es un servicio que establece 127.0.2.1 como el resolutor en su computadora. Puede verificar la resolución de DNS actual para su computadora con:

cat /etc/resolv.conf

De manera predeterminada, dnscrypt-proxy usa Clouldflare como el solucionador de DoH ascendente. Para usar su propio solucionador DoH, edite el archivo de configuración.

sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml

Encuentra la siguiente línea

server_names = ['cloudflare']

Cámbielo a su nombre de host de resolución DoH. Tenga en cuenta que la ubicación de los parámetros es importante. No debe poner el server_names parámetro en otros lugares de este archivo.

server_names = ['doh.example.com']

Luego comente el [sources] sección.

#[sources]
#  [sources.'public-resolvers']
#  url = 'https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md'
#  cache_file = '/var/cache/dnscrypt-proxy/public-resolvers.md'
#  minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'
#  refresh_delay = 72
#  prefix = ''

Necesitamos agregar nuestro propio solucionador DoH como se muestra a continuación en la parte inferior de este archivo.

[static]  
  [static.'doh.example.com']
  stamp = 'sdns://AgUAAAAAAAAAAAAOZG5zLmdvb2dsZS5jb20NL2V4cGVyaW1lbnRhbA'

El sello contiene su nombre de host de resolución DoH, dirección IP y ruta de consulta. Para obtener su propio sello, utilice la calculadora de sellos DNS en línea. Elija DNS sobre HTTPS como protocolo e ingrese la dirección IP, el nombre de host y la ruta de consulta. Si sigue este tutorial para configurar su propio solucionador de DoH, la ruta debe establecerse solo en / . Si no habilitó DNSSEC en su resolución, desmarque la casilla de verificación DNSSEC.

Una vez que haya agregado su sello DNS, guarde y cierre el archivo. Luego reinicie dnscrypt-proxy .

sudo systemctl restart dnscrypt-proxy

Compruebe su estado. Asegúrate de que se esté ejecutando.

systemctl status dnscrypt-proxy

Ahora puede probar si dnscrypt-proxy está funcionando.

Si no desea publicar su DNS a través de la resolución HTTPS para el mundo, puede eliminar el registro DNS A de su nombre de host de resolución DoH, porque dnscrypt-proxy tiene la dirección IP en el sello DNS.

Configurar DoH en iOS

iOS admite DNS a través de HTTPS desde iOS 14. Sin embargo, no hay una opción de configuración simple en iOS para establecer la resolución de DoH. Necesitas generar un .mobileconfig archivo e instalarlo en iOS. Es un poco complicado generar un .mobileconfig de iOS firmado archivo.

Si su resolución DoH no se utilizará públicamente, puede generar un archivo simple sin firmar. Use un editor de texto para crear un archivo con .mobileconfig extensión. Copia y pega el siguiente texto. Reemplace la dirección IP y la URL del servidor.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>PayloadContent</key>
        <array>
                <dict>
                        <key>DNSSettings</key>
                        <dict>
                                <key>DNSProtocol</key>
                                <string>HTTPS</string>
                                <key>ServerAddresses</key>
                                <array>
                                        <string>12.34.56.78</string>
                                </array>
                                <key>ServerURL</key>
                                <string>https://doh.example.com/</string>
                        </dict>
                        <key>PayloadDescription</key>
                        <string>Configures device to use Encrypted DNS over HTTPS</string>
                        <key>PayloadDisplayName</key>
                        <string>My own DNS over HTTPS Resolver</string>
                        <key>PayloadIdentifier</key>
                        <string>com.apple.dnsSettings.managed.9d6e5fdf-e404-4f34-ae94-27ed2f636ac4</string>
                        <key>PayloadType</key>
                        <string>com.apple.dnsSettings.managed</string>
                        <key>PayloadUUID</key>
                        <string>35d5c8a0-afa6-4b36-a9fe-099a997b44ad</string>
                        <key>PayloadVersion</key>
                        <integer>1</integer>
                        <key>ProhibitDisablement</key>
                        <false/>
                </dict>
        </array>
        <key>PayloadDescription</key>
        <string>Adds self-hosted DoH resolver to Big Sur and iOS 14 based systems</string>
        <key>PayloadDisplayName</key>
        <string>My own DNS over HTTPS</string>
        <key>PayloadIdentifier</key>
        <string>com.example.doh</string>
        <key>PayloadRemovalDisallowed</key>
        <false/>
        <key>PayloadType</key>
        <string>Configuration</string>
        <key>PayloadUUID</key>
        <string>A4475135-633A-4F15-A79B-BE15093DC97A</string>
        <key>PayloadVersion</key>
        <integer>1</integer>
</dict>
</plist>

Guarde y cierre el archivo. Luego puede enviar el archivo como un archivo adjunto de correo electrónico a su iOS. Abra el correo electrónico en iOS y toque el archivo adjunto para descargar el archivo de configuración. Después de eso, ve a iOS Settings -> Profile Downloaded . Le pedirá que instale el perfil.

Toque el botón Instalar e ingrese su contraseña de iOS para instalarlo. Toque el botón Instalar de nuevo.

Una vez que esté instalado, vaya a iOS Settings -> VPN & Network . Desplácese hacia abajo hasta el botón para elegir la resolución de DNS para su sistema iOS. Tenga en cuenta que esta resolución de DoH anulará la resolución de DNS proporcionada por una VPN como ProtonVPN. Tu iOS siempre usará tu resolución DoH.

Si alguna vez desea eliminar el .mobileconfig archivo de iOS, vaya a Settings -> General -> Profile .

Hacer que DNSdist y el servidor web usen el puerto 443 al mismo tiempo

Un sistema de resolución de DNS sobre HTTPS debe vincularse al puerto 443. Si ya tiene Apache/Nginx escuchando en el puerto 443, entonces DNSdist no puede vincularse al puerto 443. Normalmente, un puerto solo puede ser utilizado por un proceso. Sin embargo, podemos usar HAproxy (Proxy de alta disponibilidad) y SNI (Indicación de nombre de servidor) para hacer que DNSdist y Apache/Nginx usen el puerto 443 al mismo tiempo.

Configuración de DNSdist

Edite el archivo de configuración de DNSdist.

sudo nano /etc/dnsdist/dnsdist.conf

Cambie la dirección de escucha de DoH a 127.0.0.1 .

addDOHLocal("127.0.0.1:443", "/etc/letsencrypt/live/doh.example.com/fullchain.pem", "/etc/letsencrypt/live/doh.example.com/privkey.pem", { "/" }, { doTCP=true, reusePort=true, tcpFastOpenSize=0 })

Guarde y cierre el archivo. Luego reinicie DNSdist.

sudo systemctl restart dnsdist

Configuración de Nginx

Si usa Nginx, edite el archivo de bloqueo del servidor.

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

En el bloque del servidor SSL, busque la siguiente directiva.

listen 443 ssl;

Cámbialo a

listen 127.0.0.2:443 ssl;

Esta vez lo hacemos escuchar en 127.0.0.2:443 porque 127.0.0.1:443 ya está tomado por DNSdist. Guarde y cierre el archivo. El archivo de configuración principal de Nginx /etc/nginx/nginx.conf y el bloque de servidor predeterminado /etc/nginx/sites-enabled/default podría incluir un host virtual predeterminado escuchando en 443, por lo que es posible que también deba editar este archivo.

Luego reinicie Nginx.

sudo systemctl restart nginx

Configuración de Apache

Si usa el servidor web Apache, edite su archivo de host virtual.

sudo nano /etc/apache2/sites-enabled/example.com.conf

En el host virtual SSL, cambie

<VirtualHost *:443>

Para

<VirtualHost 127.0.0.2:443>

Esta vez lo hacemos escuchar en 127.0.0.2:443 porque 127.0.0.1:443 ya está tomado por DNSdist. Guarde y cierre el archivo. Luego edite el /etc/apache2/ports.conf archivo.

sudo nano /etc/apache2/ports.conf

Cambiar

Listen 443

Para

Listen 127.0.0.2:443

Guarde y cierre el archivo. Reinicie Apache.

sudo systemctl restart apache2

Configuración de HAProxy

Ahora instale HAproxy.

sudo apt install haproxy

Iniciar HAProxy

sudo systemctl start haproxy

Editar archivo de configuración.

sudo nano /etc/haproxy/haproxy.cfg

Si usa Nginx , copie y pegue las siguientes líneas al final del archivo. Reemplazar 12.34.56.78 con la dirección IP pública de su servidor. Reemplace doh.example.com con el nombre de dominio utilizado por DNSdist y www.example.com con el nombre de dominio utilizado por su servidor web.

frontend https
   bind 12.34.56.78:443
   mode tcp
   tcp-request inspect-delay 5s
   tcp-request content accept if { req_ssl_hello_type 1 }

   use_backend dnsdist if { req_ssl_sni -i doh.example.com }
   use_backend nginx if { req_ssl_sni -i www.example.com }
   use_backend nginx if { req_ssl_sni -i example.com }

   default_backend dnsdist

backend dnsdist
   mode tcp
   option ssl-hello-chk
   server dnsdist 127.0.0.1:443

backend nginx
   mode tcp
   option ssl-hello-chk
   server nginx 127.0.0.2:443 check

Si usa Apache , copie y pegue las siguientes líneas al final del archivo. Reemplazar 12.34.56.78 con la dirección IP pública de su servidor. Reemplace doh.example.com con el nombre de dominio utilizado por DNSdist y www.example.com con el nombre de dominio utilizado por su servidor web.

frontend https
   bind 12.34.56.78:443
   mode tcp
   tcp-request inspect-delay 5s
   tcp-request content accept if { req_ssl_hello_type 1 }

   use_backend dnsdist if { req_ssl_sni -i doh.example.com }
   use_backend apache if { req_ssl_sni -i www.example.com }
   use_backend apache if { req_ssl_sni -i example.com }

   default_backend dnsdist

backend dnsdist
   mode tcp
   option ssl-hello-chk
   server dnsdist 127.0.0.1:443

backend apache
    mode tcp
    option ssl-hello-chk
    server apache 127.0.0.2:443 check

Guarde y cierre el archivo. Luego reinicie HAproxy.

sudo systemctl restart haproxy

En la configuración anterior, utilizamos la función SNI (Indicación de nombre de servidor) en TLS para diferenciar el tráfico VPN y el tráfico HTTPS normal.

  • Cuando doh.example.com está en el cliente TLS Hola, HAProxy redirige el tráfico al backend de DNSdist.
  • Cuando www.example.com está en el cliente TLS Hola, HAProxy redirige el tráfico al backend apache/nginx.
  • Si el cliente no especifica el nombre del servidor en TLS Client Hello, HAproxy usará el servidor predeterminado (DNSdist).

Puede probar esta configuración con openssl herramienta. Primero, ejecute el siguiente comando varias veces.

echo | openssl s_client -connect your-server-IP:443 | grep subject

No especificamos el nombre del servidor en el comando anterior, por lo que HAproxy siempre pasará la solicitud al servidor predeterminado (DNSdist) y su certificado se enviará al cliente. A continuación, ejecute los siguientes dos comandos.

echo | openssl s_client -servername www.example.com -connect your-server-IP:443 | grep subject

echo | openssl s_client -servername doh.example.com -connect your-server-IP:443 | grep subject

Ahora especificamos el nombre del servidor en los comandos, por lo que HAproxy pasará las solicitudes de acuerdo con las reglas de SNI que definimos.

Al renovar el certificado Let's Encrypt para su sitio web, se recomienda que utilice el http-01 desafío en lugar de tls-alpn-01 desafío, porque HAproxy está escuchando en el puerto 443 de la dirección IP pública, por lo que puede interferir con el proceso de renovación.

sudo certbot renew --preferred-challenges http-01

Ubuntu
  1. Cómo configurar un cortafuegos con UFW en Ubuntu 18.04

  2. Cómo proteger Nginx con Lets Encrypt en Ubuntu 20.04/18.04

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

  4. Cómo configurar el solucionador de DNS local usando Dnsmasq en Ubuntu 20.04

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

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

Cómo configurar Quad 9 DNS en Ubuntu 16.04 y Ubuntu 17.10 Desktop

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

Configurar el solucionador de DNS independiente en el servidor Ubuntu 20.04

Configurar Ubuntu Server con EHCP (LÁMPARA, DNS, FTP, Correo)