Miércoles, Julio 08, 2020

Seguridad: Cifrar todo nuestro tráfico con DNSCrypt

Seguridad Wireless

Una medida de seguridad que todos deberíamos de implementar pero que desafortunadamente se suele pasarse por alto es el cifrar nuestra navegación (tráfico) entre nuestro equipo y el ISP. La implementación de esta medida nos permite protegernos de al menos tres grandes problemáticas: burlar las posibles restricciones que nuestro ISP pueda estar llevando a cabo sobre nosotros, prevenir que alguien espíe nuestras comunicaciones (ya sea por parte del ISP o del DNS) y protegernos de ataques Man In The Middle.

Introducción

Cuando solicitamos acceder a alguna página o servicio web dicha petición pasa forzosamente por nuestro ISP, como el ISP cuenta con sus propios servidores DNS se encarga de traducir la URL en una dirección IP, una vez obtenida la dirección IP del servicio o página web, se establece la conexión de forma exitosa entre nuestro equipo y el servicio o página solicitada. En pocas palabras, nuestro ISP actúa como intermediario entre nuestro equipo y el servidor a quien dirigimos nuestra petición de conexión. Este concepto se puede apreciar de mejor forma con ayuda de la siguiente imagen:

ISP

Es importante comprender que todas las peticiones que realicemos a nuestro ISP no se encuentran cifradas de forma predeterminada, por lo tanto es bastante sencillo analizar todas las actividades que estemos llevando a cabo (en este caso nuestro ISP tiene una posición privilegiada en este aspecto). Pero nuestro ISP no es el único que puede estar espiando nuestras comunicaciones, también puede ser alguien que se coloque entre nosotros y el ISP, a esto se le conoce como Man In The Middle.

A grandes rasgos la finalidad del ataque Man In The Middle es la de intervenir la conexión entre nuestro equipo y el ISP, pudiendo escuchar, redirigir e interceptar todo lo que se transmite por dicha conexión. En el siguiente ejemplo veremos de forma gráfica como se representaría este concepto, siendo la computadora de color rojo nuestro atacante:

Man in the Middle

Como se puede apreciar, estamos en una muy mala posición en lo que a seguridad y privacidad se refiere pero ¿qué se puede hacer al respecto? Cifrar nuestra conexión. Al cifrar nuestra conexión no importará que alguien más este escuchando el tráfico entre nosotros y el DNS, y esto lo conseguiremos con ayuda de DNSCrypt.

DNSCrypt es una herramienta que nos permite cifrar el tráfico entre nuestro equipo y el DNS, DNSCrypt emplea a OpenDNS como servicio de resolución de nombres de dominio de forma predeterminada, aunque también se puede seleccionar alguna alternativa distinta a OpenDNS. DNSCrypt está disponible para los siguientes sistemas operativos: OSXOpenBSDBitrigNetBSDDragonfly BSDFreeBSDLinuxiOSAndroid,Solaris y Windows.

Requerimientos

Como actualmente no existe ningún paquete .deb, .rpm o repositorio que podamos utilizar para su instalación, es necesario recurrir a la compilación de su código fuente. Para ello necesitamos instalar los paquetes necesarios para compilar la aplicación y sus dependencias, abre una terminal y pega lo siguiente:

Debian, Ubuntu, elementary OS, Linux Mint y derivadas

sudo apt-get install build-essential

openSUSE

su -
zypper install -t pattern devel_C_C++

Instalación

A continuación descargaremos la librería libsodium, misma que es necesaria para compilar DNSCrypt, para ello accedemos al siguiente enlace y seleccionamos la versión deseada (preferentemente la más reciente).

Descomprimimos el archivo .tar.gz y comenzamos el proceso de compilación:

tar -xvzf libsodium-0.4.1.tar.gz
cd libsodium-0.4.1
./configure
make

Verificamos que todo se encuentre en orden:

make check

Si hasta este punto no hemos tenido ningún problema, continuamos con la instalación y para ello la efectuamos como root:

make install
exit

Solo como un dato adicional, libsodium se instala de forma predeterminada en la siguiente carpeta: /usr/local/lib.

Antes de comenzar a compilar DNSCrypt es necesario ejecutar como root lo siguiente:

ldconfig

Descargamos DNSCrypt desde aquí, lo descomprimimos y comenzamos con la compilación como usuario del sistema:

tar -xvzf dnscrypt-proxy-1.3.1.tar.gz
cd dnscrypt-proxy-1.3.1
./configure
make

Proseguimos con la instalación como root:

make install
exit

dnscrypt-proxy se instala en la siguiente carpeta: /usr/local/sbin por defecto.

Hasta aquí hemos compilado e instalado todo lo necesario para que DNSCrypt funcione correctamente, a continuación realizaremos su configuración.

Configuración

