Introducción
Si conoces o te estás adentrando en el mundo del self hosting (Es decir, tener tus propios servidores en casa), seguramente te hayas preguntado: ¿Cómo puedo acceder a mis aplicaciones locales cuando estoy fuera de casa? De hecho, aunque esto del self hosting te suene a chino, puede que te hayas encontrado en la situación de tener un PC de sobremesa en tu casa, irte fuera de ella y querer acceder a datos de ese PC desde tu propio portátil. Bueno, pues hoy os traigo una manera muy sencilla, gratuita y sobre todo segura, ya que no queremos que ninguna persona que no seamos nosotros se meta en nuestra red.
Y te adelanto una cosa, no es ningún programa de control remoto como TeamViewer o Escritorio remoto de Chrome, es algo mucho más sofisticado: es mediante WireGuard.
¿Por qué no exponer los puertos?
Antes de explicar cómo hacerlo, quiero que primero entendáis bien de qué se trata.
Cada vez más a menudo, las personas que nos gusta el mundo de la tecnología y la programación optamos por alojar servicios en nuestra propia red de casa. Ya no es extraño escuchar que alguien tiene montado su propio NAS (Almacenamiento Conectado en Red) para almacenar sus fotos, videos o películas en la red doméstica, con la intención de dejar de depender de la nube de Google u otros proveedores. Al hacerlo por ti mismo, aunque la inversión inicial sea más cara, a la larga sale mucho más barato y, sobre todo, tienes amplias opciones.
El NAS es solo un ejemplo. En la red de tu hogar puedes configurar infinidad de servicios, por ejemplo, un Home Assistant para controlar todos tus dispositivos de IoT (Internet of Things).
Exponer un puerto es muy peligroso
El “problema” es que estos servicios solo están disponibles cuando estás conectado al wifi de tu casa. Esto podría solucionarse exponiendo el puerto del servicio en concreto, pero exponer un puerto de un servicio de tu red local a internet es extremadamente peligroso debido a la rapidez con la que los atacantes detectan y explotan vulnerabilidades. Un puerto expuesto a internet puede comenzar a recibir intentos de ataque en menos de 5 minutos. Los escaneos automáticos y ataques dirigidos a servicios abiertos son constantes y agresivos.
En un experimento típico con honeypots (servicios diseñados para ser atacados), se observaron más de 13 ataques por segundo, lo que se traduce en decenas de miles de intentos de intrusión cada hora. Estos ataques intentan explotar vulnerabilidades conocidas o utilizar credenciales por defecto como “admin” o “root” en servicios como SSH, Redis o bases de datos.
Mi experiencia personal
Yo no tengo un NAS montado en mi casa, de momento no, pero me surgió la necesidad de conectarme a la red de mi casa por mi PC de sobremesa. Siempre que me iba de viaje quería acceder a algo que tenía en ese PC. Aunque existan nubes de datos para almacenar cosas o GitHub para el tema del código, siempre se me quedaba algo que quería utilizar y nunca podía. Entonces se me ocurrió la idea de abrir un puerto y permitir la conexión con escritorio remoto de Windows desde el exterior. Y bueno, funcionaba, aunque tuve que permitir varias cosas en el firewall, lo que me hizo darme cuenta de que era un error gravísimo exponer una conexión remota a un PC desde tu IP pública.
La solución: WireGuard
Entonces encontré la solución que debí haber tomado desde el principio: una VPN.
Y seguramente todos hayáis escuchado hablar de VPNs comerciales, como las que anuncian los youtubers, que te permiten cambiar tu IP para situarte virtualmente en otro país y así saltarte restricciones regionales. Pero en nuestro caso vamos a usar la VPN para algo distinto. Una VPN es básicamente un puente virtual entre tu dispositivo y otra red, en este caso, la de nuestra casa.
Esta práctica es muy habitual en entornos laborales, donde las empresas tienen sus propios servicios ubicados en una zona, y los empleados, cuando trabajan desde casa, deben usar una VPN para poder utilizar todos esos servicios. Así se aseguran de que todo está en una red interna protegida y solo puede acceder alguien con sus credenciales.
¿Cómo crear tu propia VPN?
Crear tu propia VPN es más sencillo de lo que parece. Solo necesitas un dispositivo Linux donde ejecutarlo, en mi caso voy a usar una Raspberry Pi 3B. Si no tienes una Raspberry, podrías configurarlo en un ordenador, aunque es una pésima idea porque tendría que estar siempre conectado. Te recomiendo usar un servidor VPS, como uno de DigitalOcean o la capa gratuita de Oracle Cloud, que es más que suficiente para lo que necesitamos.
Configurando WireGuard con Docker Compose
El funcionamiento es bastante simple. Una de las alternativas favoritas por la comunidad es WireGuard, ya que con un simple Docker Compose vamos a poder crearla en cuestión de minutos. WireGuard ofrece más velocidad y simplicidad que otras VPNs, y es compatible con Linux, Windows, macOS, iOS y Android.
Aquí tienes el Docker Compose que debes usar:
version: '3.3'
services:
wireguard:
image: linuxserver/wireguard:arm32v7-v1.0.20210914-ls113
container_name: wireguard
privileged: true
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid
- SERVERURL= #optional
- SERVERPORT=51820 #optional
- PEERS=5 #optional
- PEERDNS=auto #optional
- INTERNAL_SUBNET=10.13.13.0 #optional
volumes:
- /home/edu/wireguard:/config
- /lib/modules:/lib/modules
- /usr/src:/usr/src
ports:
- 51820:51820/udp
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
networks:
containers:
ipv4_address: 172.20.0.6
networks:
containers:
ipam:
config:
- subnet: 172.20.0.0/24
Estoy usando una versión de 2021 para WireGuard porque no encontré otra más reciente para arquitectura arm32. Si tienes una Raspberry más reciente o usas un servidor, puedes utilizar una versión más nueva que encontrarás en Docker Hub.
Poniendo en marcha el servicio
Con esto listo, podemos hacer un docker-compose up -d. (Instala Docker Compose si no lo tienes).
Después, abrimos el puerto en nuestro router y nos conectamos. Según los peers que hayamos configurado, se generarán archivos que podremos ver en forma de QR con el siguiente comando:
docker exec -it wireguard /app/show-peer 1
Esto nos mostrará un QR que podremos escanear con el móvil para conectar automáticamente. Si vas a conectarte desde un PC, podeis utilizar este otro comando para mostrar la configuración que debeis copia y pegar en el cliente que va a conectarse:
docker exec -it wireguard cat /config/peer1/peer1.conf
Conclusión Con esto, ya tendríamos una conexión VPN a nuestra casa de forma segura. Espero que os ahorre los mismos dolores de cabeza que me ha ahorrado a mí y os sea de utilidad.