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. Pero primero las dependencias. Asumiendo que ya tenga instalado y configurado apache2, y squid, instale los siguientes paquetes:
sudo apt install -y libcgi-session-perl libgd-gd2-perl
Y el paquete lightsquid:
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
La respuesta corta es que no es un bug, sino una llamada de advertencia, debido a que lightsquid una la biblioteca CGI, que ha sido declarada obsoleta por Perl, que recomienda usar Plack o PSGI, opciones más seguras y actuales. 
La explicación larga la puede encontrar publicada en el Issue del repositorio, pero a la fecha de publicación de este post, no han adoptado la propuesta de corrección y/o actualizado el repo. 
Entonces, ofrecemos una descarga alternativa con las correcciones en el siguiente enlace de nuestro repositorio Gateproxy:
wget https://raw.githubusercontent.com/maravento/gateproxy/master/conf/monitor/lightsquid-1.8.1.tar.gz
Lightsquid trae por defecto un tema llamado "base":
Tema "Base"
Que no es precisamente el más moderno o bonito, pero en nuestra versión, 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";
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.1.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	Cliente1
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
Los reportes se pueden imprimir, en diferentes formatos, desde el botón "HERRAMIENTAS", el cual explicamos abajo en Reportes de Tráfico.
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. 
Para usar un plan de datos, debe tener iptables, que viene incluido en todas distribuciones de linux. Pero ipset no, así que hay que instalarlo:
sudo apt install -y ipset
Y ahora ejecutamos el siguiente script con privilegios. Ejemplo: sudo ./bandata.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
Y programarlo en el cron con una diferencia de segundos con lightsquid:
sudo crontab -l | { cat; echo "*/12 * * * * /path_to/bandata.sh"; } | crontab -
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 en nuestro repositorio Vault, 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: Tenga en cuenta que Lightsquid es un programa muy antiguo y sin soporte, por tanto, se sugiere tener otra fuente de datos sobre el tráfico para constatar.
Reportes de Tráfico
Como mencionamos anteriormente, podemos descargar los reportes en diferentes formatos. Pues otra cosa que puede hacer con este aplicativo es exportar en .csv el reporte "Top Sites", el cual no solo nos brinda la información de los sitios más visitados, sino que se puede crear a partir de este reporte una lista de depuración ACL para ser usada con un proxy, como Squid.
Nota: Una lista de depuración de Squid es una lista de dominios, con formato específico para este proxy, que sirve como base para excluir (whitelist) o incluir (blacklist) dominios, dentro de nuestras listas habituales de control de acceso ACL. Si quiere usar una lista de depuración como ACL para Squid, debe depurar los subdominios, para evitar el error de tipo ".sub.example.com is a subdomain of .example.com". Para mayor información, visite nuestro proyecto Blackweb.
Top Sites
Por ejemplo, presionamos el botón "HERRAMIENTAS" y descargamos el archivo "Reporte de Navegación.csv", y ejecutamos el siguiente comando en la consola:
awk -F',' '{gsub(/"/,"",$3);sub(/:.*/,"",$3);print $3}' "Reporte de Navegación.csv" | sed '/^\./d' | sed -r 's/^(www|ftp|ftps|ftpes|sftp|pop|pop3|smtp|imap|http|https)\.//g' | sed -r '/^[0-9]{1,3}(\.[0-9]{1,3}){3}$/d' | tr -d ' ' | awk '{print "." $1}' | sort -u > salida.txt
Lo que hace este comando es utilizar "awk" para eliminar las comillas y los dos puntos del final del tercer campo del archivo CSV y luego utiliza "sed" para eliminar las líneas que comienzan con un punto. Luego, se utilizan varias expresiones regulares con "sed" para eliminar los protocolos y direcciones IP y dejar solo los nombres de dominio. Finalmente, se utiliza "tr" para eliminar los espacios en blanco y "awk" para agregar un punto al principio de cada línea (obligatorio en Squid), y se utiliza "sort" para eliminar duplicados y escribir el resultado "salida.txt", apto para ser usado en Squid.
Claro que el anterior solo mostrará los dominios TOP. Si quiere todos los dominios visitados de su red local en una sola ACL, apta para depuración Squid, ejecute el siguiente comando, para los mismos propósitos, con una depuración similar al anterior:
find /var/www/lightsquid/report -type f -name '[0-9]*.[0-9]*.[0-9]*.[0-9]*' -exec grep -oE '[[:alnum:]_.-]+\.([[:alnum:]_.-]+)+' {} \; | sed 's/^\.//' | sed -r 's/^(www|ftp|ftps|ftpes|sftp|pop|pop3|smtp|imap|http|https)\.//g' | sed -r '/^[0-9]{1,3}(\.[0-9]{1,3}){3}$/d' | tr -d ' ' | awk '{print "." $1}' | sort -u > salida.txt
Este comando utiliza "find" para buscar todos los archivos (-type f) que se encuentran en el directorio "/var/www/lightsquid/report" y que tengan un nombre que siga el patrón de IPv4 [0-9].[0-9].[0-9].[0-9] (por ejemplo, 192.168.1.1). Luego, utiliza "grep" para buscar en cada uno de estos archivos una cadena que siga el patrón de una dirección IP o un nombre de host (la opción "-oE" indica que sólo se deben mostrar las partes de la cadena que siguen el patrón especificado, el argumento "{}" indica el nombre de cada archivo que se encuentra, y ";" indica que se debe terminar el comando). Luego utiliza "sed" para eliminar el primer carácter (.) de cada línea de la salida del comando anterior (para eliminar el punto que queda después de la dirección IP o el nombre de host). Luego usa "sed -r" para buscar y reemplazar en cada línea todas las ocurrencias de las palabras claves "www, ftp, ftps, "https", y otras, seguidas de un punto (.) y eliminarlas sin reemplazo. Luego, usa "sed -r" para buscar y eliminar todas las líneas que comiencen con una dirección IPv4. Y finalmente elimina espacios en blanco, pone un punto al comienzo de cada línea (formato Squid) y elimina duplicados para mandar todo a "salida.txt"
Puede reemplazar:
sed -r '/^[0-9]{1,3}(\.[0-9]{1,3}){3}$/d'
# o esta:
# grep -vE '^([0-9]{1,3}\.){3}[0-9]{1,3}$'
# Que, como la anterior, elimina las líneas que contienen IPv4 y dejan el resto de las líneas restantes (ej.: 192.168.1.10.midominio.com)
Por esta, que elimina cualquier línea que contenga una dirección IPv4 en cualquier parte de la línea:
sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/d'
Y es todo. Esperamos que les agrade este magnífico programa de monitoreo, que, a pesar de ser 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 descargarlo ingrese a nuestro repositorio Vault
Para lightsquid con Nginx pueden consultarlo AQUÍ.
Para hacer lo mismo con Sarg puede consultarlo AQUI
Con la tecnología de Blogger.