Autor: Iván Jiménez
GitHub: @ivanjimenez
Este documento detalla el desarrollo, compilación y despliegue del plugin InternetControl, diseñado para proporcionar un control granular sobre el acceso a Internet en entornos educativos gestionados por Veyon.
El plugin InternetControl integra dos funciones principales en la interfaz de Veyon Master:
- Bloqueo Total: Intercepta y descarta todo el tráfico saliente por los puertos 80 (HTTP) y 443 (HTTPS).
- Desbloqueo: Restaura la conectividad eliminando las reglas del firewall.
Utiliza iptables en el lado del cliente (alumno) y se comunica a través del protocolo de mensajes de Veyon, ejecutándose con privilegios de superusuario a través del proceso VeyonServer.
© 2024 Iván Jiménez. Todos los derechos reservados (All Rights Reserved).
El código fuente de este desarrollo es propiedad exclusiva de su autor. Queda estrictamente prohibida la copia, reproducción, modificación, distribución o uso comercial del código fuente sin la autorización expresa y por escrito de Iván Jiménez.
Aviso Legal de Dependencias (GPL/LGPL): Este software actúa como un plugin ('add-on') para la plataforma Veyon (licenciada bajo GPL) y hace uso del framework Qt 6 (licenciado bajo LGPLv3/GPLv3 en su edición Open Source). Cualquier distribución pública del archivo binario compilado (
.so/.dll) debe realizarse cumpliendo con las obligaciones de dichas licencias subyacentes, lo cual generalmente exige permitir la ingeniería inversa para depuración y proporcionar el código fuente bajo demanda si el binario se distribuye a terceros. El uso interno en una institución no constituye distribución.
internet-veyon-plugin/
├── CMakeLists.txt # Configuración de compilación para Qt 6
├── InternetControl.json # Metadatos del plugin para el sistema de carga
└── src/
├── InternetControlPlugin.h # Definición de la clase y macros Qt
└── InternetControlPlugin.cpp # Implementación de la lógica y comandos
Para garantizar la estabilidad del sistema del alumno, se implementó una función lambda de limpieza que evita la acumulación de reglas redundantes en la cadena OUTPUT:
auto clearRules = []() {
while (QProcess::execute("/usr/sbin/iptables", {"-D", "OUTPUT", "-p", "tcp", "--dport", "80", "-j", "DROP"}) == 0);
while (QProcess::execute("/usr/sbin/iptables", {"-D", "OUTPUT", "-p", "tcp", "--dport", "443", "-j", "DROP"}) == 0);
};Esta lógica asegura que, sin importar cuántas veces se envíe la orden de bloqueo, el estado final del firewall sea siempre predecible y limpio.
- Veyon SDK: Cabeceras (
.h) ubicadas en la ruta de desarrollo. - Qt 6.x: Librerías de desarrollo (
qt6-base-dev). - CMake: Versión 3.16 o superior.
Desde la raíz del proyecto:
# Crear y entrar al directorio de construcción
mkdir -p build && cd build
# Configurar el proyecto definiendo las rutas a Qt6 y Veyon
cmake ..
# Compilar el módulo (genera internetcontrol.so)
make -j$(nproc)El Master requiere el binario para registrar los nuevos botones en la barra de herramientas.
- Instalación:
sudo cp internetcontrol.so /usr/lib/x86_64-linux-gnu/veyon/
- Registro: Reiniciar el servicio para forzar la lectura de metadatos:
sudo systemctl restart veyon
El cliente requiere el binario para procesar los FeatureMessage recibidos por la red.
- Transferencia:
scp internetcontrol.so admin@IP_ALUMNO:/home/admin/
- Instalación y Limpieza:
ssh admin@IP_ALUMNO "sudo mv /home/admin/internetcontrol.so /usr/lib/x86_64-linux-gnu/veyon/ && \ sudo systemctl restart veyon && \ sudo iptables -F OUTPUT"
Ejecutar el Master en modo debug para confirmar que no hay errores de IID:
veyon-master --debug 2>&1 | grep -i "InternetControl"Éxito: El log debe mostrar el registro de la interfaz FeatureProviderInterface.
En la terminal del alumno, monitorizar el firewall:
sudo watch -n 1 "iptables -L OUTPUT -n -v --line-numbers"| Acción en Master | Resultado Esperado en Cliente |
|---|---|
| Pulsar Bloquear | Aparecen 2 reglas DROP (80, 443). El contador de bytes aumenta al intentar navegar. |
| Pulsar Permitir | La cadena OUTPUT queda vacía. La navegación se restaura al instante. |
- El botón no aparece: Verificar que la macro
Q_PLUGIN_METADATAreside en el archivo.hy que el IID coincide conio.veyon.Veyon.PluginInterface. Asegurarse también de que en el archivo.jsondel plugin se define correctamente bajo la interfaz pertinente. - Error de permisos en iptables: Asegurarse de que el plugin esté implementado en la función
handleFeatureMessageque recibe el parámetroVeyonServerInterface, ya que es el único proceso de Veyon que cuenta con privilegios de root nativos en el sistema huésped. - Reglas duplicadas: Si aparecen múltiples reglas, verificar que la compilación actual incluye la lambda de limpieza con el comando
-Ddeiptables.