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 te facilitan un poco la vida. Vamos a ver cómo acceder a ellos localmente con dominio y SSL 🙂
Personalmente, hay servicios que no me gusta exponer a internet. Antes accedía a todos por IP, pero en cuanto vas acumulando servicios te das cuenta de que:
- No puedes memorizar todos los puertos.
- Es incómodo estar poniendo puertos.
La solución temporal
Mi solución temporal fue crear una zona local en mi dominio (local.dominio.tld), aprovechando el DNS local que uso para AD. Gracias a esto, y usando NGINX, puedo usar virtual hosting y exponer servicios a mi red local de forma 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?
Poca cosa:
- Servicios que exponer (idealmente configurados con virtual hosting, como indico arriba).
- Un servidor web local (en mi caso NGINX, sobre Ubuntu Server).
- Un servidor DNS local (o tendremos que actualizar el archivo
hostsde cada máquina). - Un dominio público en propiedad, en el que podamos añadir un registro TXT para verificar el certificado.
Primer paso: crear los registros DNS y el virtual host
Damos por hecho que ya tenemos un servidor DNS montado y que nuestra máquina lo usa para resolver. Hay que crear un registro A que apunte al servidor web que vayamos a usar, por ejemplo:
| Nombre | Tipo | Valor |
|---|---|---|
| zabbix | A | 192.168.1.230 |
Una vez creado, si accedemos a zabbix.dominio.tld (sustituyendo dominio.tld por nuestro dominio), deberíamos llegar a nuestro servidor web. Paso completado.
Segundo paso: obtener el certificado SSL
Para obtener el certificado usaremos Let’s Encrypt, una CA gratuita que usan miles de sitios. Pediremos un certificado wildcard: todo lo que cuelgue de *.dominio.tld podrá usarlo.
¡Ojo! El wildcard cubre un solo nivel: vale para
zabbix.dominio.tld, pero no paraalgo.zabbix.dominio.tld.
Para obtenerlo hay que instalar Certbot:
sudo apt install certbot python3-certbot-nginx
Una vez instalado, y comprobado que el virtual hosting funciona, ejecutamos:
sudo certbot certonly \
--agree-tos \
--email [email protected] \
--manual \
--preferred-challenges=dns \
-d '*.example.com' \
--server https://acme-v02.api.letsencrypt.org/directory
Cambiando *.example.com por nuestro dominio, Certbot nos pedirá algo así:
Please deploy a DNS TXT record under the name:
_acme-challenge.example.com.
with the following value:
<valor-aleatorio>
Press Enter to Continue
Añadimos un registro TXT con ese nombre y valor en nuestro dominio público, pulsamos Enter y debería generarnos el certificado.
Solo nos queda configurar el certificado en el servidor web, habilitar el puerto 443 y ya lo tenemos todo servido por HTTPS.