Cámaras IP: Seguridad - P2P - FFMpeg - OpenCV

Última revisión en abril del 2022.
Esta entrada explica como se crean las conexiones P2P entre una cámara IP y su App en el móvil, a través de servidores STUN y TURN, localizados donde sea y controlados por quien sea. Y lo fácil que es encapsular esta cámara IP, aprovechando el protocolo RTSP, usando FFMpeg y OpenCV.

Cámara IP

SriCam IP Camera.
Es un dispositivo que nos permite ver remotamente imágenes a tiempo real de cualquier sitio donde dispongamos de una conexión a Internet.
Cámara IP
Características SriCam IP Camera.

Alimentación

Aparte de la alimentación directa con un enchufe, algunas cámaras las podemos alimentar mediante el propio cable de Ethernet usando un POE (Power Over Ethernet). También hay cámaras IP con batería.

Internet

La conexión de la cámara a Internet es mediante wifi o cable Ethernet. Como hay routers con tarjeta sim 4G/LTE con batería, podemos decir que podemos poner la cámara, al menos mientras duren las baterías, en cualquier lugar.

Aplicaciones

Estas cámaras normalmente vienen con aplicaciones para móviles que utilizan conexiones P2P para simplificar la configuración a nivel de usuario. También podemos usar aplicaciones como iSpy o Blue Iris en ordenadores convencionales.

Aplicación de la cámara IP para móvil
Aplicación Android - SriHome IP Camera

Seguridad

Las conexiones a la cámara pasan por un servidor remoto. Aparte, las App que usamos en nuestro móvil para visualizarlas nos piden habilitar el acceso a todo, incluso a la cámara del móvil para leer el código QR. Muy seguro no parece. Depende de la confianza que nos inspire la compañía que las fabrica y su equipo técnico.

Además, en muchos casos no hay una capa segura TLS y toda la información, incluidos los passwords, viajan sin encriptar, dejando la puerta abierta a los hackers.

Maneras de mejorar la seguridad
Con fabricantes reputados
Usando cámaras IP con TLS
Negando a la App el acceso a nuestro móvil
Cambiando el password que viene por defecto
Conectándolas a Ethernet, no a WiFi.
Usándolas sólo dentro de la LAN
Usando una VPN (Virtual Private Network) en caso de acceso remoto
No usando cámaras en zonas sensibles
Teniendo el firmware actualizado

MAC - Media Access Control

Es un identificador único e invariable asociado a cada dispositivo conectado a Internet. El Mac nos permite reconocer los diferentes dispositivos en nuestras redes locales.

Formato MAC: 

HH-HH-HH-HH-HH-HH
donde H es un hexadecimal entre 1 y F.

IPv4 - Internet Protocol version 4

Cada dispositivo conectado a Internet se le asocia una dirección IP fija o dinámica. Como el Protocolo de Internet versión 4 no tiene suficientes direcciones para todos los dispositivos conectados a Internet, hay unos rangos de direcciones que son privadas y se pueden repetir en diferentes redes locales. Así nuestros routers incluyen NATs que enlazan las direcciones IP privadas y públicas.

Formato IPv4 (2^32 direcciones):

d.d.d.d
donde d es un decimal entre 1 y 255.

Formato IPv6  (2^128 direcciones):

HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH:HHHH
donde H es un hexadecimal entre 1 y F.

Puerto

Las diferentes aplicaciones o servicios de un dispositivo que se conectan a Internet con una dirección IP se les asocia un puerto para reconocerlas.

NAT - Network Address Translation

El router que tiene asociada una dirección IP pública, tiene diferentes dispositivos conectados a los que asocia una dirección IP privada.

El NAT, que forma parte del router, asocia un puerto público de salida a cada conexión hacia el exterior de cada aplicación (Puerto privado) de cada dispositivo (IP privada) conectado al router.

El NAT no responde ninguna conexión exterior (IP pública, Puerto público) que no haya tenido previamente una salida. O sea, un servidor no puede enlazar con el cliente si este antes no se lo pide.