Las capturas de pantalla que a continuación aparecen fueron realizadas en elementary OS, por lo que el procedimiento puede variar dependiendo del entorno de escritorio/gestor de ventanas/shell que se encuentre utilizando.

El primer paso es configurar Networkmanager para ello accedemos a el desde su indicador:

Networkmanager Indicator

Networkmanager Menu

Seleccionamos nuestra interfaz de red, ya sea que nos conectemos vía Ethernet (red cableada) o Wireless (WiFi) –si utilizas ambas interfaces deberás repetir el siguiente procedimiento–, después de haber seleccionado la interfaz es necesario dar clic en el botón Editar para cambiar su configuración:

Networkmanager Edit

A continuación modificamos los valores para los campos: Método y Servidores DNS. El en primer campo elegimos la opción Sólo direcciones automáticas (DHCP). En el segundo se debe colocar la dirección 127.0.0.1 como se muestra en la imagen:

En caso de presentar problemas de conexión utilizando la IP 127.0.0.1, será necesario sustituirla por 127.0.0.2. Se recomienda encarecidamente probar esto antes de realizar dicha modificación.

Networkmanager Config

Las siguientes acciones deben de efectuarse como root hasta que se indique lo contrario.

Una vez realizadas las modificaciones pertinentes debemos reiniciar a Networkmanager desde la terminal:

restart network-manager

Temporalmente permaneceremos sin conexión hasta que DNSCrypt se ejecute correctamente, esto se debe a que en este momento no estamos utilizando ningún servidor DNS.

Ejecución

Para ejecutar DNSCrypt y probar que todo funciona normalmente es necesario hacer lo siguiente.

Desde la terminal ejecutamos:

/usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096

En este punto ya deberíamos de haber recobrado nuestra conexión, para comprobar que nuestro tráfico esta siendo cifrado y estamos empleando los servidores de OpenDNS es necesario abrir nuestro navegador de Internet y acceder la siguiente URL:

http://www.opendns.com/welcome/

Si esto no ocurre continua leyendo.

Posibles errores al tratar de ejecutar dnscrypt-proxy

Conflictos con la IP 127.0.0.1

Este podría ser el problema principal, para comprobarlo primero verifica que se encuentre en ejecución el demonio dnscrypt-proxy, una forma rápida de hacerlo es comprobar que exista el archivo /run/dnscrypt-proxy.pid:

cat /run/dnscrypt-proxy.pid

Si lo anterior no devuelve un error significa que dnscrypt-proxy se encuentra en ejecución y cuyo PID es el número que apareció en tu terminal. Ejemplo:

19035

Acto seguido, finalizamos el proceso (sustituye el número 19035 por el que te haya aparecido en la terminal):

kill -9 19035

Regresa al apartado Configuración y modifica la dirección 127.0.0.1 por 127.0.0.2, por otra parte verifica que la ruta hacia dnscrypt-proxy sea la correcta.

Para finalizar, ejecuta nuevamente a dnscrypt-proxy de la siguiente forma:

/usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096 --local-address=127.0.0.2

Y realiza nuevamente la comprobación con la URL de OpenDNS.

dnscrypt-proxy no se encuentra en la carpeta /usr/local/sbin

En este caso basta con buscar la carpeta donde se ha instalado dnscrypt-proxy, para hacerlo copia y pega lo siguiente:

find / -name dnscrypt-proxy

En la terminal debería de aparecer la ruta donde se encuentra instalado, una vez realizado lo anterior, remplazar la ruta del mismo:

/...ruta_mostrada_en_la_terminal.../dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096

Ejecutar dnscrypt-proxy de forma automática al iniciar el sistema

Una vez que todo funciona como se espera, es necesario incluir a dnscrypt-proxy en las aplicaciones/servicios que inician de forma automática cada vez que se enciende el equipo, si bien existe diversas formas de hacerlo en esta ocasión veremos una forma rápida y sencilla de hacerlo, dependerá exclusivamente del usuario elegir la mejor alternativa según sus preferencias o necesidades.

Las siguientes lineas deben agregarse a los respectivos archivos de configuración de las distribuciones aquí tratadas. Realiza las modificaciones pertinentes si dnscrypt-proxy se encuentra en una ruta distinta a la señalada o si deseas modificar alguna de sus opciones.

Para 127.0.0.1

exec /usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096

Para 127.0.0.2

exec /usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096 --local-address=127.0.0.2

Debian, Ubuntu, elementary OS, Linux Mint y derivadas

En este tipo de distribuciones basta con añadir el siguiente comando dentro del archivo /etc/rc.local, desde la terminal accedemos al archivo en cuestión:

nano /etc/rc.local

Mismo que debe de tener el siguiente aspecto:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exit 0

Y pegamos una de las 2 líneas según corresponda justo antes de donde aparece la línea: exit 0.

Quedando de forma similar a lo siguiente:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exec /usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096

exit 0

