Acceso remoto seguro a mi homelab con Headscale
De WireGuard pelado a una VPN con usuarios y grupos
TLDR:
Cómo he configurado mi VPN, nginx y DDNS para acceder a mis servicios desde fuera de casa de manera cómoda y segura.
Introducción
Cuando tienes un homelab, rápidamente te vienen las ganas de usar tus servicios autoalojados fuera de la red de tu casa, lo que implica que todo pase por internet y eso puede ser peligroso si se hace mal. No solo eso, si quieres que tus amigos tengan acceso a ciertos servicios y que, por seguridad, no puedan llegar a otros, vas a necesitar herramientas que te lo permitan. También es posible que te interese usar dominios si tienes una IP dinámica y quieres que el cambio de IP no te afecte. O que no te guste tener que acordarte del puerto de cada servicio y prefieras escribir algo más sencillo.
Me encontré con todos estos problemas cuando empecé con mi propio homelab y aprendí a resolverlos uno por uno.
Acceso remoto
Cuando quieres acceso remoto a tu servidor, se te plantea el balance entre seguridad y comodidad. Por un lado sería increíblemente cómodo abrir el puerto de cada servicio en el router y conectarte de esa manera, pero por el otro, cualquier persona podría acceder y, al no haber restricciones, explotar cualquier vulnerabilidad aunque haya un panel de autenticación. El riesgo aumenta con la cantidad de servicios disponibles y la superficie de ataque se vuelve mucho más grande.
Con una VPN puedes aislar la comunicación a los servicios únicamente a dispositivos autenticados, haciendo que la superficie de ataque sea de un único punto de entrada.
Hay varias opciones, como WireGuard o OpenVPN. En un principio, como era yo el único usuario, usaba WireGuard, pero requiere más configuración por cada dispositivo añadido tanto en el cliente como en el servidor, así que terminé buscando alternativas. Decidí hacer el cambio cuando tuve que pasar por el infierno de generar 8 pares de claves, pasárselas a mi familia, copiarlas mal y estar un rato averiguando por qué no funcionaba.
También probé OpenVPN, pero en el momento en el que el formato de salto de línea te fastidia la configuración y llevas tres dias buscando en foros por qué no la lee bien, es el momento de pasar página.
Headscale es una alternativa open source y autoalojada al servidor de control de Tailscale, una VPN pensada para empresas y usuarios particulares. El tráfico sigue viajando a través del protocolo WireGuard, pero se encarga de las claves y ofrece herramientas para gestionar usuarios, grupos etc.
En Headscale, la experiencia del cliente es mucho más cómoda: te da una clave y se la pasas al administrador. Además, como administrador, te permite configurar ACLs (listas de control de acceso) para asignar usuarios a grupos y poder aislarlos más fácilmente.
No detallaré mi configuración de Headscale, pero sí que comentaré los siguientes casos en los que una ACL me fue útil:
Cuando juego a Minecraft, me gusta montar un servidor aunque vaya a jugar solo porque me permite gestionar copias de seguridad, puedo dejar el juego corriendo mientras se producen los recursos que necesito, tengo mayor rendimiento en el cliente y puedo invitar a amigos con facilidad. En este caso, un amigo quería que le enseñara lo que había construido. Fue tan fácil como explicarle cómo instalarse la VPN, añadirle un usuario y configurar un grupo de “amigos” en el que solo puedan acceder a la IP y puerto del servidor.
Tengo una instancia de Immich en el servidor donde guardo todas las fotos que hago con el móvil. Es como Google Fotos, pero yo controlo lo que se hace con mi información y no tengo que pagar nada. Mi familia hace muchas fotos y vídeos cuando nos juntamos. Me pareció buena idea crear un álbum compartido donde poner todas las fotos en las que estamos juntos. La idea es la misma que en el caso anterior, pero esta vez creando un grupo “familia” con usuarios que solo pueden acceder a la instancia de Immich.