Cómo configurar una VPN IPSEC + L2TP con una Raspberry Pi y conectarte usando tu móvil o tu PC

Captura


NOTA 02/09/2016: Después de una actualización a Raspbian 8, los componentes de OpenSWAN (y otras alternativas como StrongSWAN y LibreSWAN) empleando NAT-T en ambos endpoints no funcionan con Raspberry Pi, por lo que este tutorial solamente aplica a Raspbian 7.

Si has logrado configurar de forma satisfactoria tu VPN con OpenSWAN bajo Raspbian 8 déjame un comentario para actualizar el procedimiento.


Muchas veces la única forma que tenemos de conectarnos con Internet es a través de una conexión insegura (una red inalámbrica abierta en un hotel, una cafetería o una universidad, una conexión en una red no confiable, la red GSM/GPRS del teléfono móvil, etc.). En este punto, nos gustaría garantizar que los datos transmitidos estuvieran protegidos y que nuestra navegación se realizara a través de un canal confiable.

Es en este punto en el cual entra en acción una VPN (Virtual Private Network): Una conexión segura a través de un canal inseguro. Empleando una VPN creamos un túnel cifrado entre dos dispositivos, de tal forma que únicamente esos dos puntos puedan desencriptar el tráfico independientemente del canal por donde se transmitan. Siendo así, si tenemos en casa una Raspberry Pi y en la oficina un ordenador o disponemos de un teléfono móvil (se ofrecen ejemplos de conexión con Android y Windows XP/7/8), podemos crear una VPN de una forma fácil y sencilla para proteger los datos transmitidos.

Contenido

Introducción

En Internet se pueden encontrar múltiples manuales para la creación de túneles VPN empleando paquetes como OpenVPN (que emplea SSL/TLS para la protección de las conexiones) y que es una muy buena solución. Sin embargo, en este artículo emplearemos IPSEC (que emplea cifrado en capa 3 a nivel IP), tomando como referencia este artículo y este otro en inglés.

La lógica de todo el proceso es la siguiente:

  1. El cliente VPN (Roadwarrior) – que para este caso es un teléfono móvil con Android o un ordenador con Windows XP/7/8 – se conecta al puerto 4500/UDP en donde el daemon de IPSEC (OpenSwan) está escuchando.
  2. El daemon de gestión de claves (IKE pluto) negocia la Phase 1 ISAKMP Security Association.
  3. Después de la definición de ISAKMP Security Association (SA), se procede con la fase 2 (Phase 2 IPSec SA) empleando PSK (Pre-shared keys).
  4. Después que la conexión esté autenticada mediante PSK, el tráfico ya estará cifrado (puerto 500/UDP). En este punto se realiza una autenticación de de usuarios usando Point to Point (PPP).
  5. xl2tpd gestionará la autenticación y la gestión del enlace de comunicación a través de Link Control Protocol (LCP).
  6. xl2tpd negocia con los dos puntos que se conectan (cliente y servidor) otros parámetros de funcionamiento tales como encriptación y compresión.
  7. xl2tpd inicia la fase de autenticación de usuario solicitando nombre de usuario y contraseña empleando el puerto 1701/UDP.
  8. Las credenciales provistas por el usuario son enviadas por xl2tpd a pppd empleando CHAP
  9. pppd inicia el túnel e invoca los protocolos de capa de red seleccionados durante la fase del establecimiento del enlace (paso 6), incluyendo IPCP que otorga direcciones IP de forma dinámica a los clientes que se conectan al túnel.
  10. Con el túnel ppp activo y autenticado, la conexión se ha finalizado

Pre-requisitos

Antes de proceder, se debe validar que se tienen los siguientes elementos:

  • Raspberry Pi con un sistema operativo actualizado y suficiente espacio en disco
  • Dirección IP estática o en caso contrario registrar la dirección IP en un servicio de DNS dinámico como No-IP
  • Posibilidad de modificar el router de casa para la apertura de puertos

Paso 1: Instalar los paquetes de software requeridos

Para la configuración de la VPN empleando IPSEC se necesitará la instalación de OpenSWAN (que permitirá la gestión del túnel IPSEC), xl2tpd (que permitirá la conexión mediante L2TP (Layer 2 Tunneling protocol)) y pppd (que administrará la autenticación y la apertura, transmisión y cierre del canal como si de una conexión vía módem se tratara, ya que es la conexión entre dos puntos remotos). Por lo general pppd ya viene instalado en las últimas versiones de Raspbian, por lo que se instalarán los otros dos paquetes con el comando:

Paso 2: Configurar OpenSWAN

A continuación, se procede a configurar OpenSWAN desde su fichero de configuración ubicado en /etc/ipsec.conf. La recomendación es hacer una copia de seguridad del fichero original y emplear un fichero nuevo:

En este nuevo fichero se deben copiar las siguientes líneas, teniendo presente que la indentación no son espacios sino tabuladores:

La única directiva que hay que personalizar es “left=” en donde se debe especificar la dirección IP de la Raspberry Pi.

