Cómo hacer que tu web en una Raspberry Pi sea accesible desde Internet

En el post anterior expliqué cómo instalar WordPress en una Raspberry. Sin embargo, la web solo funcionaba de manera local (solo era accesible desde casa). En este segundo artículo voy a detallar cómo hacer que tu blog pueda visitarse desde el exterior, como una web cualquiera.

Lo primero que necesitarás es un dominio. Puedes comprarlo donde quieras. Yo lo adquirí a través de Namecheap (hay algunos pasos donde utilizaré herramientas que ofrece este proveedor). Y si simplemente quieres hacer pruebas, puedes utilizar un dominio gratuito de Freenom (.tk, .ga, etc.). Por otro lado, quizás te interese este artículo sobre cómo encontrar dominios muy baratos o en promoción.

1- Configurar tu router para que acepte peticiones web entrantes

El primer paso es conseguir que tu Raspberry, concretamente el servidor Apache que funciona en ella, sea capaz de recibir peticiones desde Internet. El muro que hay entre el exterior y el interior de tu casa es tu router. Por defecto, estará configurado para bloquear peticiones de tipo web desde el exterior. Por lo que deberemos cambiar este ajuste. Esto depende de forma muy específica del router que tengas.

Dentro del menú de configuración de mi router, he tenido que habilitar una redirección de puertos. En particular, he creado dos líneas, una para el puerto 80 (HTTP) y otra para el 443 (HTTPS), que deben apuntar a la dirección IP interna de la Raspberry (la que le hayamos asignado según lo explicado en el post anterior).

Es decir, cuando nuestro router reciba una petición en el puerto 80 o el 443 (los puertos que solicita un navegador web), ahora en vez de bloquearla se la entregará a la Raspberry y ella decidirá qué hacer (según tengamos configurado nuestro servidor Apache, o Nginx).

2- Configurar tu dominio

Cuando alguiente teclea un dominio en un navegador, se realiza una consulta para determinar a qué IP debe enviarse la petición. Esta consulta se hace a un servidor de DNS, que no hay que confundir con la empresa con la que registramos el dominio ni con el propio servidor web, aunque a veces coincidan. El dato fundamental que deberemos indicar a la empresa registradora del dominio es dónde está ese DNS que se encargará de informar de la IP asignada a ese dominio. Esto es algo que podríamos contratar de forma separada o incluso crearlo nosotros mismos.

Por suerte, la mayoría de empresas registradoras de dominios ofrecen sin coste añadido un servicio básico de DNS. Esto quiere decir que, si elegimos usar este servicio básico de DNS, desde ahí mismo podremos informar que los accesos web al dominio se canalicen a la IP pública de nuestra casa.

En el caso de Namecheap, optar por BasicDNS nos permitirá configurar de manera básica un DNS a través del panel de "Advanced DNS". Antes de entrar ahí, deberás conocer tu IP pública actual (en Google, busca "what is my ip"). No te preocupes si tienes una IP dinámica, ya que ahora simplemente queremos ver si se realiza bien la conexión y las piezas van encajando. Luego resolveremos el asunto de la IP dinámica.

Conocida tu IP pública, ve al editor de DNS ("Advanced DNS" en el caso de Namecheap) y añade un registro de tipo A con el valor de tu IP pública (será un registro A si tu IP externa es IPv4 -algo como 123.64.67.80-, o AAA si es IPv6 -algo como 2003:db8::ff4...-). Luego, también puedes añadir un registro de tipo CNAME para accesos desde el subdominio "www" (sí, www es un subdominio), con el valor del dominio. Verás en la captura que también tengo un registro TXT, pero ignóralo (es para verificar en ciertos servicios de Google que soy el propietario de la web).

En esta página de Namecheap se explican bastante bien los distintos registros de DNS, por si te quedas con dudas.

