Solución de VPN basada en Raspberry Pi - VPiN

Publicada en Publicada en Anonimato, Criptografía, Hacking Hardware, Linux, Redes

Hola a todos chicos! En la entrada de hoy vamos a configurar una VPN utilizando una Raspberry Pi.

Hemos hablado ya de las ventajas que ofrece disponer de una conexión VPN en cuanto a la protección de nuestros datos, para lo cual os he enlazado la correspondiente entrada. ¡Recomiendo echarle un ojo!

La solución que utilizaremos ahora es la instalación de un servicio OpenVPN vía UDP dentro de una Raspberry Pi, fácilmente accesible desde cualquiera de nuestros dispositivos. Frente a las diversas soluciones automatizadas y en forma de script que sé que las hay, vamos a realizar el proceso de manera un poquito más manual. ¡Una VPiN! 😀

Instalación de OpenVPN

Comenzaremos ahora a instalar la herramienta OpenVPN para ofrecer un servicio VPN al exterior. Podemos hacerlo desde los mismos repositorios de Raspbian.

sudo apt install openvpn

Podemos comprobar el estado del servicio, y acto seguido iniciarlo y volver a comprobar el estado para ver si todo ha ido correctamente.

sudo service openvpn status
sudo service openvpn start
sudo service openvpn status

Para seguir configurando el servicio, de momento lo desactivaremos.

sudo service openvpn stop

Configuración de la PKI y la autoridad certificadora

Queremos ahora generar una infraestructura de clave pública o PKI para permitir la autenticación y la verificación de la identidad del servidor y de los clientes. Para ello, lo primero que tenemos que hacer es configurar OpenVPN para que sea capaz de generar los pares de claves pública y privada RSA necesarios para crear estos certificados y actuar como entidad certificadora (CA).

Para manejar las claves RSA OpenVPN se sirve de una utilidad llamada easy-rsa, que proporciona una interfaz fácil para generar claves. Copiamos la carpeta de dicha utilidad, que podemos instalar de repositorios de no tenerla, en el interior del directorio de OpenVPN.

Ejecutaremos ahora los siguientes comandos como administrador para generar nuestra entidad de certificación:

source ./vars
./clean-all
./build-ca

Iremos rellenando uno a uno los campos que se nos piden aceptando el valor por defecto.

Una vez acabado el formulario tendremos nuestra CA. Podemos ahora construir nuestro servidor de claves con el nombre que queramos

./build-key-server OpenVPNServer

Se nos pedirá de forma similar al paso anterior rellenar una serie de campos. Podemos dejar todo por defecto, ya que nos rellenará el nombre del servidor con el que hemos introducido. Además, debemos aceptar la firma del certificado. El resultado es un certificado para el servicio con validez de diez años.

Pasamos a generar ahora las claves de usuarios o clientes. Asignaremos un par de claves a cada uno de los dispositivos desde donde queramos acceder a la VPN, o bien podemos tener un solo par de claves repartido entre los que queramos. Sin embargo, esto impide la conexión concurrente de dispositivos.

Para crear nuestro par de claves, ejecutaremos:

source ./vars
./build-key-pass hartek

Se nos mostrará de nuevo un formulario muy similar. Esta vez, además, debemos introducir una contraseña de acceso con la que proteger nuestra clave privada.

Accederemos ahora al directorio /etc/openvpn/easy-rsa/keys, en el cual encontramos todas las claves generadas hasta el momento. Protegeremos nuestra clave privada mediante TripleDES con el siguiente comando:

openssl rsa -in hartek.key -des3 -out hartek.3des.key

Así queda nuestra clave privada mejor protegida si cabe. Volvemos al directorio /etc/openvpn/easy-rsa.

Ahora podemos configurar el algoritmo de intercambio de claves Diffie-Hellman, necesario para realizar el intercambio de claves de la PKI de forma segura. Podemos hacerlo con el siguiente comando, que tardará un rato en terminar de ejecutarse:

./build-dh

Para prevenir los ataques de denegación de servicio, incorporaremos una protección de acceso por HMAC. De esta forma el servidor solamente trata de autenticar a los usuarios que posean esta clave HMAC precompartida.

Generaremos la clave HMAC:

sudo openvpn --genkey --secret keys/ta.key

Tenemos ya todas las claves necesarias para poner en marcha el servicio.

Configuración del servicio OpenVPN

Lo siguiente será crear y modificar los ficheros que utilizará OpenVPN para configurar el servicio. Primeramente creamos y abrimos con el editor vim un fichero de configuración en /etc/openvpn llamado server.conf.

Nota: Tenemos un ejemplo del mismo con explicaciones de cada campo en el directorio /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz comprimido en gzip.

Modificaremos ahora el fichero /etc/sysctl.conf del sistema Raspbian de manera que activaremos al inicio el reenvío de paquetes IPv4, que por defecto está desactivado. Esto es necesario para poder encaminar las comunicaciones a través del tunelado VPN.

Descomentamos la segunda de la imagen línea borrando el símbolo # que tiene originalmente:

Guardamos los cambios en el fichero y ejecutamos el siguiente comando para aplicar los cambios inmediatamente:

sudo sysctl -p

Ahora configuraremos un script con una regla de encaminamiento con iptables, que nos permitirá redirigir el tráfico de la subred de la VPN a la red local. Creamos y editamos con vim un fichero /etc/firewall-openvpn-rules.sh con el siguiente contenido:

