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
A continuación el reporte por dirección IP:
Reporte diario localnet (tema metro)
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
Y el reporte 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
Al igual que hicimos con BandwidthD, las estadísticas generadas por Lightsquid pueden ser altamente provechosas. Por ejemplo, supongamos que queremos crear un "Plan de Datos" para nuestros usuarios de la red local. En este caso, 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. Por defecto, seleccionamos 1 Gigabyte (GB) de datos = 1073741824 byte (B). Hay que aclarar que esta cuota de datos es diaria, 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). En esta versión se excluyen los fines de semana del bloqueo, se incluye el plan para el día y mes y en ambos casos el equipo es bloqueado si sobrepasa los 1GBytes/30GBytes (o la cantidad que haya establecido). También puede usar GBytes en lugar de Bytes, lo cual es más cómodo para el sysadmin, entre otros beneficios.
Lo malo extraño de Lightsquid
Aparte de ser un programa muy antiguo y sin soporte, lo único malo extraño que le hemos encontrado es que a veces no registra la totalidad del volumen de tráfico de datos y los sitios visitados por una dirección IP; asumimos que debe ser algún bug, 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Í.
Con la tecnología de Blogger.