Cómo exponer nuestro servidor Raspberry Pi 4 a Internet?

Cómo exponer nuestro servidor Raspberry Pi 4 a Internet?
Photo by Stephen Phillips - Hostreviews.co.uk / Unsplash

Considero que una de las formas en la que más podemos aprovechar un servidor casero es poder exponerlo a Internet, por lo tanto en este capitulo de convirtiendo una Raspberry pi 4 en un poderoso servidor local, veremos como hacer que nuestro servidor esté Online usando nuestro servicio de Internet.

Por lo tanto en este punto voy a suponer que has seguido los artículos anteriores donde hemos ido configurando nuestro servidor Raspberry  y que cuentas con un proveedor de Internet en tu casa u oficina.

Solicitando configuración en el módem de nuestro proveedor de Internet

Para este paso debemos entender algunos conceptos básicos a la hora de querer exponer nuestro servidor:

  1. Firewall: Solución de Hardware o Software que actúa como barrera de seguridad entre nuestra red e Internet bloqueando el acceso desde la red pública hacia nuestra red privada.
  2. DMZ - Zona Desmilitarizada: Por lo general cuando contratamos un servicio de Internet el dispositivo que suele estar de cara a Internet es el módem de nuestro proveedor y este a su vez incluye un Firewall que bloquea todo el acceso hacia nuestra red local, cuando habilitamos la DMZ lo que hacemos es especificar un dispositivo dentro de nuestra red local que ahora va a estar de cara a internet y sin intervención del Firewall, por lo tanto cualquier servicio o puerto que habilitemos en dicho dispositivo será accesible desde Internet, mientras que el resto de nuestros dispositivos en la red privada siguen protegidos por el Firewall.
  3. Port Forwarding: A diferencia de la DMZ el Port Forwarding (Reenvío de puerto) permite que sin necesidad de exponer todo un dispositivo, podamos exponer uno o más puertos en nuestro módem y redirigir el tráfico a uno o más dispositivos en nuestra red privada.
Port Forwarding Vs DMZ

Con estos conceptos claros ahora debes comunicarte con el servicio de soporte de tu proveedor de Internet y solicitar ya sea la activación de la DMZ con la IP / dirección MAC de tu Raspberry Pi 4 ó Port Forwarding a un puerto especifico en la IP de tu Raspberry.

Usar tu dominio con un servicio de IP dinamica

Por lo general los servicios de Internet domestico u oficina nos dan una IP pública dinámica que cambia cada vez que el módem se reinicia, por ende cuando queremos configurar un dominio suele complicarse un poco ya que el dominio debe ir ligado a nuestra IP pública para resolver de forma correcta. Existen varias alternativas de proveedores de dominios con servicio de DDNS (Dynamic DNS) y existe una herramienta que podemos usar para mantener nuestro registro DDNS actualizado cada cierto tiempo y así garantizar que si nuestra IP cambia, la misma sera actualizada en nuestro proveedor de dominio.

DDCLIENT es una herramienta de código abierto que podemos instalar en nuestros servidores Linux. Para éste articulo ya que tenemos configurado Docker, lo vamos a usar de forma contenerizada.

En mi caso yo tengo mi dominio con namecheap.com sin embargo la herramienta soporta muchos proveedores y protocolos que pueden validar según sea su caso en su página web. A continuación les comparto un ejemplo de la configuración y el docker-compose.yml:

Usando Nginx como Proxy Reverso

Nginx es un poderoso y eficiente servidor web, que hoy usaremos como un Reverse Proxy, lo cual nos permite tener habilitado el acceso HTTP/HTTPS centralizado y redirigir el tráfico a nuestras aplicaciones corriendo sobre Docker. Si has seguido la serie hasta aquí seguramente recordaras que en nuestro post pasado vimos Instalando una nube privada con Nextcloud y Docker en el cual dejamos Nextcloud funcionando sobre el puerto 8080, siguiendo ese ejercicio lo que haremos ahora es instalar Nginx y configurar un proxy reverso para que el tráfico llegue por el puerto 80 a Nginx y este redirija el tráfico a Nextcloud.

Instalar Nginx

sudo pacman -S nginx

Revisar directorio de configuración

ls -lh /etc/nginx/

Crearemos un nuevo directorio llamado conf.d

sudo mkdir /etc/nginx/conf.d/

Modificaremos el archivo nginx.con

sudo vim /etc/nginx/nginx.conf
y lo dejaremos de la siguiente forma:

user http;
worker_processes auto;
worker_cpu_affinity auto;

events {
    multi_accept on;
    worker_connections 1024;
}

http {
    charset utf-8;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
    log_not_found off;
    types_hash_max_size 4096;
    client_max_body_size 16M;

    # MIME
    include mime.types;
    default_type application/octet-stream;

    # logging
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;

    # load configs
    include /etc/nginx/conf.d/*.conf;
}

Con esto tendremos una configuración base que tomará las configuraciones particulares desde el directorio conf.d.

Agregar configuración default.conf

Dentro del directorio conf.d vamos a crear el archivo default.conf a continuación dejo un ejemplo básico, pero puedes consultar en profundidad en la página de Nginx:

sudo vim /etc/nginx/conf.d/default.conf

server {
    listen       80;
    server_name  midominio.com;
    
    location / {
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_fora
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $http_host;
       proxy_pass http://127.0.0.1:8080;
    }
}

Ahora solo deberiamos validar que nuestra configuración esté bien y reiniciar Nginx:
sudo nginx -t
y deberiamos ver algo como:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Si llegamos a tener un error con el comando previo debemos revisar que no haya ningún error de sintaxis en nuestros archivos nginx.conf o default.conf.

Si todo ha salido bien solo nos restaría reiniciar:
sudo systemctl restart nginx

Y ahora deberiamos poder acceder con nuestra IP o dominio mediante el puerto 80 y ver Nextcloud o el servicio que hayamos configurado por el puerto 8080.

Así llegamos al final de este post, espero que hayas aprendido algo interesante. Nos veremos en el próximo capitulo.