Servidor VPN en nuestra Raspberry Pi

Estás en el trabajo y necesitas urgentemente el documento que habías hecho por la noche. Pero, no puede ser posible, te lo has dejado en casa porque lo has guardado en el disco duro de red y no en el pendrive…. ¿Y qué podemos hacer ahora?. ¿Ir a casa a por él?. Imposible. ¿Decir a alguien que nos lo traiga?. Venga, va…. . Para que no nos vuelva a suceder algo así, vamos a crearnos en casa un servidor VPN con el que poder conectarnos desde cualquier sitio y acceder a nuestra red.

REQUISITOS

Se ha utilizado el siguiente software/hardware para este artículo:

  • Raspberry Pi Modelo 3 con:
    • SO Raspbian, instalado y actualizado.
    • OpenVPN Server.
  • Disco duro de red WD MyCloud.

El esquema sobre el que se va a basar el artículo sería el siguiente:

INSTALACIÓN DE OPENVPN

Comenzaremos por instalar el software necesario para montar el servior VPN. Para ello, vamos a utilizar OpenVPN que vamos a instalar a través del comando apt-get install openvpn :

La instalación es sencilla y rápida. Para poder generar las claves correspondientes, OpenVPN utiliza el paquete easy-rsa que hace uso de los métodos de cifrado RSA. Para utilizar este paquete (asegurarse de que somo root) copiaremos el contenido del directorio /usr/share/easy-rsa/ en el directorio de instalación de OpenVPN que es /etc/openvpn/ :

thf_vpn_copiar_easy-rsa_13

Una vez copiado, nos situamos en el directorio /etc/openvpn/easy-rsa , editaremos el fichero con nombre vars y modificamos las siguientes líneas:

En la primera línea que hemos modificado, estamos estableciendo el directorio raíz de easy-rsa en el que se encuentra la carpeta keys en la que se generarán las claves. En la segunda línea establecemos el tamaño de la clave de cifrado, cuyo valor es recomendable que sea >=2048 bits.

CA Y CERTIFICADOS

Una CA o Autoridad Certificadora es una entidad emisora de certificados digitales SSL firmados que sólo proporciona certificados sobre un dominio concreto a su propietario, aseguran la validez de un certificado y verifican que el servidor es quien dice ser. Como ejemplo, para entenderlo mejor, cuando nos conectamos a una página web segura, la dirección url comenzará por HTTPS y se mostrará un candado de color verde:

Al pulsar sobre el candado, se muestra información sobre la compañía que ha expedido el certificado que se utiliza para cifrar la conexión entre nosotros y el servidor y que verifica la legitimidad de la página. Como información adicional, veamos el ejemplo con la página de https://www.google.es :

Estos certificados son un elemento muy importante en seguridad ya que con el certificado legítimo de una empresa (y su clave privada) sería posible suplantar un servidor legítimo o incluso peor si alguien consigue la clave privada de una CA ya que se podrían crear y firmar certificados válidos para un dominio. A continuación se muestra una tabla de todos los tipos de fichero que nos vamos a encontrar, por quién es requerido y su propósito:

CREANDO LOS CERTIFICADOS DE LA CA

En este apartado vamos a crear la CA y sus certificados. Para ello, procederemos a ejecutar por orden los siguientes comandos por orden:

  • source ./vars : carga la configuración del fichero vars.
  • ./clean-all : elimina todas las claves existentes en el directorio /keys.
  • ./build-ca : genera las claves de la Autoridad Certificadora que será la encargada de expedir nuestros certificados.

thf_vpn_operaciones_1

Durante este proceso se solicitará cierta información que identificará a la CA. En este ejemplo hemos puesto los siguientes datos ficticios:

thf_vpn_operaciones_2

CREANDO LOS CERTIFICADOS DEL SERVIDOR

Una vez generada la CA, procederemos a generar las claves de nuestro servidor VPN al que hemos denominado HackVPNServer . Ejecutaremos el siguiente comando ./build-key-server <nombre_de_servidor> :

thf_vpn_generar_key_server_3

Al igual que el anterior proceso de generación de las claves de la CA, se solicitará cierta información que rellenaremos como el ejemplo anterior. Después se solicitarán dos campos que dejaremos en blanco (“A challenge password” y “An optional company name”) y finalmente se mostrará un resumen de los datos introducidos, preguntando y confirmando si queremos firmar el certificado, a lo que responderemos y :