Esquema de NATs, P2P y cámara IP
P2P usando servidor STUN

P2P - Peer to Peer

P2P es una conexión directa de dos aplicaciones (Puerto) de dos dispositivos (IP) sin intermediarios.

Las cámaras IP y sus aplicaciones hacen conexiones P2P pero como no saben si están conectados en diferentes NATs, que no permite conexiones entrantes sin una salida previa, recurren a servidores STUN y a veces también a protocolos TURN.

STUN - Session Traversal Utilities for NAT

El servidor STUN responde al cliente con su dirección IP y puerto, tanto públicos como privados, que esta usando. Y además le da la dirección IP y puerto, tanto públicos como privados, del cliente al que se quiere conectar. Esto permite intentar una conexión directa entre los clientes que pueden estar dentro del mismo NAT o no. Si esto falla, como es el caso de los NATs simétricos, se puede recurrir a un Servidor TURN.

TURN - Traversal Using Relays around NAT

Cuanto el NAT no admite la conexión directa entre dos clientes, se utiliza un servidor TURN para retransmitir toda la información entre ellos.

RTSP - Real Time Streaming Protocol

Normalmente podemos acceder a las cámaras IP mediante el protocolo RTSP que viene a ser el mando a distancia clásico con el que puedes moverte por los datos de audio y video.

Este protocolo nos permite independizarnos de las aplicaciones de visualización que nos vienen con la cámara.

Stack protocolos cámara IP
RTSP protocol stack

Nuestra aplicación

Hay muchas aplicaciones para ver videos con el protocolo RTSP, como VCL, pero es muy fácil hacérnosla nosotros mismos. Para ello podemos utilizar las librerias de codigo abierto de FFMpeg y OpenCV.

IP estática

Reservamos una IP privada en el router para nuestra cámara, basándonos en su MAC. Así cuando arranque siempre se le asignará la misma IP y nos será más fácil encontrarla desde nuestros programas.

FFMpeg - Fast Forward Mpeg

FFMpeg es un proyecto de código abierto, en lenguaje C, con librerías y programas para manejar video y audio. Este proyecto fue iniciado por el prolífico Fabrice Bellard y actualmente es usado por infinidad de aplicaciones como VCL, iTunes y Youtube.

FFMpeg se usa en la consola del Sistema Operativo y tiene un sinfín de parámetros.

	
ffmpeg -rtsp_transport udp 
	-i rtsp://IP:PORT/application 
	-f image2 
	-frames:v 5 
	-vf fps=1/5 
	-y %03d.jpeg

El comando en línia anterior extrae 5 images JPEG del stream RTSP de la cámara IP, con un intervalo de 5 segundos entre imágenes.

-rtsp_transport protocolo de transporte udp
-i entrada RTSP
-f image2 muxer de imagen (de frames a imágenes)
-vf fps= frames por segundo
-y %03d.jpeg nombre de las imágenes resultantes, entero de 3 cifras (-y sobreescribe).
Explicación comando FFMpeg
FFMpeg es capaz en un solo comando de recibir en RTSP y publicar en DASH (Dynamic Adaptive Streaming over HTTP).

MPEG - Moving Picture Experts Group

Para hacer viable la transmisión del audio y del video en internet, estos se comprimen usando los códecs H.264 o H.265.

Muchas de estas cámaras permiten la comunicación de audio bidireccional.

OpenCV - Open Source Computer Vision

Es una librería de código abierto, en lenguaje C/C++, de visión artificial, nos permite hacer cosas tan interesantes con las imágenes como saber si se trata de un perro o una persona lo que se está moviendo delante de la cámara.

OpenCV dispone de bindings para lenguajes más amigables como Java y Python.

El código para extraer imágenes (frames) es muy simple.


VideoCapture capture = 
	new VideoCapture("rtsp://IP:PORT/application");
    
if (capture.isOpened())
{
   while (true)
   {
      capture.read(webcamMatImage);
      if (!webcamMatImage.empty())
      {
       	// manage frame
      } else
      {
       	// Frame not captured -- break
        break;
      }
   }
} 	