Una vez hecho esto, guarda los cambios y prueba a acceder a tu dominio desde un navegador (mejor hazlo con una conexión de datos, desde tu móvil). Si funciona, estupendo, ya puedes pasar al siguiente paso.

Si no funciona y te muestra un mensaje de tu registrador de dominio es porque todavía no se ha actualizado el cambio de DNS (esto puede tardar horas). Si en cambio se muestra un mensaje de Apache o recibes un error de tiempo de respuesta agotado, es probablemente porque la petición se ha enviado correctamente a tu router pero algo está fallando por ahí. Puede ser que tu router esté bloqueando la petición (entra en la página de configuración de tu router y confirma que todo esté bien) o bien que Apache no esté correctamente configurado. Si fuera esto último, revisa el archivo de configuración de Apache específico de tu dominio detallado en el post anterior (por cierto, en esta respuesta de un foro se explican bien los pasos que se realizan en un servidor Apache cuando se intenta acceder a un dominio. Algo interesante es que, por defecto, Apache responderá de igual manera independientemente del dominio con el que llegue la petición, si tuviéramos dos dominiones apuntando a nuestra misma IP. En la configuración de Apache deberíamos especificar qué hacer con cada uno).

3- Qué hacer si tienes una IP dinámica

Si en el paso anterior has podido acceder a tu blog, ¡buena noticia! No te preocupes si salen cosas rotas (imágenes, etc.). Pero si tu operador te asigna una IP dinámica, algo bastante común, es probable que tu blog sea inaccesible al cabo de unas horas o días (si quieres forzar el cambio de IP, apaga y enciende tu router). Si tu IP cambia, deberías identificar tu nueva IP pública y actualizar el dato en el DNS. Esto es un engorro y es inviable, por lo que vamos a automatizar este proceso de actualización de la IP pública.

La manera estándar de sortear el problema de la IP pública dinámica es con un servicio similar a DynDNS. Muchos routers (incluso los que te entregan los operadores) tienen la posibilidad de informar automáticamente de tu nueva IP a distintas empresas similares a DynDNS. La más conocida era DynDNS hasta hace unos años, por ser gratuita y estar presente en la mayoría de routers. Sin embargo, ahora es un servicio de pago con un enfoque más profesional. Mi router también me permite configurar directamente otros servicios de DDNS, pero ninguno me encajó (básicamente, por ser todos de pago).

Si no tuviéramos una Raspberry, lo ideal sería usar un servicio directamente configurable desde el router. Pero con la Raspberry, podemos automatizar la actualización de IP desde la propia Raspberry. Un servicio gratuito configurable desde la Raspberry es DuckDNS. Yo no voy a utilizarlo, y ahora explico por qué. Pero en caso de hacerlo, simplemente deberemos seguir sus instrucciones y, en el DNS de nuestro registrador de dominio, crear un registro CNAME donde nuestro dominio apunte al subdominio de duckdns.org que nos asignen (consultar la FAQ de DuckDNS para más información). Y si simplemente estamos haciendo pruebas, podemos desentendernos del dominio principal y acceder a la web a través del subdominio de DuckDNS.

En todo caso, como he dicho, descubrí que Namecheap, mi registrador de dominio, tiene un servicio de Dynamic DNS.

Para utilizar el servicio de DDNS de Namecheap, deberemos:

1. Activar el servicio de DDNS desde Namecheap, en la pestaña de "Advanced DNS" (recuerda que previamente debías tener activado el servicio de "Namecheap BasicDNS"). Copia en algún sitio la contraseñe que te genere.

2. En la Raspberry, instalaremos DDclient, que será el encargado de informar a Namecheap de los cambios de IP. Para ello, en nuestra Raspberry, por SSH, introduciremos el siguiente comando:

sudo apt-get install ddclient

Nos hará algunas preguntas. La primera respuesta que escogemos es "Other", y a partir de ahí:

dynamic dns server -> dynamicdns.park-your-domain.com
protocol -> enter (lo cambiaremos más adelante)
username -> tudominio.com
password -> elanotadoarriba
network interface -> dynamicdns.park-your-domain.com/getip
qualified domain names -> @