Creado el fichero, lo protegeremos impidiendo el acceso al margen del creador del mismo (el administrador):

sudo chmod 700 /etc/firewall-openvpn-rules.sh

Una vez hecho esto, lo agregaremos al fichero /etc/network/interfaces junto al resto de la configuración de la interfaz de forma que el script se ejecute al arranque de la interfaz de red:

Hecho esto ya tendremos el encaminamiento definido desde el arranque. En este punto ejecutamos un reinicio de la máquina y tendremos listo nuestro servidor. Comprobamos que está activado el direccionamiento IPv4 con el comando:

cat /proc/sys/net/ipv4/ip_forward

Si el valor devuelto es un 1, está activado.

Configuración de la DNS dinámica

Para permitir el acceso desde el exterior sin tener que depender de la variabilidad de la IP pública de nuestro ADSL, es conveniente configurar un servicio DDNS o DNS dinámico, como puede ser no-ip. De esta forma, se nos asignará un subdominio que apuntará a nuestra IP pública de forma dinámica y eliminaremos este problema.
Crearemos una cuenta en el servicio no-ip (http://www.noip.com/) y configuraremos un nuevo hostname. Podemos ponerle el nombre y dominio padre que queramos siempre que esté disponible.

Para que este subdominio se reasigne al cambiar la IP pública, debemos instalar el cliente noip en nuestra Raspberry Pi. Para ello, ejecutamos los siguientes comandos para descargar e instalar dicho cliente:

mkdir /home/pi/noip
cd /home/pi/noip
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar vzxf noip-duc-linux.tar.gz
cd noip-2.1.9-1
sudo make
sudo make install

En la instalación se nos pedirán los datos de acceso a la cuenta de noip. El resto de campos podemos dejarlos predeterminados, dado que solamente tenemos un subdominio. Si no, tendríamos que seleccionarlo de una lista.

Una vez instalado el cliente no-ip, querremos que este se inicie cada vez que arranque la Raspberry Pi. La mejor manera de hacer esto es configurar un script de inicio en init.d. Podemos hacerlo creando un nuevo fichero /etc/init.d/noip2 y copiando el contenido del script encontrado en este manual.

Acto seguido, le damos permisos de ejecución y actualizamos la lista de scripts de inicio. Además, lo arrancamos de forma manual.

sudo chmod +x /etc/init.d/noip2
sudo update-rc.d noip2 defaults
sudo /usr/local/bin/noip2

Ya tenemos configurado nuestro servicio DDNS para poder comunicarnos con él desde el exterior de forma fácil y más directa.

Creación del perfil cliente VPN

Para crear los perfiles de configuración que cada cliente deberá utilizar para realizar la conexión al servidor, haremos uso del script creado por Eric Jodoin. Podemos descargarlo de su repositorio (https://gist.github.com/laurenorsini/10013430) con el siguiente comando:

sudo git clone https://gist.github.com/laurenorsini/10013430\ /etc/openvpn/easy-rsa/keys

Crearemos ahora un fichero de configuración que servirá de entrada para el script como base para crear el perfil de acceso de cliente. Crearemos y editaremos un nuevo fichero localizado en /etc/openvpn/easy-rsa/keys/Default.txt, que contendrá algunos parámetros que nos sonarán de la configuración del servidor, y otros específicos del cliente.

Ahora podemos dar permisos de ejecución al script de creación de perfiles que hemos descargado, y ejecutarlo.

sudo chmod +x /etc/openvpn/easy-rsa/keys/MakeOpenVPN.sh
cd /etc/openvpn/easy-rsa/keys
sudo ./MakeOpenVPN.sh

Se nos pedirán datos acerca de la localización de los ficheros de claves de la CA. Si todo va bien, recibiremos un mensaje de éxito y tendremos creado nuestro perfil de cliente.

Hecho esto ya tenemos nuestro perfil creado. Procedemos a copiarlo al directorio home de la Raspberry Pi, hacernos con su propiedad, y copiarla en otro dispositivo mediante herramientas como scp (en sistemas Linux) o Bitvise (en sistemas Windows).

NOTA IMPORTANTE: Antes de probar que todo marcha, ¡recuerda configurar el Port Forwarding de tu Router! Deberás hacer que el puerto UDP 1194 se redirija a la interfaz de red de la Raspberry que esté conectada al Router. Además, podría ser conveniente configurar un DHCP Lease para que siempre se asigne la misma dirección IP a nuestro servidor VPN.

NOTA IMPORTANTE 2: En ocasiones, el autoarranque del servicio de OpenVPN en la Rasberry Pi intentará ejecutarse antes de que se haya establecido la dirección IP de la interfaz. El servicio fallará al intentar asociarse a una IP que no tiene.

Esto puede verse en el fichero de log /var/log/openvpn.log:

Una solución es comentar la siguiente línea del fichero de configuración /etc/openvpn/server.conf, de manera que el servicio no intente asociarse de forma concreta a la IP especificada:

 

Esto es todo por hoy, chicos. Con todo esto, deberíais tener un servidor OpenVPN por UDP totalmente funcional. Pronto ampliaré este experimento con una segunda parte en la que empezaremos a realizar un sniffing de todo el tráfico de red... ¿Y si un servicio VPN decidiese espiarme?

Saludos!!

Un comentario en “Solución de VPN basada en Raspberry Pi - VPiN

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *