PiVPN: Configura una VPN casera en una Raspberry Pi utilizando OpenVPN


NOTA: PONGO EN NEGRITA LAS MODIFICACIONES QUE HE REALIZADO PARA QUE ME FUNCIONE CORRECTAMENTE - J.C
Esta nueva entrada del blog es relativa al grupo de publicaciones que pretenden demostrar que una Raspberry Pi se puede utilizar como una herramienta de seguridad. En ella vamos a crear un servidor VPN en nuestra Raspberry Pi, pero antes de nada vamos a explicar que es una VPN.
Una VPN (Virtual Private Network) es una tecnología de red que permite extender de forma segura una red LAN sobre una red pública (Internet), es decir, podemos conectarnos a la red local LAN de nuestra casa desde el exterior y a través de Internet, de la misma forma que si estuviésemos dentro de nuestra casa. Como se muestra en la siguiente imagen, gracias a esta tecnología se crea un tunel seguro entre el cliente VPN (Smartphone, Ordenador, etc.) y el servidor VPN para que toda la comunicación que existe sea segura.
Tanto el cliente VPN como el servidor VPN podrían ser routers con el objetivo de interconectar 2 redes de comunicaciones, pero en el caso que nos ocupa nos vamos a centrar en el esquema anterior.
Las principales ventajas que ofrece esta tecnología son las siguientes:
  • Permite interconectar redes geográficamente separadas sin necesidad de una línea dedicada.
  • Permite acceder a los recursos de la red de destino: impresoras, discos en red, carpetas compartidas, intranets, etc.
  • Asegura que la información intercambiada entre ambas redes es confidencial.
  • Permite la navegación segura a través de Internet aunque la red origen sea insegura, ya que todo el tráfico estará cifrado.
  • Permiten anonimizar direcciones origen, ya que va todo encaminado por la VPN y el origen de nuestras peticiones a diferentes servidores de Internet sería la red a la que nos conectamos donde está el servidor VPN.
Todas las ventajas son importantes, pero en este caso concreto nos vamos a centrar en la parte de navegación segura a través de Internet. Esto es muy importante, ya que a lo largo de la ciudad existen:
  • Redes abiertas.
  • Redes con un cifrado inseguro como WEP.
  • Redes vulnerables al tener configurado WPS.
  • Redes con un punto de acceso falso (fake AP).
Si navegáramos por estas redes sin una VPN toda la información podría ser obtenida por un atacante y descubrir cuáles son nuestras contraseñas, por qué paginas navegamos, cuáles son nuestros gustos de navegación o qué aplicaciones móviles utilizamos.
Por otra parte, los protocolos que se pueden utilizar para montar una VPN son:
  • PPTP (Point to Point Tunneling Protocol): Es un protocolo de capa 2 para crear conexiones VPN. Fué desarrollado en 1999 por un grupo de empresas entre las que se encontraba Microsoft. Este protocolo encapsula y encripta tráfico PPP. Actualmente no se recomienda su utilización, ya que han sido encontradas algunas vulnerabilidades relacionadas con la implementación de los algoritmos criptográficos utilizados y con la longitud máxima del tamaño de clave (128 bits).
  • IPSec/L2TP (Layer 2 Tunneling Protocol): Por un lado, L2TP se encarga de establecer un tunel entre el origen y el destino encapsulando una trama L2TP dentro de un datagrama UDP y que posteriormente irá encapsulado en un paquete IP. L2TP no proporciona por sí mismo ningún mecanismo de seguridad y utiliza IPSec para ello. Por otro lado, IPSec es un conjunto de protocolos utilizados para asegurar las comunicaciones en el nivel IP de la pila de protocolos TCP/IP.
  • SSTP (Secure Software Tunneling Protocol): Este protocolo encapsula tráfico PPP sobre una conexión SSL (actualmente SSL v3), por tanto, tiene la ventaja de poder atravesar firewalls con mayor facilidad. Fue introducido por Microsoft con la aparición del Windows Vista, pero actualmente tiene soporte para distintos sistemas operativos.
  • IKEv2: Es un tunel VPN basado en IPSec, el cual fue desarrollado por Microsoft y Cisco. No es tan extendido como IPSec/L2TP, pero es considerado tan bueno o incluso superior que IPSec/L2TP en términos de seguridad, rendimiento y estabilidad.
  • OpenVPN: Es una solución de software libre con licencia GNU (creada por Jame Yonan) que es capaz de crear VPNs, utilizando SSL/TLS para el intercambio de claves. Además, es capaz de atravesar NATs y firewalls. La librería criptográfica que utiliza este software es OpenSSL. Permite seleccionar entre 2 opciones de funcionamiento: TAP que es una VPN de capa 2 (la cual, encapsula tramas Ethernet 802.3), y TUN que es una VPN de capa 3 (que encapsula paquetes IP). Esta es la opción que se va a utilizar para configurar una VPN casera en una raspberry pi.