Para este caso, la VPN trabajará bajo PSK (Pre-Shared Key), es decir: una contraseña compartida entre el cliente y el servidor VPN. Para ello, se edita el fichero /etc/ipsec.secrets asignando una contraseña robusta:

Tener presente que la contraseña debe estar entre comillas. En esta configuración permitimos que cualquier usuario que conozca el valor del PSK se pueda conectar, aunque se puede restringir y remplazar en vez de %any.

Paso 3: Configurar xl2tpd

Después de añadir el soporte de IPSEC a la conexión, se procede con la configuración de xl2tpd, cuyo fichero de configuración se encuentra en /etc/xl2tpd/xl2tpd.conf. Se hace lo mismo que con el fichero de configuración de IPSEC: una copia de seguridad y un fichero nuevo:

Ahora se edita con los siguientes valores:

En este caso se deben parametrizar las siguientes variables:

  • ip range: Con el rango de direcciones IP que se asignarán a los diferentes túneles que se creen. Ejemplo: ip range = 192.168.1.210-192.168.1.220
  • local ip: En donde se ingresa la dirección IP de la Raspberry Pi
  • name: En donde se define un identificador de la conexión. Puede ser cualquier nombre que se quiera

Paso 4: Configurar PPP

A continuación se procederá con la configuración de PPP que se encargará de la señalización del canal y los procesos de autenticación de usuarios. Para ello – y al igual que con los otros ficheros – se hace una copia de seguridad primero:

Y se edita con las siguientes líneas:

En este caso, el único valor parametrizable es ms.dns, en donde ponemos la dirección IP de un servidor DNS. Se puede usar el servidor 4.2.2.2 o el que se tenga disponible.

Luego, se procede con la configuración de la autenticación. Para esta conexión se empleará CHAP, que es más seguro que PAP (por defecto), cuya configuración ya se había especificado en el fichero /etc/xl2tpd/xl2tpd.conf. Esto se realiza en el fichero /etc/ppp/chap-secrets:

En este caso, se debe poner un nombre de usuario y una nueva contraseña. Las separaciones entre los valores son tabuladores.

Paso 5: Activar IP Forwarding, deshabilitar send_redirects y accept_redirects y configurar el generador de números aleatorios

Para permitir que la Raspberry Pi pueda recibir y enviar tráfico como si fuera un router, se debe activar IP Forwarding en el fichero /etc/sysctl.conf, parametrizando la variable net.ipv4.ip_forward a 1:

