Header Ads

Lightsquid

Hoy traemos otra entrega más de nuestra serie monitor. En el pasado, abordamos algunas de estas herramientas de monitoreo, tales como  Sqstat, Sarg, Nessus, Iptraf-NG, NetHogs, Nmap, Zenmap, xsltproc, NtopNG, NetData, BandwidthD (y faltan un montón, lo cual es imposible abordarlas todas). Y ahora le tocó el turno a  lightsquid.
Antes de comenzar
lightsquid es un aplicativo que trabaja exclusivamente con Squid-Cache, extrayendo de  access.log los datos necesarios para mostrar las estadísticas del tráfico. Por lo anterior, si algunas direcciones IP de su red local no pasan por el Squid, entonces no aparecerán en los reportes.
Instalación
La instalación es sencilla. Si se decide por apt el comando es:
sudo apt install lightsquid
Que instalará la versión 1.8-7, sin embargo, esta versión ya no funciona y fue descontinuada en 2009. Afortunadamente, en 2021, un usuario llamado finisky publicó una actualización con correcciones en GitHub, renombrándola como 1.8.1:
git clone https://github.com/finisky/lightsquid-1.8.1
Sin embargo, aún padece de un bug. En realidad es un "warning" que llena el log de error de apache: 
CGI::param Warning
Ya lo reportamos (incluyendo una propuesta para corregirlo, pero a la fecha de publicación de este post, no ha sido actualizado el repositorio, ya que no estamos 100% seguros de que la corrección sea la adecuada. Entonces, hasta que no se solucione este bug, puede descargar provisionalmente una copia con las correcciones de pruebas en el siguiente enlace de nuestro repositorio Gateproxy:
wget https://raw.githubusercontent.com/maravento/gateproxy/master/conf/monitor/lightsquid-1.8.1.tar.gz
Este programa trae por defecto un tema llamado "base":
Tema "Base"
Que no es precisamente moderno, pero en nuestro enlace, trae por defecto el tema metro (imagen del encabezado del post), cortesía del equipo de sysadmindecuba.com
Una vez descargado, lo descomprimimos:
tar -xf lightsquid-1.8.1.tar.gz
Si quiere regresar al tema base, edite el archivo lightsquid.cfg y elija la línea del tema con el que va a trabajar (base o metro) y la descomenta. Por defecto:
#$templatename        ="base";
$templatename        ="metro_tpl";
Ahora instalamos algunas dependencias:
sudo apt -y install libcgi-session-perl libgd-gd2-perl
Copiamos la carpeta descomprimida al nuevo directorio:
sudo mkdir -p /var/www/lightsquid
sudo cp -f -R lightsquid-1.8.1/* /var/www/lightsquid/
Creamos el virtual host:
sudo touch /etc/apache2/conf-available/lightsquid.conf
Con el siguiente contenido, asumiendo que su red local es de Clase C - RFC 1918 local private network (LAN) y comienza por 192.168. Caso contrario, ajuste el parámetro y guarde cambios:
Alias /lightsquid/ /var/www/lightsquid/
   <Location "/lightsquid/">
   Options +ExecCGI
   AddHandler cgi-script .cgi .pl
   Require local
   # reemplace la dirección IP y mascara por la de su red local
   Require ip 192.168.0.0/24
</Location>
Establecemos los permisos:
sudo chmod -R 775 /var/www/lightsquid/
sudo chown -R www-data:www-data /var/www/lightsquid
sudo chmod +x /var/www/lightsquid/*.{cgi,pl}
Activamos cgid, lightsquid y reiniciamos apache2:
sudo a2enmod cgid && sudo a2enconf lightsquid && sudo systemctl restart apache2.service
Nota: para deshabilitarlos
sudo a2dismod cgid && sudo a2disconf lightsquid && sudo systemctl restart apache2.service
Asumiendo que tenemos Squid funcionando y nuestro archivo access.log tiene registros del tráfico de nuestra red local, ejecutaremos el siguiente comando para generar las primeras estadísticas:
sudo /var/www/lightsquid/lightparser.pl
Para agregar los nombres de host personalizados por IP (o NetBIOS Name):
nano /var/www/lightsquid/realname.cfg
# agregue las IPs con lo nombres de usuarios
192.168.1.1	Router
192.168.1.2	Cliente 1
192.168.1.3	Contador
También puede obtener el NetBIOS Name rastreando la red con nbtscan, pero sin garantías, ya que depende de muchos factores:
sudo apt-get install nbtscan
sudo nbtscan 192.168.1.0/24
Y para excluir direcciones IP del reporte:
nano /var/www/lightsquid/skipuser.cfg
# agregue las IPs a excluir del reporte
192.168.1.1
Algunos Reportes
Por años:
Reporte por años
Por dirección IP:
Reporte Diario localnet
Por sitios visitados de cada IP
Reporte de visitas por IP
Nota: Puede imprimir estos reportes en diferentes formatos, desde el botón "herramientas". 
Finalmente, se recomienda programar en el cron la generación de estadísticas diarias cada 10 minutos (o el tiempo que quiera asignarle), para mantenerlas actualizadas. Ejecute el siguiente comando:
sudo crontab -l | { cat; echo "*/10 * * * * /var/www/lightsquid/lightparser.pl today"; } | crontab -
Plan de Datos
Ahora supongamos el siguiente escenario. Tenemos una red local con 100 usuarios y 20 Mb/s de ancho de banda. No es mucho, así que ponemos un proxy-cache (como Squid) entre los usuarios y la conexión a internet para administrar el tráfico, ponemos una regla pool, para distribuir mejor el ancho de banda y penalizar a aquellos que descargan archivos que sobrepasan X tamaño y algunas otras restricciones; y para ayudar al proxy ponemos un firewall (como iptables). Sin embargo, muchos de los equipos de los usuarios son personales y los sysadmin no pueden meterle la mano debido a las normas de privacidad y confidencialidad y usan Windows 10 y 11, que permiten compartir la conexión de internet con otros dispositivos (smartphones, tablets, cualquier otro equipo, etc.). En este escenario, ya no tenemos 100 equipos si no solo dios sabe cuantos. Aquí es donde entra el plan de datos. 
Al igual que hicimos con BandwidthD, las estadísticas generadas por Lightsquid pueden ser altamente provechosas, en este caso para crear un "Plan de Datos" para nuestros usuarios de la red local. 
Ejecutamos el siguiente script con privilegios. Ejemplo: sudo ./banls.sh:
#!/bin/bash
### GLOBAL ###
iptables=/sbin/iptables
ipset=/sbin/ipset
# modificar esta variable (carpeta donde se guardan las listas de IPs permitidas y denegadas)
acl="path_to/listas"

### bandata ###
# maximum daily data consumption
# 1 gigabyte (GB) datos = 1073741824 byte (B) (ajustar según sus necesidades)
max_bandwidth="1073741824"
# path files
allow_list=$aclroute/allowls.txt
block_list=$aclroute/banls.txt
# create lst if doesn't exist
if [[ ! -f {$allow_list,$block_list} ]]; then touch {$allow_list,$block_list}; fi
# path report
report=/var/www/lightsquid/report/$(date +"%Y%m%d")
# banls
reorganize="sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n"
( cd $report
    # RFC 1918 local private network (LAN) 192.168.* 
    for file in 192.168*
    do
        if (( $(awk <$file '/^total/ {print($2)}') > $max_bandwidth ))
        then echo $file
        fi
    done
) >banout
cat banout | grep -wvf $allow_list | $reorganize | uniq > $block_list

### IPSET FOR banls ### 
$ipset flush bandata
$ipset -N -! bandata hash:net maxelem 1000000
for ip in $(cat "$block_list"); do
    $ipset -A bandata "$ip"
done
$iptables -t mangle -I PREROUTING -m set --match-set bandata src,dst -j DROP
$iptables -I INPUT -m set --match-set bandata src,dst -j DROP
$iptables -I FORWARD -m set --match-set bandata src,dst -j DROP
echo Done
El script anterior hay que definir la variable max_bandwidth con la cantidad de gigas de datos a asignar por usuario de la red local. 
La nomenclatura a usar puede ser en GBytes en lugar de Bytes, lo cual es más cómodo para el sysadmin, por ejemplo 0.5G o 512M o 536870912. Por defecto, seleccionamos 1 Gigabyte (GB) de datos = 1073741824 byte (B). 
Hay que aclarar que esta cuota de datos es diaria en Mbytes o Gbytes (no en Mbps que es velocidad), ya que el script revisa solamente la estadística del día y la dirección IP que supere esta cuota antes de que termine el día, será bloqueada por iptables/ipset y este bloqueo se levantará al comenzar el siguiente día, cuando el contador vuelve a 0. Y no olvide definir el path de las listas y el rango de su red local.
Este script es mucho más amplio (la versión completa puede ser consultada AQUI la cual excluye los fines de semana del bloqueo y se incluye el plan para el día y mes. En ambos casos el equipo es bloqueado si sobrepasa los 1GBytes/30GBytes, o la cantidad que haya establecido). 
Es importante que si establece un valor de Gbytes o Mbytes máximo a consumir por usuario (en el ejemplo del script es "1G" (pero puede ser 512M o 0.5G, etc.), también lo haga en lightsquid para que aparezca la alerta de que algún usuario ha sobrepasado este límite. Para esto debe editar el archivo de configuración:
sudo nano //var/www/lightsquid/lightsquid.cfg
Y modificar la línea "oversize":
#user maximum size per day limit (oversize)
$perusertrafficlimit = 10*1024*1024;
Por defecto viene en 10, que significa 10 Mbytes, por tanto para 512 Mbytes sería 512 y 1 Gbytes sería 1000:
#user maximum size per day limit (oversize)
$perusertrafficlimit = 1000*1024*1024;
Y el resultado es algo similar a lo siguiente:
Alerta por exceder el consumo de datos
Nota: Lightsquid es un programa muy antiguo y sin soporte, por tanto, se sugiere tener otra fuente de datos sobre el tráfico para constatar.
Y es todo. Esperamos que les agrade este magnífico programa de monitoreo, que, a pesar de ser casi un abandonware, tiene lo esencial; al menos para los que no quieren complicarse con aplicativos sofisticados, con ingentes cantidades de datos y que solo quieren conocer el tráfico global y por usuario de su red local, y funciona muy bien en las más recientes distros de Linux (probado en Ubuntu 22.04).
Para lightsquid con Nginx pueden consultarlo AQUÍ.
Para hacer lo mismo con Sarg puede consultarlo AQUI
Con la tecnología de Blogger.