Servidor casero con Proxmox, MikroTik y BIND9 firmado con DNSSEC, accesible desde cualquier parte del mundo mediante WireGuard. Sistema de fichaje con tarjeta RFID en ESP32 conectado a una web PHP, todo aislado de la red doméstica con tolerancia 0 a errores de seguridad.
Este es mi proyecto final del ciclo formativo en la asignatura de Servicios de Red. El reto autoimpuesto fue montarlo en mi propia casa, conectado tras el router de Orange y un router Huawei intermedio, sin que ningún equipo del servidor pueda llegar a esos routers domésticos.
El requisito clave: poder fichar (con tarjeta RFID en un ESP32) desde cualquier parte del mundo manteniendo seguridad máxima. La filosofía de diseño: tolerancia cero a errores de seguridad — cada capa pensada para que el fallo de una no comprometa la siguiente.
Topología en cascada de tres routers, con el MikroTik actuando como firewall central:
La regla maestra del firewall del MikroTik bloquea cualquier paquete originado desde la red interna del
servidor (10.10.10.x, 10.10.20.x, 10.10.30.x) hacia cualquier
dirección RFC1918 ajena. Esto significa que:
192.168.100.1).192.168.1.1).
Defensa adicional: LAN→MGMT explícitamente bloqueado (una LXC comprometida no puede pivotar
al host Proxmox), cadena OUTPUT del MikroTik bloquea que el propio router llame a los
routers domésticos, y el acceso administrativo a WinBox/SSH está restringido a la IP exacta del portátil
(/32), no a una subred entera.
Para fichar desde cualquier parte del mundo:
Resolver autoritativo y recursivo en un LXC con BIND9:
paginasprueba.com y zona hija Nfic.paginasprueba.com, ambas firmadas con KSK/ZSK ECDSAP256SHA256./etc/bind/bind.keys.delv +rtrace confirma ; fully validated. Esto certifica que ningún registro DNS puede ser manipulado por un atacante intermedio.
delv +rtrace mostrando ; fully validated — la prueba criptográfica de la cadena padre→hija.
El reto principal de DNSSEC es la caducidad de las firmas RRSIG. Si caducan sin renovarse, los validadores externos rechazan el dominio entero. Para evitarlo, dos capas de defensa:
delv contra el resolver local y verifica la cadena. Si detecta broken trust chain, envía alerta a Telegram (Bot API) y email vía SMTP de Gmail con msmtp.dig +dnssec, calcula días restantes, y si quedan ≤ 7 días envía alerta proactiva.
Matriz de pruebas realizadas para evidenciar que todo funciona:
ping 192.168.100.1 desde una LXC → 100 % packet loss confirmado.
delv +rtrace devuelve "; fully validated" con la cadena padre→hija verificada.
Wireshark muestra solo TLS al puerto 443 contra 1.1.1.1, jamás UDP/53 sin cifrar.
Se caducó una firma intencionalmente; el script envió alerta a Telegram + Gmail antes del fallo del cliente.
Validado desde 4G del móvil — ESP32 abre túnel WireGuard y ficha contra la web PHP.
Este proyecto ha sido una breve practica la cual se puede mejorar, tanto con un sistema de logs como arquitectonicamente.
Cada desición que tome en este proyecto me fije en la seguridad de mi red.
El resultado es un entorno donde un fallo en cualquier capa no propaga el daño.
Y la automatización de las alertas DNSSEC garantiza que la infraestructura es resistente no solo a ataques,
sino también al olvido humano del propio administrador.
Pronto implementare mejoras.
¡Gracias por leer este articulo!