Cómo exponer una instalación casera de Home Assistant a Internet
En este post explicaré cómo expongo mi instalación local de Home Assistant a Internet a través de un dominio propio y de forma segura.
La instalación local de Home Assistant no es más que una raspberry pi conectada al router de mi proveedor de internet.
El dominio propio es un dominio adquirido en google domains, concretamente se trata del dominio popishome.com
.
El acceso al Home Assistant es seguro porque se va a realizar utilizando el protocolo HTTPs. Se cifrará la conexión con un certificado de Let’s Encrypt.
Con estos mimbres se plantean varias cuestiones:
- La raspberry pi está conectada al router del proveedor a internet por lo que la manera de llegar a la raspberry será utilizando la IP que el provedor de internet me haya asignado. En mi caso, dicha dirección IP puede variar al antojo del proveedor ya que no tengo contratada una IP fija. La cuestión que se plantea es ¿Cómo conseguir que el dominio apunte contínuamente a la IP que tengo asignada en cada momento? ¿Qué pasa cuando el proveedor de internet me cambia la IP?
- Let’s Encrypt lanza un desafío para obtener un certificado, que normalmente requiere de un acceso por http al puerto 80 de quien inicia el desafío, que en este caso sería la raspberry. Sin embargo, algunos proveedores de internet tienen el puerto 80 reservado y no dejan abrirlo ¿Cómo solventar dicho inconveniente?
La primera cuestión la podríamos resolver creando en Google Domains un Dynamic DNS
para nuestro dominio y obteniendo unos credenciales para el mismo.
A continuación se configuraría en el Home Assistant el módulo de Google Domains para que actualice periódicamente los registros del DNS con la IP que tengamos asignada en cada momento.
# Example configuration.yaml entry
google_domains:
domain: subdomain.domain.com
username: YOUR_USERNAME
password: YOUR_PASSWORD
Sin embargo, de esta forma únicamente se resuelve la primera de las cuestiones. Me gustaría disponer de una misma solución para solventar ambas cuestiones: Cloudflare al rescate!
Cloudflare
Cloudflare es una red de entrega de contenido (CDN) que nos va a permitir resolver las dos cuestiones que se plantean al inicio. Por un lado tiene un api que permitirá a la raspberry pi notificar de forma periódica cuál es su dirección IP. Y por otro lado también expone un API que permite realizar un desafío DNS para la obtención del certificado, en lugar del habitual desafío http.
Una vez registrados en Cloudflare, se accede a la cuenta y se da de alta el dominio propio de Google Domains:
Al dar de alta el nuevo sitio lo haremos con la siguiente configuración:
- Acceso directo (opción
DNS Only
) - Sin SSL
- Sin DNSSEC
- Sin ningún tipo de optimización de javascript
Una vez dado de alta el sitio, habrá que configurar en el dominio de Google Domains los nameserver que se indiquen en Cloudflare:
Con todo esto, pasaremos a configurar el módulo de Cloudflare en el Home Assistant:
cloudflare:
email: <EMAIL>
api_key: !secret cloudflare_globalapikey
zone: popishome.com
records:
- domotic
El api_key
se corresponde al Global Api Key
y lo obtenemos de la configuración del perfil (My Profile) en Cloudflare:
Con esta configuración se ha resuelto la primera de las cuestiones. Home Assistant notificará periódicamente la IP a Cloudflare y actualizará los registros DNS consecuentemente.
Para resolver la segunda cuestión utilizaré un add-on de Home Assistant, concretamente he utilizado NGINX Proxy Manager
. He seleccionado este add-on y no el oficial de NGINX, porque me resulta más sencillo de configurar y porque se integra con Cloudflare. Este add-on permite obtener fácilmente certificados de Let’s Encrypt y en lugar de pasar el habitual desafío HTTP se puede indicar que sea mediante un desafío DNS. El desafío DNS consiste simplemente en añadir de forma temporal unos registros DNS para que Let’s Encrypt pueda comprobar que estamos en posesión del dominio. Para poder añadir estos registros temporales hay que disponer de un token con permisos para editar el DNS en Cloudflare.
La generación de un token con los permisos necesarios se hará desde My Profile de Cloudflare:
Una vez generado el token, desde la pantalla de administración del add-on NGINX Proxy Manager se genera un nuevo certificado:
Ya con el certificado generado, configuramos un nuevo proxy para el Home Assistant:
Y finalmente, configuramos SSL para dicho host, utilizando el certificado que hemos generado anteriormente:
Lo último que queda por realizar, es abrir en el router del proveedor a internet el puerto configurado en el NGINX Proxy Manager para el protocolo HTTPs:
En mi caso particular he tenido que realizar un paso extra porque estoy utilizando Google WiFi en casa y tengo creada una red interna. He tenido que mapear el puerto de la red “externa” (la del router del proveedor a internet) y la red “interna” (la creada por Google WiFi y en la que está conectada la raspberry con el Home Assistant)
Quería poner el enlace a Google WiFi pero no lo encuentro. Me he acordado de que era un producto que no se vendía en Europa y me lo trajeron de USA (parece que sigue sin venderse aquí). Sí que he encontrado Nest WiFi que tiene pinta de ser lo mismo pero comercializado bajo la marca Nest.
Conclusión
Mediante el uso de Cloudflare he sido capaz de resolver las 2 cuestiones que se me planteaban al principio. Por un lado se actualiza la IP de la raspberry en los registros DNS del dominio propio. Y por otro lado se obtienen certificados de Let’s Encrypt para el dominio propio y se utilizan para establecer una conexión segura. No lo he mencionado hasta el momento, pero la funcionalidad de Cloudflare que he utilizado no tiene coste alguno.