Una vez terminado el proceso de instalación, entramos en el archivo de configuración con:

sudo nano /etc/ddclient.conf

Y añadimos la línea daemon=300 para que la actualización se haga cada 5 minutos (300 segundos)

El archivo de configuración deberá quedar así (cambiar ahora protocol=namecheap).

# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf
ssl=yes
daemon=300
protocol=namecheap
use=web, web=dynamicdns.park-your-domain.com/getip
server=dynamicdns.park-your-domain.com
login=tudominio.com
password=elanotadoarriba
@

Guardamos y salimos del documento. Y reiniciamos el servicio con:

sudo systemctl restart ddclient.service 

Para asegurarnos de que todo funcione correctamente, nos aseguramos de que no haya ningún error al ejecutar el siguiente comando:

sudo ddclient -daemon=0 -debug -verbose -noquiet -force

Por otra parte, para hacer que al ejecutarse ddclient se quede funcionando de fondo (como daemon), hacemos:

sudo nano /etc/default/ddclient

Y nos aseguramos de que se indique run_daemon="true". Salimos del archivo (CTRL+X, Y).

Para iniciar la ejecución de DDclient (y quede funcionando de fondo), introducimos el comando:

sudo service ddclient start

Y vemos que está funcionado correctamente con:

sudo service ddclient status

Vale. Ahora todo lo necesario en nuestra Raspberry para el DDNS ya está hecho. Volvemos a Namecheap para hacer que el registro A del DNS tome la IP dinámica informado desde el ddclient de la Raspberry. Donde teníamos un registro de tipo "A", cambiamos esto por "A + Dynamic DNS Record". Y guardamos.

Vuelve a acceder a tu web (desde un dispositivo móvil con conexión de datos). Si antes funcionó, lo normal es que siga haciéndolo. La prueba de fuego será apagar y encender el router y ver que a los pocos minutos tu web sigue siendo accesible desde tu dominio. Si es así, enhorabuena, DDClient está actualizando correctamente la IP en el servicio de DNS.

4- Instalar Certbot (para HTTPS)

Tu blog está ya al 90%. Nos faltan un par de detalles. Lo primero es que tu web sea segura al acceder por HTTPS. Yo he seguido este artículo de Digital Ocean. Desde nuestra Raspberry, por SSH, introducimos el siguiente comando para instalar Certbot:

sudo apt install certbot python3-certbot-apache

Luego, hay que revisar y confirmar que la configuración de Apache siga un cierto formato. Para ello, haz sudo nano /etc/apache2/sites-available/tudominio.com.conf y ver que es algo así (especialmente la parte de ServerName y ServerAlias):

<VirtualHost *:80>
    <Directory "/var/www/tudominio.com">
       AllowOverride All
    </Directory>

    ServerAdmin tucorreo@gmail.com
    ServerName tudominio.com
    ServerAlias www.tudominio.com
    DocumentRoot /var/www/tudominio.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Una vez hecha esta comprobación (si no coincide, ajusta lo necesario), prueba que todo funciona bien con:

sudo apache2ctl configtest

Lo anterior debe responder con Syntax OK. Ahora carga la nueva configuración con:

sudo systemctl reload apache2

Ahora ya tenemos instalado certbot, pero todavía tenemos que instalar un certificado propiamente. Pero antes, debemos configurar un cortafuegos.

5 - Configurar el cortafuegos

Debemos hacer que el cortafuegos de Ubuntu (ufw) permita conexiones de tipo HTTPS. Para ver qué servicios pueden bloquearse o no, hacemos:

sudo ufw app list

(aquí debe mostrarse OpenSSH)

Luego, para ver cuáles están efectivamente bloqueados o permitidos, hacemos:

sudo ufw status