Para evitar problemas con ICMP redirects que puedan afectar al stack de NETKEY se deben activar los siguientes valores (por lo general vienen comentariados, asi que hay que quitarles el #):

Si no se quiere editar directamente el fichero, se puede ejecutar el siguiente comando:

Luego, reiniciar el servicio para que los cambios sean aceptados:

Por otro lado, se requiere re-configurar el generador de números aleatorios para garantizar una seguridad aceptable durante el proceso de encriptación usando el generador de hardware incluido en la Raspberry Pi. Para ello, se debe instalar el paquete rng-tools:

Antes de proceder con la configuración de rng-tools, es necesario cargar el módulo bcm2708_rng, que permite usar el generador de números aleatorios instalado en el chip de la Raspberry Pi. Esto se hace editando el fichero /etc/modules y agregando la línea “bcm2708_rng”:

Para cargar el módulo, simplemente ejecutamos el siguiente comando:

Posteriormente, editar el fichero /etc/default/rng-tools para que emplee /dev/hwrng (FIPS 140-2) como generador de números aleatorios:

Se reinicia el servicio para que tome los cambios:

Y se configura el servicio para que inicie cada vez que se reinicie la Raspberry Pi:

Paso 6: Validar que el servicio de IPSEC funciona correctamente

Cuando todo esté correctamente configurado, se realiza una validación de la configuración de OpenSWAN (IPSEC) para ver si hay algún problema:

Para este caso en particular, el [WARNING] referente a /bin/sh y /bin/dash se puede obviar.

Si por algún caso se reciben mensajes de fallo similares a estos:

Entonces ejecutar estos comandos para que los cambios sean aplicados directamente en el sistema operativo en ejecución:

Paso 7: Reiniciar los servicios de la VPN

Para que los cambios sean aplicados, se reinician los servicios asociados:

Paso 8: Configurar los puertos en el router

Para que la VPN pueda ser accedida desde Internet se requiere la apertura de los siguientes puertos en el router. Es importante que se revise el procedimiento dependiendo del modelo de router que se disponga:

  • 500/udp
  • 4500/udp
  • 1701/udp

Paso 9: Revisar los registros de eventos en el dispositivo Raspberry Pi

Para validar que todo el sistema funcione de forma correcta, visualizamos el fichero /var/log/daemon.log mientras establecemos una conexión con la VPN recién creada empleando un cliente Android o Windows:

Paso 10: Deshabilitar los registros de depuración

Si ya todo está en orden, los registros de depuración ya no se requieren, por lo que se deben deshabilitar las entradas de logs parametrizando a “no” o directamente borrando los siguientes valores en /etc/xl2tpd/xl2tpd.conf:

Configuración de un cliente VPN (Roadwarrior) en un teléfono móvil Android

Para finalizar la configuración del túnel necesitaremos configurar un cliente. En este caso, se realizará la conexión empleando un dispositivo Android 4.4.

Desde Settings -> Wireless & networks -> VPN Settings se crea la conexión. Como hemos empleado IPSEC con PSK, se escoge esta opción en la configuración de la VPN:

Screenshot_2015-11-16-18-56-28

En esta pantalla se ingresa la dirección IP del router y la clave PSK configurada en el fichero /etc/ipsec.secrets:

Screenshot_2015-11-16-18-56-48

Cuando la conexión esté creada, se puede ver una entrada como la siguiente:

Screenshot_2015-11-16-19-06-46

Al hacer clic, se preguntará por un nombre de usuario y una contraseña, que fueron especificados en el fichero /etc/ppp/chap-secrets:

Screenshot_2015-11-16-19-09-06

Si todo funciona bien, se debería ver el siguiente icono en la barra de notificaciones (un pequeño candado en la parte superior izquierda):

Screenshot_2015-11-16-19-12-48

Observando las propiedades se puede visualizar algo como lo siguiente:

Screenshot_2015-11-16-19-13-20

Configuración de un cliente VPN (Roadwarrior) en Microsoft Windows (XP/7/8)

Otra opción de conexión que se puede emplear es usar el cliente nativo de VPN incluido en los sistemas operativos Microsoft Windows. Las siguientes instrucciones son para Windows XP/7/8 pero el concepto es el mismo en otras versiones:

1. Ir a Panel de Control -> Centro de redes y recursos compartidos y escoger Configurar una nueva conexión o red

0

2. Dentro del asistente, escoger Conectarse a un área de trabajo. Dar Siguiente y crear una nueva conexión. Luego, escoger Usar mi conexión a Internet (VPN)

1

3. En este punto, indicar la dirección IP o nombre del host que se ha configurado como servidor de VPN y habilitar “No conectarse ahora; configurar para conectarse más tarde”

2

4. Escribir el nombre de usuario y la contraseña empleada para la autenticación de la conexión PPTP definida en el paso 4 y crear la conexión.

4

5. En este punto, la red ya está creada y debería desplegarse al dar clic sobre el ícono de red ubicado en la barra de tareas. Ir ahí, identificar la red creada, dar clic derecho y Propiedades

5

6. En la pestaña Seguridad escoger Protocolo de túnel de nivel 2 con IPSec (L2TP/IPSec) y habilitar Protocolo por autenticación por desafío mutuo (CHAP) y Microsoft CHAP versión 2 (MSCHAP v2)

6

7. Por último, en Tipo de VPN ir a Configuración avanzada y agregar la contraseña pre-compartida (Pre-Shared Key) definida en el paso 2.

7

8. Aqui ya se tiene la VPN definida. Ahora se procede a conectar y validar que todo haya quedado bien. Si hay problemas, revisar que el personal firewall permite las conexiones IPSEC.

18connecting

NOTA: Para revisar que la navegación esté siendo enrutada a través de la red al final del túnel VPN, se puede comprobar la dirección IP con la que se está navegando en http://www.whatsmyip.org.

Con todo esto, ya se tiene una VPN IPSEC completamente funcional, en ejecución y con cifrado robusto para tunelizar nuestro tráfico empleando una Raspberry Pi. Genial, ¿no?

giphy

NOTA: Si se quiere investigar acerca de configuraciones más complicadas, este enlace puede ser de utilidad.

Comments

  • Hola.
    Ante todo agradecer el manual. Está muy bien explicado.
    El problema es que efectivamente no es válido para Jessie.
    A ver si se encuentra solución.
    Saludos y gracias.

    Alicia November 26, 2016
    • Hola Alicia:
      Después de intentar aplicando mil configuraciones diferentes e incluso haciendo un downgrade de sistema operativo, el problema persistió. Finalmente, mi opción fue instalar Softether (https://www.softether.org/). El proceso de instalación lo puedes encontrar aquí: https://jlnostr.de/en/blog/raspberry-pi-sstp-vpn-server-installieren. En mi caso, activé la VPN sobre IPSEC pero también tienes la opción de emplear SSL (entre otras opciones). La consola de configuración la instalé en Windows y funciona de maravilla.
      Este manual lo he dejado aquí para referencia. En cuanto liberen una nueva versión de OpenSWAN lo probaré e intentaré actualizarlo.
      Muchas gracias por tu mensaje.

      david December 8, 2016
  • Hola que tal, buenas tardes, de antemano agradeciendo de la gran ayuda que nos has proporcionado por este medio, lei que no es compatible con la nueva version de raspbian, que version recomendarias saludos

    Aaron January 26, 2017

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.