Seguridad: Cifrar todo nuestro tráfico con DNSCrypt en Ubuntu, Mint y elementary OS

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:

Proceso de conexión entre nuestro equipo y los diferentes servicios webProceso de conexión entre nuestro equipo y los diferentes servicios web

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:

Ataque Man In The MiddleAtaque 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 ente 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 sistema 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: OSX, OpenBSD, Bitrig, NetBSD, Dragonfly BSD, FreeBSD, Linux, iOS, Android, Solaris y Windows.

Instalación

Como actualmente no existe ningún paquete .deb 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 y compilar algunas dependencias.

Dependencias

Lo primero que haremos es instalar los paquetes necesarios para la compilación, abre una terminal y pega lo siguiente:

  1. sudo apt-get install build-essential

Posteriormente descargaremos la librería libsodium, misma que es necesaria para compilar DNSCrypt:

  1. cd
  2. wget http://download.libsodium.org/libsodium/releases/libsodium-0.4.1.tar.gz

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

  1. tar -xvzf libsodium-0.4.1.tar.gz
  2. cd libsodium-0.4.1
  3. ./configure
  4. make

Verificamos que todo se encuentre en orden:

  1. make check

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

  1. sudo su
  2. make install
  3. exit

Note

Solo como un dato adicional, en este caso libsodium ha sido instalado en la siguiente carpeta: /usr/local/lib.

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

  1. sudo ldconfig

Descargamos DNSCrypt, lo descomprimimos y comenzamos con la compilación:

  1. cd
  2. wget http://download.dnscrypt.org/dnscrypt-proxy/dnscrypt-proxy-1.3.1.tar.gz
  3. tar -xvzf dnscrypt-proxy-1.3.1.tar.gz
  4. cd dnscrypt-proxy-1.3.1
  5. ./configure
  6. make

Proseguimos con la instalación:

  1. sudo su
  2. make install
  3. exit

Note

En mi caso dnscrypt-proxy se instaló en la siguiente carpeta: /usr/local/sbin. Desconozco si en algunas versiones de Ubuntu y derivadas esta ruta pueda ser diferente a la señalada, ten la precaución de verificarlo.

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

Configuración

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

networkmanager-indicatornetworkmanager-indicatorNetworkmanager - Editar las conexionesNetworkmanager - Editar las conexiones

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 - Conexiones de redNetworkmanager - Conexiones de red

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:

Note

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 - Editando la interfaz de redNetworkmanager - Editando la interfaz de red

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

  1. sudo restart network-manager

Note

Temporalmente permaneceremos sin conexión hasta que DNSCrypt se ejecute correctamente.

Ejecución

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

Desde la terminal ejecutamos:

  1. sudo /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, si esto no ocurre continua leyendo:

Note

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

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:

  1. 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:

  1. 19035

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

  1. sudo kill -919035

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:

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

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:

  1. sudo 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:

  1. sudo /...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 nuestro rc.local para que se ejecute automáticamente cada vez que se inicie el sistema. Para realizar esto abrimos el archivo /etc/rc.local:

  1. sudo nano /etc/rc.local

Mismo que debe de tener el siguiente aspecto:

  1. #!/bin/sh -e
  2. #
  3. # rc.local
  4. #
  5. # This script is executed at the end of each multiuser runlevel.
  6. # Make sure that the script will "exit 0" on success or any other
  7. # value on error.
  8. #
  9. # In order to enable or disable this script just change the execution
  10. # bits.
  11. #
  12. # By default this script does nothing.
  13. exit0

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

Note

Realiza las modificaciones pertinentes si dnscrypt-proxy se encuentra en una ruta distinta a la señalada.

Para 127.0.0.1

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

Para 127.0.0.2

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

Quedando de forma similar a lo siguiente:

  1. #!/bin/sh -e
  2. #
  3. # rc.local
  4. #
  5. # This script is executed at the end of each multiuser runlevel.
  6. # Make sure that the script will "exit 0" on success or any other
  7. # value on error.
  8. #
  9. # In order to enable or disable this script just change the execution
  10. # bits.
  11. #
  12. # By default this script does nothing.
  13. exec/usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096
  14. exit0

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

Note

La siguiente parte es una ampliación de este How To, donde se explicarán principalmente 2 opciones extra que pueden llegar a ser útiles para evitar el bloqueo hacia algunas páginas web por parte del ISP.

Algunos routers y firewalls pueden bloquear las consultas DNS salientes o redirigirlas a su propio servidor DNS. Esto ocurre especialmente en puntos de acceso WiFi públicos, como en cafeterías. Una solución a este problema es el emplear el parámetro --resolver-port y especificar el número de puerto por el cual se desea realizar dichas peticiones. OpenDNS por defecto responde las peticiones de servicio a través de los puertos 53, 443 y 5353. Un ejemplo práctico de su uso sería:

  1. --resolver-port=5353

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:

  1. --tcp-only

Un ejemplo de como quedaría nuestro rc.local al incluir estas opciones (según sea el caso) sería el siguiente:

  1. #!/bin/sh -e
  2. #
  3. # rc.local
  4. #
  5. # This script is executed at the end of each multiuser runlevel.
  6. # Make sure that the script will "exit 0" on success or any other
  7. # value on error.
  8. #
  9. # In order to enable or disable this script just change the execution
  10. # bits.
  11. #
  12. # By default this script does nothing.
  13. exec/usr/local/sbin/dnscrypt-proxy --daemonize --pidfile=/run/dnscrypt-proxy.pid --edns-payload-size=4096--resolver-port=5353--tcp-only
  14. exit0

Fuente: perseosblog

¿Quién está en línea?

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