Para configurar nuestro servidor VPN vamos a utilizar un proyecto llamado PiVPN, el cual permite configurar OpenVPN de manera sencilla en una raspberry.
A continuación se muestran los pasos que hemos dado para montar OpenVPN en nuestra raspberry, utilizando el proyecto PiVPN:
  1. El primer paso para crear este proyecto será cargar el sistema operativo raspbian en una tarjeta micro SD (en este caso de 16GB), para ello es posible utilizar la siguiente publicación de éste mismo blog:
    Además, el sistema operativo raspbian se puede descargar de la página oficial de raspberry (la versión LITE será suficiente):
  2. A continuación, se deberá insertar la tarjeta micro SD en la raspberry, y asegurarnos que tenemos un cable de red conectado hacia el router y que por tanto, la raspberry tiene Internet. Además, será necesario conectar un cable HDMI a un monitor y el cable de alimentación de la raspberry.
  3. Tras iniciar la Raspberry Pi 3 será necesario realizar el login en el sistema con las contraseñas por defecto de raspbian:
    • usuario: pi
    • contraseña: raspberry
  4. En este punto, ya estaremos logados dentro del sistema operativo raspbian. Es importante tener en cuenta que el idioma del teclado es inglés, por tanto, en este punto tenemos 2 opciones: cambiar el teclado a español con el comando sudo dpkg-reconfigure keyboard-configuration y reiniciar para que se apliquen los cambios, o habilitar el acceso por SSH mediante el comando /etc/init.d/ssh start.
  5. Seguidamente, será necesario actualizar nuestro sistema operativo utilizando los siguientes comandos, de igual forma que se especifica en la página oficial de raspberry:
    • apt-get update
    • apt-get dist-upgrade
  6. Se deberá cambiar el password con el comando passwd, porque, como todos sabéis, es un gran agujero de seguridad dejar el password por defecto del sistema operativo instalado.
  7. Seguidamente, utilizaremos el siguiente comando para comenzar la instalación:
    • curl -L https://install.pivpn.io | bash 
    • NOTA: si da error ejecutar como root: 
    • curl -L https://install.pivpn.io | sed '2s/.*/set -x/' > install.sh; chmod a+x install.sh; ./install.sh
    • Para usar wireguard en vez de vpn, al elegir esta opcion y al finalizar despues del reboot del s.0 entrar: 
    •  cd /opt/pivpn/wireguard
    •   makeCONF.sh
    • leer el codigo QR desde la app android wireguard con el comando qrcodeCONF.sh
  8. Primero, el programa comprueba que el sistema operativo esté actualizado, pero como en nuestro caso estará actualizado, seguirá la instalación:
  9. En este punto nos informa que la aplicación transformará nuestra raspberry en un servidor OpenVPN:
  10. Además, nos indica que nuestra IP debe ser estática, lo cual es normal para que la dirección del servidor OpenVPN sea siempre la misma:
  11. En este momento, nos pide seleccionar una interfaz de red que será la que proporcione Internet:
  12. Y se asigna la IP que tiene la interfaz de red anterior como IP estática:
  13. Entonces, la instalación advierte que es posible que el router asigne esta IP a otro dispositivo y haya conflicto. En el caso de que haya problemas, puedes realizar la asignación de IPs manualmente:
  14. En este momento la instalación indica que será necesario seleccionar un usuario local. Por temas de seguridad, lo más recomendable es crear un usuario nuevo distinto del administrador.
  15. En nuestro caso, para realizar la prueba de concepto (PoC) utilizaremos el usuario que viene por defecto, aunque previamente hemos cambiado la contraseña del mismo:
  16. En este punto, nos informa de que sería recomendable habilitar las actualizaciones no-atendidas manualmente, ya que el servidor estará expuesto a Internet:
  17. Como es lógica la recomendación que nos da la instalación, habilitamos las actualizaciones no-atendidas:
  18. Ahora nos indica si el protocolo que queremos utilizar es TCP o UDP. Cada protocolo tiene sus ventajas y sus desventajas. En nuestro caso, hemos utilizado TCP porque asegura la entrega de paquetes y puede llegar a ser más recomendable para navegar por Internet que es lo que pretendemos. Si el objetivo fuese mejorar la velocidad, intercambiado vídeo, audio o ficheros pesados, lo más recomendable sería UDP:
  19. Seguidamente, tenemos que seleccionar un puerto donde se pondrá a la escucha el servidor OpenVPN. El puerto por defecto es el 443, pero como queremos que esté algo oculto y no sea un puerto conocido, seleccionaremos otro puerto (en nuestro caso 44344):
  20. Nos pide que confirmemos el puerto seleccionado para que no haya ningún error:
  21. En este punto, la instalación nos solicita seleccionar un tamaño de clave y seleccionamos 2048-bits:, en la nueva version de este script es necesario decir que NO a esta ventana para que tenga la mayor compativilidad de generacion de certificados
  22. Seguidamente, la instalación nos indica que va a generar las claves necesarias:
  23. Y a continuación inicia la creación de las claves, el cual, es un proceso que tarda un rato:
  24. Cuando acaba de realizar la generación de claves, el programa pregunta la forma de acceder al servidor de VPN. En nuestro caso para la Prueba de Concepto (PoC), seleccionaremos la IP pública que nos proporciona nuestro proveedor de Internet (ISP), aunque la forma más correcta de hacerlo es utilizar un servicio como No-IP para que aunque cambie la IP nuestro proveedor de Internet (ISP), no se vea afectado el acceso:
    Cuando acaba de realizar la generación de claves, el programa pregunta la forma de acceder al servidor de VPN. En nuestro caso para la Prueba de Concepto (PoC), seleccionaremos la IP pública que nos proporciona nuestro proveedor de Internet (ISP), aunque la forma más correcta de hacerlo es utilizar un servicio como No-IP para que aunque cambie la IP nuestro proveedor de Internet (ISP), no se vea afectado el acceso:
  25. Seguidamente, seleccionamos el servidor DNS que utilizaremos para conectarnos a Internet. En este caso para la Prueba de Concepto (PoC) hemos seleccionado Google:
    Para la gente que esté interesada en seleccionar un DNS propio os remito a otra de las publicaciones de este blog donde enseñamos a montar Pi-Hole en una raspberry:
    En la siguiente imagen se muestra cómo seleccionar un DNS propio.

    Además, será necesario modificar el fichero /etc/dnsmasq.conf y añadir la siguiente línea para permitir la resolución DNS a la interfaz VPN:
    listen-address=127.0.0.1, 192.168.1.2, 10.8.0.1
    La primera IP es localhost, la segunda IP corresponde a la IP local donde está instalada la Pi-Hole (que puede ser la misma donde está instalado este mismo proyecto), y la tercera IP corresponde a la IP de la interfaz VPN en la parte del servidor.
    De esta forma, conseguimos el filtrado de publicidad y páginas fraudulentas a la hora de navegar, lo cual, en este proyecto concreto que estamos montando puede ser muy recomendable.
  26. A continuación muestra la forma de crear usuarios, cómo se accede a la ayuda y dónde se almacenan los logsgenerados :   pivpn add
  27. El último mensaje de instalación pide reiniciar el sistema operativo:

  28. A continuación, será necesario crear, al menos, un cliente para que se conecte al servidor. En la siguiente imagen se muestra un ejemplo de creación de un cliente con el nombre client:
  29. Tras insertar el comando anterior en un terminal, pedirá el nombre del usuario y la contraseña para completar la creación del usuario. Además, paralelamente se creará un fichero con la extensión ovpn (en nuestro caso, client.ovpn), el cual se encuentra en la carpeta /home/pi que es el usuario del sistema seleccionado previamente. Éste es el fichero que deberemos cargar en el cliente OpenVPN para conectarnos a nuestro servidor. Si no lo queremos con password (mejor para el iphone pero menos seguro) ejecutar el comando pivpn add nopass
  30. Además, en el NAT de nuestro router casero deberemos añadir una regla para que todo el tráfico que nos llegue al puerto 44344 nos lo dirija al mismo puerto, pero de la ip interna configurada previamente (192.168.1.2).
  31. Por último, ya podemos probar que el servidor OpenVPN está correctamente configurado, utilizando un cliente OpenVPN.