Todo el trabajo realmente lo está haciendo las librerías de FFMpeg, incluidas en OpenCV, que contienen los códecs y los protocolos de comunicación.

El problema de este código es que sólo sirve dentro de nuestra red local ya que es incapaz de saltarse el NAT del router y llegar al stream RTSP de la cámara IP. Esto lo podemos hacer usando un servidor STUN o abriendo un puerto del router para nuestra aplicación. (Port Forwaring + DDNS).

Port forwarding

Si el router tiene Port forwarding podemos asociar un puerto público a una dirección IP estática privada y a un puerto privado.

El router puede asociar una IP de forma permanente a un dispositivo basándose en su MAC.

Ahora el problema que tenemos es que la dirección publica del router puede cambiar. Esto se soluciona con un DDNS.

DDNS - Dynamic Domain Name System

Hay routers que permiten configurar un DDNS. El DDNS se conectan con un servidor para informar de los cambios de la IP pública del router. Esta IP está asociada a un subdominio fijo que podremos usar como punto de entrada a nuestro dispositivo local.

Raspberry Pi

Nuestra aplicación puede estar alojada en una Raspberry Pi, que estará en el mismo router que la cámara.  La Raspberry Pi 4 Model B, con un ARM de 64 bits a 1.5 GHz, tiene suficiente potencia para gestionar streaming y manipular frames. Además tiene un decodificador hardware para H.264 y H.265, y un codificador hardware para H.264.

La Raspberry Pi 4 tiene la potencia y las librerías de código abierto necesarias para el procesado de las imágenes.

Podemos recibir las imágenes con FFMpeg, manipularlas con openCV, servirlas a través de un servidor Nginx instalado en la propia Raspberry, pero le costaría atender a todos los eventos a la vez. Así que mejor utilizar la Raspberry simplemente como pasarela que manipula las imágenes en función de eventos externos recibidos por sus GPIOs y las publica en la nube para que otros servidores o usuarios las puedan consumir.

Las GPIOs pueden alojar por ejemplo sensores de movimiento, de humo, relés que encienden luces o alarmas, para hacer un sistema de seguridad para nuestra casa. 

Podemos evitar cableados utilizando tecnologías como ZigBee o Z-Wave que implicaría poner un sombrero hardware en la Raspberry pero evitaria complicarnos la vida con adaptaciones de hardware para los sensores / actuadores, ya que son dispositivos que simplemente se conectan. Lógicamente, simplificar el desarrollo hardware tiene un precio econòmico, pero también facilita el mantenimiento ya que se convierte en el equivalente a cambiar una bombilla.

Una bombilla Osram Smart + LED de 800 lumens con tecnología ZigBee que puedes encender, apagar, cambiar de color y regular la intensidad se puede encontrar en Amazon por menos de 8 euros (En algún momento de Diciembre 2020).

Las posibilidades son infinitas.

Esquema General
Segurizando nuestra casa con un Raspberry PI

Servidor Pub/Sub

Este tipo de servidor desacopla el dispositivo que genera la información de la aplicación que la consume. Así, Raspberry publica información sobre temas, por ejemplo "detección de humo", que serán empujados a través de Notificaciones Push a aplicaciones de usuarios que previamente se han subscrito.

Notificaciones Push

Se tiene que crear una pequeña aplicación de usuario que le permita recibir notificaciones a las que previamente se ha subscrito. Si le interesa el tema, entonces puede conectarse al Servidor Web para ampliar la información sobre el tema o simplemente visualizar directamente la cámara que ha generado la notificación.

Servidor Web

Se tiene que crear también un Servidor Web para gestionar todas las imágenes, vídeos, alarmas previamente publicadas por la Raspberry.

Para finalizar

En la entrada Mejorando una cámara IP - Raspberry PI tenéis un ejemplo de encapsulación y mejora de una cámara IP usando una Raspberry PI.

Qué más

Comentarios