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/ :
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.
Durante este proceso se solicitará cierta información que identificará a la CA. En este ejemplo hemos puesto los siguientes datos ficticios:
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> :
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 :
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 :
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:
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 :
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):
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:
- Versión larga con explicaciones: https://github.com/OpenVPN/openvpn/blob/master/sample/sample-config-files/server.conf
- Versión corta como la que se muestra arriba: https://gist.github.com/laurenorsini/9925434
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:
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”):
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.”