
Me complace anunciar la creación de esta útil herramienta (SquidStats), para el análisis y monitoreo de registros de squid. Esta herramienta que es 100% cubana y creada por Manuel Alberto Gorrin (AKA @king_0f_deathhh) nos permite mostrar de forma ordenada y en tiempo real las estadísticas de squid.
SQUIDSTATS nos brinda:
- Análisis de registros en tiempo real: Analiza las conexiones activas de Squid y muestra información detallada.
- Monitoreo de usuarios: Identifica las conexiones por nombre de usuario, URI y tipo de registro.
- Resumen de métricas:
Total de datos leídos y escritos por cada conexión.
Número de solicitudes por conexión.
Uso del pool de retardo. - Panel interactivo: Interfaz clara para una fácil interpretación de los datos.
- Estadísticas de caché de Squid:
Entradas almacenadas.
Capacidad usada y libre.
Tamaño máximo y actual de la caché.
Uso de espacio en disco e inodos.
Antigüedad de los objetos en caché. - Registros de usuarios:
Monitoreo de la actividad del usuario
Visualizaciones atractivas
Filtrado y búsqueda avanzados
Resultados paginados - Gráficos principales:
Actividad de los 20 usuarios principales
Uso de datos de los 20 usuarios principales
Total de usuarios
Total de datos transmitidos
Total de solicitudes
Y más…
En esta entrada les mostrare como instalar esta útil herramienta en nuestros entornos de trabajo.
Si nos remitimos a su repositorio en github podemos observar los requisitos que debemos cumplir para una correcta instalación. Nuestro entorno sera Debian 12 y debemos cumplir los siguientes requisitos:
- Tener instalado Python 3.10 o superior
- Tener corriendo un servidor proxy Squid (obvio no creen)
squidclient
instalado
Comenzaremos averiguando si tenemos python 3 en nuestro sistema:
root@proxy:~# python3 -V Python 3.11.2
Si no nos arroja nada entonces los instalaremos.
apt install python3
El siguiente requisito es estrictamente obligatorio sin él, se mostrarían mal las gráficas y estadísticas de la web. Debemos editar la forma en que nuestro squid crea los logs, para ello agregaremos la siguiente línea en su configuración. Localizamos y editamos el fichero de configuración de squid:
nano /etc/squid/squid.conf Agregamos las siguientes líneas en la parte correspondiente a la configuración de los logs: logformat detailed \ "%ts.%03tu %>a %ui %un [%tl] \"%rm %ru HTTP/%rv\" %>Hs %<st %rm %ru %>a %mt %<a %<rm %Ss/%Sh %<st access_log /var/log/squid/access.log detailed
Con esto lograremos tener una mayor información en los logs para mostrarla en la web. Continuamos clonando el repo de SquidStats.
Creamos la carpeta que contendrá nuestra web de SquidStats. mkdir -p /opt/squidstats git clone https://github.com/kaelthasmanu/SquidStats.git /opt/squidstats
Una vez clonado, pasaremos a instalar los requerimientos de pyhton para el uso de la web. Para ello prepararemos un entorno virtual (venv) para no tener el error error: externally-managed-environment al instalar los requerimientos. Se puede instalar paquetes de Python en todo el sistema, usando apt install python3-xyz, donde xyz es el paquete que intentas instalar. Pero, para hacer más fácil el proceso usaremos pip install xyz. Creamos el entorno virtual así:
mkdir -p "$HOME/py-scripts" && cd "$_" python3 -m venv venv source venv/bin/activate Instalamos pip y/o lo actualizamos python3 -m pip install --upgrade pip
Ahora procedemos a instalar los requerimientos que están en la carpeta que clonamos, con el nombre de requirements.txt
pip install -r /opt/squidstats/requirements.txt
Nos mostraría algo parecido a lo siguiente:
(venv) root@proxy:~/py-scripts# pip install -r /opt/squidstats/requirements.txt Collecting Flask==3.1.0 (from -r /opt/squidstats/requirements.txt (line 1)) Downloading flask-3.1.0-py3-none-any.whl.metadata (2.7 kB) Collecting SQLAlchemy==2.0.39 (from -r /opt/squidstats/requirements.txt (line 2)) Downloading sqlalchemy-2.0.39-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.6 kB) Collecting flask_apscheduler==1.13.1 (from -r /opt/squidstats/requirements.txt (line 3)) Using cached Flask_APScheduler-1.13.1-py3-none-any.whl Collecting python-dotenv==1.0.1 (from -r /opt/squidstats/requirements.txt (line 4)) Downloading python_dotenv-1.0.1-py3-none-any.whl.metadata (23 kB) Collecting Werkzeug>=3.1 (from Flask==3.1.0->-r /opt/squidstats/requirements.txt (line 1)) Downloading werkzeug-3.1.3-py3-none-any.whl.metadata (3.7 kB) Collecting Jinja2>=3.1.2 (from Flask==3.1.0->-r /opt/squidstats/requirements.txt (line 1)) Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB) Collecting itsdangerous>=2.2 (from Flask==3.1.0->-r /opt/squidstats/requirements.txt (line 1)) Downloading itsdangerous-2.2.0-py3-none-any.whl.metadata (1.9 kB) Collecting click>=8.1.3 (from Flask==3.1.0->-r /opt/squidstats/requirements.txt (line 1)) Downloading click-8.1.8-py3-none-any.whl.metadata (2.3 kB) Collecting blinker>=1.9 (from Flask==3.1.0->-r /opt/squidstats/requirements.txt (line 1)) Downloading blinker-1.9.0-py3-none-any.whl.metadata (1.6 kB) Collecting greenlet!=0.4.17 (from SQLAlchemy==2.0.39->-r /opt/squidstats/requirements.txt (line 2)) Downloading greenlet-3.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (4.1 kB) Collecting typing-extensions>=4.6.0 (from SQLAlchemy==2.0.39->-r /opt/squidstats/requirements.txt (line 2)) Downloading typing_extensions-4.13.2-py3-none-any.whl.metadata (3.0 kB) Collecting apscheduler<4.0.0,>=3.2.0 (from flask_apscheduler==1.13.1->-r /opt/squidstats/requirements.txt (line 3)) Downloading APScheduler-3.11.0-py3-none-any.whl.metadata (6.4 kB) Collecting python-dateutil>=2.4.2 (from flask_apscheduler==1.13.1->-r /opt/squidstats/requirements.txt (line 3)) Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB) Collecting tzlocal>=3.0 (from apscheduler<4.0.0,>=3.2.0->flask_apscheduler==1.13.1->-r /opt/squidstats/requirements.txt (line 3)) Downloading tzlocal-5.3.1-py3-none-any.whl.metadata (7.6 kB) Collecting MarkupSafe>=2.0 (from Jinja2>=3.1.2->Flask==3.1.0->-r /opt/squidstats/requirements.txt (line 1)) Downloading MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.0 kB) Collecting six>=1.5 (from python-dateutil>=2.4.2->flask_apscheduler==1.13.1->-r /opt/squidstats/requirements.txt (line 3)) Downloading six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB) Downloading flask-3.1.0-py3-none-any.whl (102 kB) Downloading sqlalchemy-2.0.39-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2/3.2 MB 235.5 kB/s eta 0:00:00 Downloading python_dotenv-1.0.1-py3-none-any.whl (19 kB) Downloading APScheduler-3.11.0-py3-none-any.whl (64 kB) Downloading blinker-1.9.0-py3-none-any.whl (8.5 kB) Downloading click-8.1.8-py3-none-any.whl (98 kB) Downloading greenlet-3.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (583 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 583.9/583.9 kB 241.2 kB/s eta 0:00:00 Downloading itsdangerous-2.2.0-py3-none-any.whl (16 kB) Downloading jinja2-3.1.6-py3-none-any.whl (134 kB) Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB) Downloading typing_extensions-4.13.2-py3-none-any.whl (45 kB) Downloading werkzeug-3.1.3-py3-none-any.whl (224 kB) Downloading MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (23 kB) Downloading six-1.17.0-py2.py3-none-any.whl (11 kB) Downloading tzlocal-5.3.1-py3-none-any.whl (18 kB) Installing collected packages: tzlocal, typing-extensions, six, python-dotenv, MarkupSafe, itsdangerous, greenlet, click, blinker, Werkzeug, SQLAlchemy, python-dateutil, Jinja2, apscheduler, Flask, flask_apscheduler Successfully installed Flask-3.1.0 Jinja2-3.1.6 MarkupSafe-3.0.2 SQLAlchemy-2.0.39 Werkzeug-3.1.3 apscheduler-3.11.0 blinker-1.9.0 click-8.1.8 flask_apscheduler-1.13.1 greenlet-3.2.0 itsdangerous-2.2.0 python-dateutil-2.9.0.post0 python-dotenv-1.0.1 six-1.17.0 typing-extensions-4.13.2 tzlocal-5.3.1
Nota: Nótese el prefijo (venv) delante del promtp esto significa que estamos instalándolo para ese ambiente virtual. La salida de ustedes puede diferir a esta, debido a que poseía algunos paquetes ya instalados.
Finalmente debemos crear nuestro fichero env (enviroment) para la web.
Desactivamos nuestro entorno global usando deactivate Ya no lo necesitamos, ya tenemos todos los requerimientos de pyhton Accedemos al directorio de la web cd /opt/squidstats/ Creamos un fichero .env en la raíz con el siguiente contenido: SQUID_HOST="127.0.0.1" SQUID_PORT=3128 FLASK_DEBUG = "True" SQUID_LOG = "/var/log/squid/access.log" DATABASE = /opt/squidstats/logs.db REFRESH_INTERVAL = 60
Nota: SQUID_PORT es el puerto que está usando su proxy, puede variar. SQUID_LOG es el camino a los logs de squid, también pueden variar. REFRESH_INTERVAL es el tiempo en segundos que demora la web en refrescar la información, en un futuro se podrá cambiar vía web.
Solo resta correr nuestra web:
python3 app.py
Nos mostraría una salida como esta:
root@proxy:/opt/squidstats# python3 app.py 2025-04-21 12:09:25,352 - apscheduler.scheduler - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts * Serving Flask app 'app' * Debug mode: on 2025-04-21 12:09:25,438 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:5000 * Running on http://192.168.10.3:5000 2025-04-21 12:09:25,438 - werkzeug - INFO - Press CTRL+C to quit 2025-04-21 12:09:25,440 - werkzeug - INFO - * Restarting with stat 2025-04-21 12:09:26,087 - apscheduler.scheduler - INFO - Added job "init_scheduler" to job store "default" 2025-04-21 12:09:26,096 - werkzeug - WARNING - * Debugger is active! 2025-04-21 12:09:26,102 - werkzeug - INFO - * Debugger PIN: 128-239-045 2025-04-21 12:09:42,865 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:42] "GET / HTTP/1.1" 200 - 2025-04-21 12:09:42,982 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:42] "GET /static/all.min.css HTTP/1.1" 200 - 2025-04-21 12:09:42,983 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:42] "GET /static/cache.css HTTP/1.1" 200 - 2025-04-21 12:09:42,984 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:42] "GET /static/logs.css HTTP/1.1" 200 - 2025-04-21 12:09:42,984 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:42] "GET /static/styles.css HTTP/1.1" 200 - 2025-04-21 12:09:42,986 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:42] "GET /static/dist/output.css HTTP/1.1" 200 - 2025-04-21 12:09:42,987 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:42] "GET /static/navbar.css HTTP/1.1" 200 - 2025-04-21 12:09:43,169 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:43] "GET /static/webfonts/fa-solid-900.woff2 HTTP/1.1" 200 - 2025-04-21 12:09:43,463 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:43] "GET /actualizar-conexiones HTTP/1.1" 200 - 2025-04-21 12:09:43,465 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:43] "GET /favicon.ico HTTP/1.1" 404 - 2025-04-21 12:09:51,761 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:51] "GET /reports HTTP/1.1" 200 - 2025-04-21 12:09:51,797 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:51] "GET /static/styles.css HTTP/1.1" 304 - 2025-04-21 12:09:51,979 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:51] "GET /static/cache.css HTTP/1.1" 304 - 2025-04-21 12:09:51,981 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:51] "GET /static/dist/output.css HTTP/1.1" 304 - 2025-04-21 12:09:51,982 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:51] "GET /static/logs.css HTTP/1.1" 304 - 2025-04-21 12:09:51,983 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:51] "GET /static/navbar.css HTTP/1.1" 304 - 2025-04-21 12:09:51,984 - werkzeug - INFO - 192.168.36.3 - - [21/Apr/2025 12:09:51] "GET /static/all.min.css HTTP/1.1" 304 - 2025-04-21 12:09:56,088 - apscheduler.executors.default - INFO - Running job "init_scheduler (trigger: interval[0:00:30], next run at: 2025-04-21 12:09:56 CDT)" (scheduled at 2025-04-21 12:09:56.087248-04:00) 2025-04-21 12:09:56,088 - __main__ - INFO - Configurando scheduler para el archivo de log: /var/log/squid/access.log
Como se muestra en su corrida ya podemos acceder a su web. Abrimos en el navegador la siguiente direccion.
http://ip del squidstats:5000
Nota: Las gráficas se irán llenando a medida que vaya analizando los registros con el nuevo formato que le definimos. Es decir que las entradas antiguas no se mostrarán.
Para garantizar que la aplicación se inicie automáticamente cuando se inicia el sistema, tenemos 2 opciones. La primera creando una tarea en el crontab:
Editamos el crontab nano /etc/crontab Agregamos lo siguiente: @reboot root nohup python3 /opt/squidstats/app.py &
La segunda variante y mas robusta creando un servicio:
Creamos el fichero de servicio nano /etc/systemd/system/squidstats.service Agregamos el siguiente contenido [Unit] Description=SquidStats After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/squidstats ExecStart=/opt/squidstats/venv/bin/python /opt/squidstats/app.py Restart=always RestartSec=5 EnvironmentFile=/opt/squidstats/.env [Install] WantedBy=multi-user.target EOF Activamos y corremos el servicio nuevo systemctl daemon-reload systemctl enable squidstats.service systemctl start squidstats.service
Para finalizar, les informo que el creador nos da un script que automatiza toda la instalación, que nos hace todo el trabajo. Se que dirán que porque no comencé por ahí, pero si lo hicera no tendría sentido crear un tutorial. ¿Como podemos usarlo?
Descargamos el script wget https://github.com/kaelthasmanu/SquidStats/releases/download/0.2/install.sh Le damos permiso de ejecución chmod +x install.sh Ejecutamos ./install.sh
Como palabras finales felicitar al colega Manuel Alberto Gorrin por esta maravillosa herramienta que nos ayudara en el día a día de nuestras tareas. Pasen por su github y apoyenlo dándole una estrella a su proyecto. Si desean contribuir en el desarrollo de la misma háganlo saber entrando a nuestro grupo de telegram
Dejar una contestacion