Exponer servicios en la red de casa con HTTPS

Seguramente tengas una Raspberry o un mini-servidor en casa y te hayas animado a montar un par de servicios como Home Assistant o Guacamole (entre otros), que facilitan un poco tu vida diaria. Vamos a ver como acceder a ellos localmente con dominio y SSL 🙂

Personalmente, hay servicios que no me gusta exponer a internet. Anteriormente accedía a todos mis servicios por IP, pero en cuánto vas acumulando servicios te das cuenta que:

  • No puedes memorizar todos los puertos
  • Es incómodo estar poniendo puertos

La solución temporal

Mi solución temporal a esto fue, aprovechando mi DNS local que uso para AD, crear una zona local en mi dominio (local.dominio.tld). Gracias a esto y usando NGINX puedo usar virtualhosting y exponer servicios a mi red local accediendo de manera fácil, en vez de 192.168.1.233:8123 para acceder a Home Assistant ahora pongo hass.dominio.tld y me lleva directamente al login, un lujo, ¿eh?

Estuve un tiempo así y luego pensé, oye, ¿y si le pongo SSL a esto? Es más seguro y para mi gusto queda mejor acceder por HTTPS. Así que, ¿vamos a montarlo no?

La solución definitiva

¿Qué necesitamos?

Necesitamos poca cosa:

  • Servicios que exponer (idealmente configurados con virtualhosting como indico arriba).
  • Un servidor web local (en mi caso NGINX, sobre Ubuntu server).
  • Un servidor DNS local (o tendremos que actualizar el archivo hosts de cada máquina).
  • Un public routable domain (necesitamos un dominio en posesión, al que le podamos cambiar los DNS para añadir un registro TXT para la verificación del certificado SSL).

Primer paso – Crear los registros DNS en nuestro servidor, apuntarlo al servidor web y crear un virtualhost

Obviando que tenemos ya un servidor DNS montado y nuestra máquina lo usa para resolver, hemos de crear un registro A apuntando al servidor web que vayamos a usar, por ejemplo:

NombreTipoValor
zabbixA192.168.1.230

Una vez creado, si accedemos a zabbix.dominio.tld (sustituyendo dominio.tld por nuestro dominio), deberíamos de llegar a nuestro servidor web. Paso completado.

Segundo paso – Obtener certificado SSL

Para obtener el certificado SSL usaremos Let’s Encrypt, una CA gratuita usada por miles de sitios (incluido este) para obtener certificados. En nuestro paso, obtendremos un certificado wildcard. Esto quiere decir que todo lo que englobe *.dominio.tld podrá usar este certificado.

Ojo! Este certificado no aplica a subdominios (sub.dominio.tld), solo aplica a un nivel.

Para obtener este certificado, hemos de instalar Certbot

 sudo apt install certbot python3-certbot-nginx 

Una vez instalado esto y comprobado que tenemos el virtualhosting configurado correctamente, ejecutamos este comando:

sudo certbot certonly \
--agree-tos \
--email someone@example.com \
--manual \
--preferred-challenges=dns \
-d *.example.com \
--server https://acme-v02.api.letsencrypt.org/directory

Después de ejecutar eso, cambiando el *.example.com por nuestro dominio, nos dará algo así

sudo certbot certonly \
--agree-tos \
--email someone@example.com \
--manual \
--preferred-challenges=dns \
-d *.example.com \
--server https://acme-v02.api.letsencrypt.org/directory

Hemos de añadir un registro TXT con ese valor a nuestro dominio público para que obtenga el certificado.

Una vez hecho esto, le damos al Enter y ya debería de generarnos el certificado.

Sólo nos queda añadir este certificado a nuestro servidor web, habilitar el puerto 443 y ya lo tenemos todo expuesto.


¿Quieres estar enterado de las últimas novedades de este blog? Visita la página de Newsletter para más información o suscríbete directamente desde aquí con el siguiente formulario


También puedes contactarnos desde el formulario de contacto disponible en este blog en el siguiente enlace.

Deja una respuesta

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