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