374 - Tu Raspberry en internet sin abrir puertos (incluso con CGNAT)

PodcastPodcast

374 - Tu Raspberry en internet sin abrir puertos (incluso con CGNAT)

¿Te gustaría poder acceder a tu Raspberry desde internet sin abrir puertos y de forma sencilla?¿Estás detrás de un CGNAT? No hay problema.

1:25
-3:15

La Raspberry es una posibilidad a la hora de ganar tu soberanía digital. Como sabes en la Raspberry actual, puedes levantar todo tipo de servicios imaginables. Y me refiero a imaginables hoy en día, porque esto va creciendo a velocidad de vértigo. Así como servicios puedes tener desde un servicio de fotografías, servicio de compartir archivos, editores, gestores de tareas… Como ves, la lista no tiene fin… porque además cada vez hay mas servicios, y servicios mas potentes. Sin embargo, en cualquier caso, el paso obligatorio con el que te vas a encontrar es el de exponer los servicios en internet. Si quieres utilizar tus servicios en una red local, no tendrás que enfrentarte a esa situación. Pero una de las grandes ventajas que te ofrece precisamente la Raspeberry es la opción de exponerla a internet para poder consumir los servicios desde cualquier sitio, pero… ¿como exponer tu Raspberry en internet? Existen multiples opciones para hacerlo, pero la que hoy te quiero explicar es para exponer tu Raspberry en internet sin abrir puertos incluso estando detrás de un CGNAT.

Tu Raspberry en internet sin abrir puertos (incluso con CGNAT)

Tu Raspberry en internet sin abrir puertos (incluso con CGNAT)

Opciones para exponer la Raspberry en internet

Existen diferentes opciones para exponer la Raspberry a Internet, y todo va a depender por un lado de la conexión que te ofrece tu proveedor de internet, y por otro lado de tus ganas de pelearte con el router,

Hace poco probé un servicio en beta de túnel que tiene Cloudflare, y que nos permite de una forma relativamente sencilla, poner nuestra Raspberry en internet sin necesidad de tocar los puertos en el router.

Mi situación actual

Uno de los problemas con los que me encuentro actualmente a la hora de exponer los servicios de mi Raspberry en Internet es que me encuentro detrás de un CGNAT. Hasta donde se, el proveedor de red que utilizo, da opción de cambiar a una IP pública. Es decir, que no pone problemas para cambiar a una IP pública.

Sin embargo, por un lado, hasta el momento no he tenido tiempo de solicitar la IP pública al proveedor de internet. Pero por otro lado, y casi mas importante, es que hay varios que se han puesto en contacto conmigo para dar una solución a un problema similar al mío del CGNAT, pero sin posibilidad de cambiar por parte del proveedor.

Todo esto, justo con el descubrimiento de este servicio de túnel de Cloudflare, me hizo que probara esta solución y que ahora misma la tenga implementada y funcionando a plena satisfacción.

Sin abrir puertos en tu router

Pero no solo se trata de resolver el problema de CGNAT. También se trata de resolver el problema de los puertos del router. Y es que en alguno de los casos que hemos visto anteriormente, necesitas abrir, al menos, los puertos 80 y 443 para poder exponer tus servicios a internet. Pero no solo estos, dependiendo de que es lo que quieras hacer a lo mejor necesitas abrir mas puertos.

Esto de exponer solo los puertos 80 y 443 es partiendo de que tengas un proxy inverso que dirija el tráfico, a cada uno de los servicios que quieras levantar. En el caso de que no tengas un proxy, estos puertos pueden multiplicarse.

A mi, esto de abrir puertos al exterior, es algo que no me gusta, porque estás abriendo puertas a posibles intrusos. Si abres dos mejor que tres. Por eso solo abrir el 80 y el 443. Pero ¿y si pudieras no abrir ningún puerto?

Además de todo esto, en ocasiones el proveedor no te permite acceder a la configuración de los puertos, o utilizar algunos puertos en concreto. Pero vamos mas allá, a lo mejor no te quieres meter en este lío de los puertos, o simplemente no quieres tocar el router del proveedor, o la razón que sea. Cualquier razón es lícita.

Cloudflare Tunnel

Tal y como explica Cloudflare, la exposición de un servicio o aplicación obliga a protegerla. Se pueden aplicar diferentes métodos mas o menos complejos para proteger tu servicio de ataques. Cloudflare, propone proteger nuestro servicio de ataques directos mediante Cloudflare Tunnel. No importa donde se está ejecutando el servicio o aplicación, en una nube pública, en una nube privada, en un clúster de Kubernetes o cualquier otro que te puedas imaginar.

Requerimientos

Lo primero y antes de que te lances con esto del Cloudflare Tunnel, necesitarás un dominio. No te preocupes, porque esto no representa un coste eleveado, dependiendo de la extensión del dominio, .com, .es, .net, etc… podemos estar hablando de 10 euros al año, o incluo menos… Por lo que he visto, Cloudflare también da posibiilidad de registrar y transferir dominios, pero tampoco te te puedo decir, porque yo no lo he probado.

A continuación tienes que registrarte en Cloudflare…