thf_vpn_generar_key_server_info_4

CREANDO LOS CERTIFICADOS DE LOS CLIENTES

Ya tenemos creadas las claves de la CA y del servidor VPN. Procederemos ahora a crear los certificados y las claves de los clientes que se van a conectar al servidor. En este caso, vamos a crear certificados para  nuestro dispositivo android. Para ello ejecutaremos el comando ./build-key-pass <nombre_cliente> en el que nosotros hemos denominado al cliente (que es nuestro móvil) HackingVPNHuawei :

thf_vpn_generar_key_cliente_5

Durante el proceso de generación de los certificados de cliente se solicitará la contraseña del mismo, que es la que necesitaremos para poder conectarnos al servidor VPN. Se recomienda introducir una contraseña robusta de mínimo 8 caracteres con minúsculas, mayúsculas, números y símbolos:

thf_vpn_generar_key_cliente_password_6

Con el certificado de cliente y su correspondiente clave creada, vamos a añadir una protección extra al cifrado utilizado para prevenir técnicas de fuerza bruta. Para ello, ejecutaremos el siguiente comando openssl rsa -in <nombre_cliente>.key -des3 -out <nombre_cliente>.3des.key :

thf_vpn_evitar_brute_force_7

Al igual que hemos estado viendo durante estos procesos, se solicitará la contraseña del fichero (que hemos puesto anteriormente) y otra adicional (nosotros hemos insertado la misma):

thf_vpn_evitar_brute_force2_7

INTERCAMBIO DE CLAVES: DIFFIE-HELLMAN

El protocolo Diffie-Hellman para el intercambio de claves permite acordar, entre dos máquinas y a través de un canal no seguro, una clave simétrica con la que firmar posteriormente la comunicación entre ambas. Para generar los parámetros del intercambio de claves, ejecutaremos el comando siguiente ./build-dh :

Este proceso se demorará  un tiempo debido a la longitud de clave. Para continuar, protegeremos nuestro servidor VPN de posibles ataques de denegación de servicio DoS creando un código de mensaje de autenticación pregenerado (ta.key) que el servidor detectará y permitirá la conexión. Esta clave se denomina HMAC y se genera con el siguiente comando openvpn –genkey –secret ta.key :

CONFIGURANDO EL SERVIDOR VPN

Ya tenemos creado la CA, el servidor VPN, los parámetros Diffie-Hellman, los clientes, etc… Pero nos falta toda la configuración del servidor: dirección ip en la que estará a la escucha, puerto, protocolo, etc… Para especificar todos estos parámetros, crearemos el fichero server.conf en la ruta /etc/openvpn/ cuyo contenido inicial de este fichero es el siguiente:

Como alguno se ha quejado de que no puede copiar el contenido del fichero, aquí disponéis de dos versiones del fichero:

Una vez copiado el contenido, necesitaremos sustituir la dirección ip u otro datos en aquellas líneas que lo soliciten. Si por algún casual, es posible acceder al disco duro de red pero no a internet puede que tengáis que cambiar en el fichero anterior la línea de la resolución DNS y poner como dirección 8.8.8.8 :

CREACIÓN DEL FICHERO .OVPN

Para poder conectarnos con a nuestro servidor VPN utilzaremos el software de OpenVPN que requiere un fichero con extensión .ovpn . Este fichero lo vamos a generar a partir del fichero .key del cliente. Necesitaremos un script para tal cometido, que podemos encontrar en la siguiente página:

Script MakeOVPN – https://gist.github.com/laurenorsini/10013430

Copiamos ese script dentro de la carpeta de los certificados /etc/openvpn/easy-rsa/keys. Antes de ejecutarlo es necesario también crear un fichero llamado Default.txt en la ruta /etc/openvpn/easy-rsa/keys que contendrá los parámetros necesarios para generar los certificados en formato .ovpn. El contenido del fichero será el siguiente:

Comose observa, hemos marcado la opción del protocolo que vamos a utilizar y la opción de la dirección IP remota y puerto para establecer la conexión. Con este fichero creado, ejecutamos el siguiente comando ./MakeOVPN.sh en el que introduciremos el nombre del cliente en cuestión:

