Durante las semanas de vacaciones me he entretenido en activar la raspberry pi y medir la temperatura de casa diferentes habitaciones mediante los sensores de temperatura y humedad de Xiaomi LYWSD03MMC.
La ideal era solo eso, pero fue cambiando con el paso del tiempo para disponer de lo siguiente:
- Conectividad desde el exterior de casa a la raspberry pi [SSH]
- Conectividad desde el exterior mediante VPN para evitar tener que publicar puertos adicionales a otros recursos de casa [OPENVPN] en la raspberry pi
- Encendido mediante Wake On LAN (WOL) de otros equipos de casa [Scripts + Apache]
- Despliegue de un sistema de sondeo de los diferentes sensores de Xiaomi, que inicialmente fue MRTG pero luego lo cambie para utilizar [Cacti+MariaDB+Apache]
- Sistema de notificación utilizando Telegram [script que llama a curl]
- Protección del sistema de ataques por fuerza bruta de los puertos publicados en el router SSH/OPENVPN [Fail2ban]
Lo anterior son todas aquellas cosas que necesito tener funcionando las 24h. El consumo de la raspberry pi es muy bajo, por lo que no tiene apenas costo.
Luego, tengo otros servicios que requieren de mayor consumo de cpu y memoria por lo que no tienen cabida en la Raspberry Pi, por lo que tengo un Intel NUC con 64 GB, en donde he despliegue aquellos servicios que son bajo demando. Una vez encendido el equipo mediante WOL desde la rasbperry pi, he desplegado lo siguiente
- Cluster de Kubernetes basado en tres nodos que levanto con virsh
- Repositorios git [publicados en el apache].
- Gitweb para una consulta rapida del contenido de los repositorios (no para realizar commits/push/pull, solo para verlo dentro del apache y poder navegar por sus contenidos)
Así que el primer problema consistía en obtener la IP del router y utilizar un servicio de IP dinámica (noip.com). De esa forma, obtengo un nombre DNS que apunta siempre a la IP pública del router.
El segundo paso ha sido poner una ip fija dentro de la LAN de casa para que la raspberry cuando se encendiera utilizara siempre lo mismo. Esto se puede hacer configurándola en la interfaz de red de la raspberry o mediante haciendo que el DHCP del router le asigne siempre la misma utilizando su mac-address. En mi caso he optado por la segunda opción. De hecho, el otro equipo que tengo (el intel nuc) también toma la ip por DHCP pero tiene una reserva con su mac-address.
El tercer paso ha sido publicar los puertos del SSH y de OPENVPN en el router para que desde el exterior se dirija la comunicación hacia los correspondientes servicios (SSH, OPENVPN). No he utilizado los tradicionales (22/tcp y 1194/udp) sino que he utilizado otros para evitar escaneos sencillos.
Como medida adicional he instalado fail2ban para que me detecte intentos de hacer login en los servicios SSH/OPENVPN y si superan el máximo numero de intentos (5), sea baneada la ip del equipo remoto durante un par de horas. Si ocurre algo de eso, es notificado por telegram.
También he habilitado el doble factor de autenticación en el SSH cuando se utiliza password. Podria haber deshabilitado el acceso mediante password y permitir solo el acceso con certificado SSH, pero mantengo los dos métodos de acceso.
El cuarto paso ha sido la creación de un script de notificación via telegram. El script permite mandar mensajes de texto a un canal de chat de Telegram utilizando un bot.
Para que Cacti pueda graficar los valores de temperatura de los sensores LYWSD03MMC, he hecho un script específico al que se la pasa la mac-address y desde la raspberry mediante bluetooth sondeo los valores de temperatura de los siete sensores que tengo instalados en cada habitación de la casa (cocina, salón, estudio, baño chico, baño grande, cuarto de invitados y dormitorio). Este sondeo se realiza cada cinco minutos.
Esto en lo que atañe a la raspberry pi y aquellos servicios consideras 24h. Como ya dije, los servicios on-demand están instalados en el Intel NUC. El encendido del mismo se puede hacer mediante un script que llama a WoL para encender el Intel NUC, pero también habilite en el apache un directorio desde el cual se permite ejecutar el script de WoL de Intel NUC, manteniendo dos formas de encenderlo (línea de comandos y apache).
El primer paso fue habilitar WOL en la UEFI para que si llegaba un paquete de WOL a la red de la tarjeta del Intel NUC. El mensaje de WOL hace uso de lo que se denomina paquete mágico que no es más que un mensaje de red formado por una cadena de seis bytes con valor hexadecimal FF FF FF FF FF FF seguida de 16 repeticiones de la dirección MAC del destino para poder arracarlo. El mensaje de red se envía a los puertos 7 o 9 UDP.
Cuando la tarjeta de red del equipo destino detecta el paquete, comprueba que las 16 MAC corresponden con la suya, enviando una señal eléctrica a la placa base para que encienda.
Es lógico que para utilizar esta forma de arranque remoto es necesario conocer la dirección MAC-ADDRESS del destino.
Posteriormente, se instalan las herramientas de git para gestionar el repositorio y el apache para publicar por HTTP, permitiendo el acceso remoto al repositorio. Una vez creado el repositorio se agrega gitweb para publicar un visor del repositorio en el apache y accesible mediante el navegador.