De forma segura y a prueba de NAT y DHCP. Este artículo demuestra de qué forma es posible acceder desde cualquier parte del mundo, a través de Internet, a una Raspberry Pi, Cubieboard u otra microcomputadora corriendo un sistema operativo Raspbian, Ubuntu o similar (basado en Debian). El objetivo es poder conectarse a la raspi de forma eficaz, aún cuando ésta tenga acceso a Internet mediante una dirección IP dinámica (DHCP) no predecible, e incluso detrás de una NAT o una red privada del ISP (lo que haría inútil recurrir a un servicio como no-ip). A tal fin sólo se requiere de una VPN (red privada virtual), por ende se deberá contar con un servidor de VPN accesible públicamente (a través de una dirección IP pública estática y fija).

Esta implementación resulta de gran utilidad a quienes estén implementando soluciones de domótica como openHAB o similares, y tengan la necesidad de controlar su casa desde cualquier parte del mundo. Todo esto utilizando soluciones open source.



Si no contamos con un servidor con IP pública, es posible contratar cualquier VPS de bajo costo en la nube. En la actualidad se consiguen servidores privados virtuales por menos de U$S 5 por mes. Con un servidor VPS de bajos recursos será suficiente para nuestro objetivo, ya que sólo correrá el servicio de VPN y un front-end Nginx con baja carga.

Este tutorial asume que tenemos nuestra raspi instalada corriendo algún sistema operativo basado en Debian y con todas las herramientas de domótica instaladas (no cubre la instalación ni configuración de openHAB).

El primer paso consiste en contratar un VPS y montar un servidor de VPN.

Luego será necesario instalar y configurar el cliente OpenVPN en la microcomputadora. De esta forma, la raspi quedará accesible a través de Internet mediante la VPN. Como la conexión con la VPN la inicia el cliente, automáticamente queda resuelto el problema de tener conectada nuestra microcomputadora a una red privada del ISP, detrás de una NAT e incluso con una IP dinámica (la dirección varía y no es posible predecirla).

Lo único que resta es configurar una IP estática en el cliente VPN, para que el acceso a la raspi a través de la VPN sea hacia una dirección IP predecible (fija).

En este punto tenemos dos opciones: 1) instalar el cliente de VPN en nuestro smartphone y acceder a la raspi directamente a través de la VPN; o 2) Montar un front-end Web conectado a la misma VPN (intuitivamente en el mismo servidor de VPN) que permita dar acceso sólo a cierto servicio en la raspi (muy probablemente el servicio HTTP para acceder a openHAB).

Este artículo explica cómo implementar la opción 2, lo cual permite prescindir de la instalación de certificados y configuración de VPN en nuestro smartphone, y habilita el acceder desde cualquier sistema o dispositivo sin conexión a la VPN. La comunicación ocurre de la siguiente forma:

  1. Al iniciar, la raspi se conecta automáticamente al servidor OpenVPN, estableciendo correctamente la comunicación a través de la VPN (línea punteada en color azul).
  2. Desde nuestro smartphone, o cualquier cliente con acceso a Internet (y desde cualquier ubicación), accedemos al servidor front-end (que a su vez funciona como servidor de VPN).
  3. El servidor hace la solicitud correspondiente a la raspi, a través de la VPN, y retorna los resultados al cliente (funciona como un proxy reverso).

Tanto la raspi como el smartphone funcionan como clientes al VPS. La raspi funciona como cliente VPN y el smartphone como cliente Web (protocolo HTTP). Ambos dispositivos a interconectar son clientes, lo cual permite que puedan comunicarse con éxito a pesar de estar ubicados detrás de redes privadas, NAT, firewalls y DHCP.

Veamos entonces cómo configurar Nginx en el VPS para que funcione como proxy reverso. Previamente debe haber sido instalado, claro está, o también puede haber sido compilado desde los fuentes.

Primero se debe definir un upstream dentro del protocolo HTTP. Suponiendo que se ha asignado a la raspi la dirección IP fija 10.8.0.100 en la VPN, y la instalación de openHAB escucha en el puerto 8080, la configuración es la siguiente:


http {

    upstream home_sweet_home {
        server 10.8.0.100:8080;
    }

Como medida de protección básica, es necesario forzar HTTPS, pues estaremos accediendo al control remoto de nuestra casa:

    server {
        listen       80;
        server_name  home.linuxito.com;
        rewrite      ^ https://$server_name$request_uri? permanent;
    }

Se asume que el nombre de host del servidor VPS es "home.linuxito.com".

Es posible obtener un certificado SSL gratis con 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_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

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

Luego es necesario restringir el acceso al panel de openHAB de alguna forma, por ejemplo utilizando autenticación basic:

        location / {
            proxy_pass http://home_sweet_home;
            proxy_set_header Host                   $http_host;
            proxy_set_header X-Real-IP              $remote_addr;
            proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto      $scheme;

            ## Password Protection
            auth_basic                              "Acceso restringido";
            auth_basic_user_file                    .htpasswd;

        }

Generar el par de credenciales (usuario y contraseña) utilizando la herramienta htpasswd.

Ahora es posible instalar (si aún no lo hemos hecho) la aplicación mobile de openHAB para Android y configurar el acceso a nuestro servidor front-end.

Desde el menú principal, abrir "Settings" para configurar el acceso:

Acceder a la opción "Remote" y configurar el acceso al VPS:

Especificar la URL "https://home.linuxito.com:443" e indicar el usuario y contraseña creado con htpasswd durante la configuración de la autenticación basic:

Ya es posible administrar el control de nuestra casa mediante openHAB desde cualquier parte del mundo.

Por supuesto este artículo está orientado para openHAB, pero la implementación de la VPN permite acceder a la raspi para cualquier otro uso, lo cual abre un abanico enorme de posibilidades. Logramos ingresar a un host en una red privada, que de otra forma no sería posible (por firewall, carencia de ruteo, etc.).


Tal vez pueda interesarte


Compartí este artículo