thf_vpn_makeovpn_12

Para poder copiar dicho fichero a nuestro dispositivo, necesitamos establecer permisos menos restrictivos, tanto a las carpetas jerárquicas como al fichero .ovpn . Ejecutaremos los siguientes comandos:

Ahora sólo tendremos que copiar el fichero .ovpn en el dispositivo correspondiente, en este caso, nuestro móvil Android. Terminada la copia restauraremos los permisos de las carpetas, repitiendo los mismos pasos pero con permiso más restrictivo:

INSTALACIÓN DE CLIENTE NO-IP

La conexión con nuestro servidor VPN requiere una dirección ip y un puerto de conexión. Como nuestra dirección ip no es estática y puede cambiar, utilizaremos un cliente con el que asociar nuestra dirección ip pública con un nombre de host con el fin de no tener que estar acordándonos cada vez que queramos conectar. En este caso utilizaremos el cliente de no-ip.com. Simplemente rellenamos el formulario de registro:

Ahora en nuestra raspberry vamos a crear un directorio, por ejemplo ~/no-ip, en el que descargar el código del cliente y compilarlo

Accedemos al directorio y compilamos con sudo make && sudo make install .

CONFIGURACIÓN DE LA RASPBERRY

El supuesto escenario sobre el que vamos a configurar nuestra Raspberry Pi es el siguiente: vamos a conectar nuestra Raspberry Pi al router de forma inalámbrica, a través de la interfaz wlan0. Para ello, asignaremos a la Raspberry Pi una dirección ip estática (en este caso la 192.168.0.18) y crearemos un fichero wpa_supplicant.conf para automatizar la conexión al router.

El fichero wpa_supplicant.conf lo generaremos con el siguiente comando wpa_supplicant -B -D <driver> -i <interfaz> -c <ruta al fichero .conf> (Ver artículo “Conexión wifi desde un terminal Linux”):

thf_vpn_wpa_supplicant_15

Para la asignación de la dirección ip estática editamos el fichero /etc/network/interfaces y añadimos los siguientes datos:

  • Conexión automática a nuestro punto de acceso (primera caja roja).
  • Reglas de firewall (segunda caja roja).
  • Dirección ip estática y configuración de nuestra red por defecto (tercera caja roja).

La última fila del fichero anterior ejecuta un script para establecer las reglas del firewall y poder acceder a nuestro disco duro de red. Crearemos el fichero firewall-openvpn-rules.sh cuyo contenido será el siguiente:

La reglas añadidas realizan las siguientes acciones:

  • Limpieza de las reglas que hubiera establecidas anteriormente (primer cuadro).
  • Establecer una política permisiva por defecto (segundo cuadro).
  • Permitir la redirección de paquetes desde la interfaz tun0 a la interfaz wlan0 que es la que tendrá acceso al resto de la red (tercer cuadro).
  • Enrutar a través de la interfaz wlan0 todos los paquetes que tengan como ip origen 10.8.0.0/24 y como ip destino 192.168.0.14, que es el disco duro de red al que queremos acceder (tercer cuadro).

Para hacer que nuesra raspberry actúe como un router y se permita el reenvío de paquetes, necesitamos establecer la siguiente variable ubicada en el fichero /proc/sys/net/ipv4/ip_forward con valor 1 :

INSTALACIÓN DEL CLIENTE EN EL MOVIL

Como último punto del artículo, instalaremos la aplicación OpenVPN en nuestro dispositivo:

Una vez instalado, abrimos la aplicación y pulsamos la opción Import  del menú desplegable a través de los tres puntos situados en la parte superior derecha:

Seleccionamos Import Profile from SD Card y buscaremos el fichero .ovpn en el directorio en el que lo hayamos guardado:

Sólo nos faltaría introducir la contraseña del certificado y que todo funcione correctamente:

 

En esta última imagen se puede apreciar que el servidor OpenVPN nos ha asignado la dirección ip interna 10.8.0.10. Como hemos enrutado a través de iptables todos los paquetes cuya dirección ip pertenezca al rango 10.8.0.0/24 hacia la dirección ip 192.168.0.18, ya podemos acceder a nuestro disco duro de red y copiar el documento que necesitamos.

Espero que os haya gustado.

“Don’t give up. Great things take time.”

Deja un comentario

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