openSUSE

Para conseguir que DNSCrypt inicie al encender el equipo de forma automática necesitamos realizar las modificaciones correspondientes dentro del archivo /etc/init.d/after.local como se muestra a continuación:

nano /etc/init.d/after.local

El contenido del archivo es semejante a este:

#! /bin/sh
#
# Copyright (c) 2010 SuSE LINUX Products GmbH, Germany. All rights reserved.
#
# Author: Werner Fink, 2010
#
# /etc/init.d/after.local
#
# script with local commands to be executed from init after all scripts
# of a runlevel have been executed.
#
# Here you should add things, that should happen directly after
# runlevel has been reached. Common environment
# variables for this are:
# RUNLEVEL -- The current system runlevel.
# PREVLEVEL -- The previous runlevel (useful after a runlevel switch).
#

Ahora solo se necesita pegar alguna de las 2 líneas según corresponda al final del archivo, quedando de forma similar a esta:

#! /bin/sh
#
# Copyright (c) 2010 SuSE LINUX Products GmbH, Germany. All rights reserved.
#
# Author: Werner Fink, 2010
#
# /etc/init.d/after.local
#
# script with local commands to be executed from init after all scripts
# of a runlevel have been executed.
#
# Here you should add things, that should happen directly after
# runlevel has been reached. Common environment
# variables for this are:
# RUNLEVEL -- The current system runlevel.
# PREVLEVEL -- The previous runlevel (useful after a runlevel switch).
#

exec /usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096

Con esto hemos terminado su instalación y posterior configuración.

Otras Configuraciones

Para conocer todos los parámetros aceptados por DNSCrypt favor de leer su documentación.

Alternativas a OpenDNS

Desde la versión 1.3.3, DNSCrypt ofrece la posibilidad de seleccionar otros servicios de resolución de nombres de dominio libres y alternativos a OpenDNS, los cuales prometen no almacenar ningún tipo de registro de su uso. Algunos de ellos son:

Una vez hemos elegido el servicio de DNS a utilizar, es necesario establecer los siguientes parámetros con la información correspondiente a dicho proveedor:

--resolver-address=ADDRESS --provider-name=PNAME --provider-key=PKEY

Por ejemplo para emplear el servicio de CloudNS sería:

--resolver-address=113.20.6.2 --provider-name=2.dnscrypt-cert.cloudns.com.au --provider-key=1971:7C1A:C550:6C09:F09B:ACB1:1AF7:C349:6425:2676:247F:B738:1C5A:243A:C1CC:89F4

TCP Only

Es importante señalar que DNSCrypt utiliza por defecto el puerto UDP 443, pero si desea forzar a que todas las peticiones se realicen por medio del protocolo TCP (TCP 443) es necesario utilizar el parámetro --tcp-only. El puerto TCP 443 se utiliza comúnmente para la comunicación a través de HTTPS por lo que a consecuencia de esto las peticiones enviadas por dicho puerto no se pueden filtrar. El uso del parámetro –tcp-only no se recomienda ya que las peticiones TCP son más lentas que las efectuadas por UDP y solo debe de emplearse esta opción en circunstancias donde sea necesario evitar algún tipo de filtro. Un ejemplo práctico de su uso sería:

--tcp-only

Algunas aplicaciones pueden no funcionar correctamente al emplear dicho parámetro. Tome sus precauciones.

Optimización

A pesar de que el uso de DNSCrypt no afecta en ningún momento la velocidad de carga de las páginas web, así como la transferencia de archivos (upload y download), es posible en algunos casos que se note una pequeña demora (en milisegundos) al momento de tratar de acceder a alguna URL en específico, para después continuar de forma normal con el renderizado (carga) de la página. Para evitar esta situación, se pueden tomar 2 acciones:

  • Seleccionar el servicio de DNS más cercano a nuestra ubicación geográfica.
  • Utilizar alguna aplicación que funcione como DNS cache (recomendado). Unbound resulta ser una excelente opción.

DNSCrypt Autoinstaller

Para finalizar, es importante mencionar que existe un bash script que permite instalar y configurar de forma automática a DNSCrypt, desafortunadamente únicamente funciona para Debian. En este enlace pueden obtener más información al respecto o si prefieren consultar su código fuente pueden hacerlo desde su repositorio en GitHub.

Happy Hacking!!! ;).

 

Fuente: perseosblog

Compártelo. ¡Gracias!

 
Grupo Digital de Ayuda! Laboratorio Linux! - Linux para todos.

¿Quién está en línea?

Hay 55 invitados y ningún miembro en línea

Contador de Visitas

10732062
Hoy Hoy 357
Ayer Ayer 2724
Esta semana Esta semana 5805
Este mes Este mes 18788
Total de Visitas Total de Visitas 10732062

Día con más
visitantes

06-03-2020 : 2881

Gracias por su visita