Conexión de cliente OpenVPN en Windows
  1. En Windows será necesario instalar la aplicación openvpn-install-2.X.0.exe, de la siguiente página Web:
  2. Se importa el fichero de configuración obtenido previamente en el paso 29:
  3. Pulsamos en Connect:
  4. Introducimos la contraseña previamente introducida en el paso 29:
  5. Y ya estaríamos conectados a nuestro servidor VPN, y por tanto a nuestra red doméstica. Si verificamos la IP, podemos ver que es una de las IP de nuestra red doméstica, y que además podemos acceder a todos nuestros periféricos: impresoras, discos duros en red, etc.
  6. Para probar que realmente tenemos otra IP que es capaz de conectarse a nuestra red local, podemos utilizar el comando ipconfig de Windows como vemos en la siguiente imagen:
  7. Por último, para estar seguros que todo el tráfico está saliendo por la VPN y no por la otra interfaz de red, probamos el comando tracert que nos muestra los saltos hasta una dirección IP destino, y como se puede ver el tráfico va por la VPN:

Conexión de cliente OpenVPN en Linux
  1. Si utilizamos un sistema operativo Linux también podemos conectar un cliente OpenVPN a nuestro servidor:
  2. En la siguiente imagen se puede ver que se crea una nueva interfaz de red conectada a nuestra VPN:
  3. Además, se puede eliminar la conexión VPN únicamente cerrando el terminal abierto con la conexión o mediante el comando killall para eliminar el proceso:

Conexión de cliente OpenVPN en Iphone
  1. Por último, también se puede conectar un cliente de OpenVPN desde un terminal iphone al servidor configurado previamente. Primero será necesario descargar e instalar la aplicación OpenVPN desde Apple Store:
  2. Además, será necesario transferir mediante itunes el fichero ovpn generado anteriormente en el paso 29. La forma de incluir el fichero se realizará seleccionando la aplicación como se ve en la imagen inferior y utilizando el botón Añadir archivo…:
  3. Finalmente, pinchamos en el botón conectar dentro de la app OpenVPN instalada en el paso 1 e introducimos la contraseña. De esta forma, ya estaremos conectados al servidor VPN y podremos navegar de forma segura con nuestro terminal iphone, sin preocuparnos de estar conectado a una red wifi insegura.

Comentarios

Entradas populares de este blog

Orange Pi IoT 2G Flashear memoria NAND

Usar datos gratis para proyectos IoT FreedomPop y Orange Pi 2G IoT (también Simyo).

Configurar modem GSM en la Orange Pi 2G IoT (Orange España)