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:

  1. 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?
  2. 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.

Crear un Dynamic DNS en Google Domains

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:

Añadir nuestro dominio en Cloudflare

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:

Nameservers en Cloudflare

Nameservers en Google Domains

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:

Global api key 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:

Token con permisos para editar DNS en Cloudflare

Una vez generado el token, desde la pantalla de administración del add-on NGINX Proxy Manager se genera un nuevo certificado:

Nuevo certificado SSL en NGINX Proxy Manager

Ya con el certificado generado, configuramos un nuevo proxy para el Home Assistant:

Nuevo Proxy Host en NGINX Proxy Manager

Y finalmente, configuramos SSL para dicho host, utilizando el certificado que hemos generado anteriormente:

Configuracion SSL para el Proxy Host en NGINX Proxy Manager

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:

Configuracion de puertos de NGINX Proxy Manager

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.

Acceso seguro a Home Assistant a través de un dominio propio

Diego Castro
Diego Castro
Ingeniero en Informática

Apasionado de la programación

Relacionado