Por otro lado tienes que instalar la aplicación en tu Raspberry o instalar un contenedor. Indicarte que yo lo he intentado con contenedor y no lo he conseguido. Finalmente lo he instalado en la Raspberry arm 64… De nuevo la de 32 bits tampoco he podido. Mas razones para cambiar de 32 a 64 si puedes. Esto lo tienes que hacer a posteriori, cuando hayas creado el túnel… Pero es importante que tengas en cuenta este detalle.

Pasos a seguir para tener el Cloudflare Tunnel.

Una vez, tengas en servicio tu dominio, instalado el servicio en tu Raspberry y dado de alta en Cloudflare, tienes que anadir tu dominio a Cloudflare. Por supuesto, tienes que apuntar en el proveedor del dominio al as DNS de Cloudflare.

El siguiente paso es acceder a Cloudflare Zero Trust, y darte de alta. Dentro de esta sección, tienes en el menú lateral Access > Tunnels.

Crear un túnel

Resuelto los puntos anteriores, es necesario crear un nuevo túnel, y seguir los pasos. Para ello tienes que elegir el nombre del túnel y el entorno en que lo vas a desplegar. Si bien, para el caso de Debian tienes opción de 64 y32, también para ARM, como te he indicado anteriormente, no conseguí levantar en ARM 32.

Para el caso de ARM es tan sencillo como ejecutar algo lo que te muestro a continuación,

sudo cloudflared service install <TOKEN>

¿Y los servicios?

Pues esta es otra de las grandes ventajas con las que me he encotnrado con Cloudflare… puedes exponer tantos ervicios como quieras y lo haces de forma completamente gráfica a través del propio servicio de Cloudflare.

Se trata de una sencilla tabla donde pones el nombre del servicio, la ruta, y la dirección. Por ejemplo, para que te hagas una idea,

Public hostnamePathService
nginx.tuservidor.es*http://localhost:8080
yt.tuservidor.es*http://localhost:8000

Sencillo ¿verdad?

¿Y con Docker?

En el caso de que estés utilizando Docker, simplemente te tienes que acordar exponer los puertos que necesites, siguiendo el criterio del ejemplo anterior.

Vía línea de comandos

Decirte que es posible hacer todo esto vía línea de comandos, e incluso, existe una imagen Docker que aparentemente simplifica todos estos pasos. Pero de nuevo, yo no lo he conseguido hacer. Así que mi recomendación, a priori, es que lo hagas siguiendo esta recomendación. De cualquier forma, siempre puedes seguir la guía de Cloudflare, donde indican paso a paso, como hacerlo en los diferentes entornos, y con las soluciones comentadas.

¿Y yo que voy a hacer?

Por el momento, y mientras me decido a resolver mi temita con la IP, voy a seguir con esta solución de Cloudflare. Creo que es una muy buena solución sobre todo si tienes unos problemas similares a los que tengo yo. Y aunque no los tengas, también es una solución mas que interesante para tener tu aplicación expuesta a internet, y a la vez asegurada. Incluso, una vez resuelto la IP pública, quizá también siga con esta solución para dar respuesta a los que os encontrais en algo similar.

El inconveniente que le veo es que, por un lado dicen que está en fase Beta, y por otro lado es un servicio que es gratuito por ahora, o al menos eso es lo que he entendido. Así, que no dudo que un futuro pase a ser de pago, y entonces, donde donde dije digo digo Diego… mejor cubrirse las espaldas.

7 comentarios en “Tu Raspberry en internet sin abrir puertos (incluso con CGNAT)

  1. Tremendo hace 1 mes

    También está zerotier

  2. Lorenzo hace 1 mes

    No exactamente. Zerotier no te deja exponer la Raspberry a Internet, es más una VPN

    1. Lorenzo hace 1 mes

      Muchas gracias Asdrúbal, tiene muy buena pinta… Lo probaré en los próximos días. ¿Permite poner tu propio dominio?¿o tiene que ser siempre https://xxxxx.grok.io?
      Gracias y un saludo

      1. Asdrúbal Velásquez Lagrave hace 1 mes

        Si, Lorenzo.
        Puedes usar tu propio dominio, técnicamente entras por tu VPS, el túnel y el Nginx se encargan de enrutar hacia tu Raspberry Pi.

        No requieres abrir puertos

  3. Leonardo Aravena hace 1 mes

    Muchas gracias por este dato, hace tiempo quería montar un servidor pero mi ISP no entrega ip’s públicas. Monté un Ubuntu Server en un computador antiguo y estuve luchando un rato con las configuraciones del tunnel pero pude hacerlo funcionar 😀
    Saludos desde Chile

  4. samquejo hace 1 mes

    Buenas
    La razón por la que no te deja instalarlo en docker es porque no hay build para arm. Una oportunidad perdida solo por no añadirlo.
    En principio solo lo he mirado en hub y quay, y como es un software de seguridad quedaría feo que no fuese cloudflare/cloudflared y si lo hiciera atareao/cloudflared o yovirtualizador/cloudflared

    En fin, aventuras y desventuras.
    Buen post dicho por alguien que no comenta casi nunca

Deja una respuesta

Tu dirección de correo electrónico no será publicada.