Debemos hacer que "Apache Full" y "Open SSH" estén "Allow". Y desactivaremos el servicio "Apache" (por ser redundante con "Apache Full"):

sudo ufw allow 'Apache Full'
sudo ufw allow 'OpenSSH'

sudo ufw delete allow 'Apache'
(solo si estaba 'Apache' activado antes)

Comprobamos que "OpenSSH" y "Apache Full" aparezcan como "Allow" con un:

sudo ufw status

Si todo está bien, activamos el cortafuegos:

sudo ufw enable

6- Instalar el certificado SSL

Si ya tenemos instalado Certbot y el cortafuegos configurado para que permita peticiones HTTPS, solo nos queda instalar propiamente el certificado. Para ello:

sudo certbot --apache

Poner nuestro email y aceptar todo lo que nos pregunte.

Los certificados de Let's Encrypt (el que utiliza Certbot) tienen que renovarse manualmente cada 90 días. Sin embargo, el paquete de Certbot que hemos instalado se encargará de renovarlos automáticamente. Para comprobar que este script funciona correctamente, haremos:

sudo systemctl status certbot.timer
(nos dará información del status del script y comprobaremos que la renovación automática esté activada)

sudo certbot renew --dry-run
(ejecuta el proceso de renovación, para ver si surge algún error)

7- Hacer que WordPress funcione correctamente con el nuevo dominio

Ya lo tenemos casi todo. Pero hay un detalle muy importante que no hemos abordado hasta ahora. Si te fijas en cómo WordPress está cargando recursos como imágenes, CSS, etc., verás que construye las URLs usando la IP interna (en realidad, lo hace utilizando el hostname con el que accedimos por primera vez e hicimos la instalación). Esto, visto desde fuera de nuestra red doméstica, no tiene sentido y el blog no funcionará bien. Para ello, debemos corregir la manera de construir las URLs en WordPress.

Es tan simple como editar al archivo wp-config.php (ajusta la ruta según tu caso):

sudo nano /var/www/tudominio.com/wp-config.php 

Y actualiza las siguientes líneas con tu dominio:

define( 'WP_HOME', 'https://tudominio.com' );
define( 'WP_SITEURL', 'https://tudominio.com' );

Guarda con CTRL+X, Y.

Si vas a tu blog, ya deberías ver las URLs correctamente construidas (si hubieras creado contenido, quizás deberás hacer un buscar-reemplazar en tu base de datos. Pero según los pasos que hemos ido siguiendo en esta guía, no haría falta).

8 - ¿Problemas para acceder a tu blog a través de tu dominio desde tu casa?

Es posible que si ahora intentas acceder a tu blog usando tu dominio y a través del WiFI/red interna, tengas un aviso de error que vendrá directamente de tu router (error de interception). Este es un asunto que no he llegado a comprender del todo. Pero la forma de solucionarlo es evitando que tu ordenador haga una petición DNS cuando accedas al dominio de tu blog y esta se canalice directamente a la IP interna de tu Raspberry. Para conseguir eso, deberás añadir la siguiente línea al archivo hosts de tu ordenador (y de cualquiera de casa que vaya a acceder a tu blog).

Si estás en un ordenador Mac o Linux, haz desde Terminal:

sudo nano /etc/hosts

Y añade una línea que sea:

ip.interna.de.tu.raspberry tudominio.com

Sal con CTRL+X y guarda con Y. Prueba a acceder nuevamente a tu blog desde tu ordenador escribiendo el dominio. Ahora debería funcionar. Esto obviamente no aplicará a móviles, que en casa deberán acceder a tu blog mediante la conexión de datos y no por WiFi.

¡Enhorabuena! Ya tienes WordPress funcionando desde tu Raspberry y es accesible desde cualquier parte del mundo a través de Internet. ¡Objetivo conseguido!

En un siguiente artículo explicaré cómo añadir seguridad a tu servidor y cómo tener un e-mail de tipo loquequieras@tudominio.com de manera sencilla.

Comentar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *