Cómo exponer nuestro servidor Raspberry Pi 4 a Internet?
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:
- 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.
- 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.
- 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.
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.