Este artículo demuestra cómo implementar un proxy reverso con soporte para SSL/TLS para una instalación de Home Assistant utilizando Nginx. Cabe destacar que no se cubre el proceso de instalación y configuración de Hass.io, sólo la configuración del proxy HTTPS reverso, la cual resulta un tanto particular a fin de que las aplicaciones conectadas funcionen correctamente.

Home Assistant es una tecnología de automatización para aplicaciones de domótica de código abierto que permite convertir a un dispositivo embebido (como una Raspberry Pi) en un sistema de control centralizado de nuestro hogar. Las ventajas de utilizar Hass.io son muchas, entre las que se destacan su naturaleza libre y open source; el hecho de que esté optimizado para dispositivos como la Raspberry Pi; simplicidad de instalación; y la posibilidad de controlar nuestro hogar desde una interfaz Web.

Esto suena muy bonito pero, claro está, se requiere implementar un cierto nivel de seguridad para llevarlo a la práctica. Por ello en este artículo explico cómo configurar un proxy reverso con Nginx para implementar HTTP/S y garantizar una comunicación segura entre nuestro smartphone y la Raspberry hogareña.



Es importante destacar que, a fin de proveer un acceso desde el exterior a nuestro sistema hogareño (detrás de una red privada) es conveniente utilizar una VPN. A tal fin es posible implementar un front-end en la nube que funcione tanto como proxy SSL como servidor de VPN. De esta forma se accede públicamente y através dfe HTTP/S al front-end, y el mismo se encarga de realizar las solicitudes HTTP contra nuestro sistema hogareño a través de una VPN segura. Más allá de resolver la cuestión de conectividad hacia una red privada, se incrementa notablemente la seguridad (pues no se requiere abrir un puerto hacia dentro de nuestra red doméstica).

Para saber cómo implementar un servidor VPN en la nube en simples pasos, recomiendo el artículo: Cómo montar un servidor de VPN con OpenVPN en Debian 9 (systemd).

Luego será necesario montar un servidor HTTP/S con Nginx: Compilar Nginx desde los fuentes en Debian 9.

Finalmente obtener un certificado SSL gratuito para nuestro servidor cloud utilizando certbot: Cómo generar un certificado SSL/TLS gratis con certbot en 2018.

Con esta base, se procede a configurar el proxy reverso hacia la instancia de Hass.io.

El primer paso consiste en corroborar el acceso a través de la VPN a la instancia de Hass desde el servidor cloud:

root@cloud:~# curl -I http://10.8.0.5:8123
HTTP/1.1 405 Method Not Allowed
Content-Type: text/plain; charset=utf-8
Allow: GET
Content-Length: 23
Date: Mon, 8 Jul 2019 14:29:58 GMT
Server: Python/3.6 aiohttp/3.5.4

Se observa que se obtiene una respuesta HTTP del servidor Hass.io.

Es importante aclarar que, para no perder el acceso al sistema hogareño entre reinicios, es necesario asignar una IP fija al cliente OpenVPN.

Proceder entonces con la configuración del proxy reverso Nginx con soporte para SSL/TLS (HTTP/S). Editar el archivo de configuración de Nginx:

# nano nginx.conf

Definir un nuevo upstream dentro del protocolo HTTP (sección http):


http {

    upstream hass {
        server 10.8.0.5:8123;
    }

Luego definir un servidor SSL, indicando claramente las rutas a los certificados previamente obtenidos vía certbot:


    server {
        listen      443 ssl;
        server_name home.linuxito.com;

        ssl_certificate     /etc/letsencrypt/live/home.linuxito.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/home.linuxito.com/privkey.pem;

        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 5m;

        ssl_protocols TLSv1.2;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
        ssl_prefer_server_ciphers on;
        ssl_ecdh_curve secp384r1;
        ssl_session_tickets off;

        access_log logs/home.linuxito.com.access.log;
        error_log  logs/home.linuxito.com.error.log;

        location / {
            proxy_pass http://hass;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;

            # WebSocket
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }

    }

Las porciones más importantes de la configuración, necesarias para que las aplicaciones de Home Assistant funcionen correctamente, son las siguientes:

        ssl_protocols TLSv1.2;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
        ssl_prefer_server_ciphers on;
        ssl_ecdh_curve secp384r1;
        ssl_session_tickets off;

Esta porción de configuración define qué versión de protocolo y suite de cifrado se utiliza para dar soporte a TLS. Esta combinación de suites funciona correctamente hasta el momento. Luego viene la configuración para WebSockets:

            # WebSocket
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

La API de Hass.io está implementada con WebSockets, por ende es necesario forzar el upgrade de protocolo HTTP/1.1 a WebSocket para que funcione Hass.io desde la autenticación en adelante.

Guardar los cambios, reiniciar Nginx, y verificar el acceso al front-end Web:


Tal vez pueda interesarte


Compartí este artículo