|
Proxy Monitor is a web dashboard for monitoring traffic through Squid-Cache. It integrates Squidmon for real-time traffic monitoring, Squidreports for historical reports on user data usage, frequently visited sites and blocked requests, Logview for viewing logs, and SquidAI for querying them through questions in English or Spanish, among other features. It also includes Bandata, an additional tool for applying daily, weekly and monthly data usage limits, blocking devices that exceed their quotas and redirecting their requests to a warning page. Proxy Monitor runs on Linux with Apache2. Its reports cover only traffic that passes through Squid. |
Proxy Monitor es un panel web para supervisar el tráfico de Squid-Cache. Integra Squidmon para supervisar el tráfico en tiempo real, Squidreports para consultar informes históricos de consumo por usuario, sitios más visitados y solicitudes bloqueadas, Logview para visualizar registros y SquidAI para consultarlos mediante preguntas en español o inglés, entre otras funciones. También cuenta con Bandata, una herramienta adicional para aplicar límites de consumo diarios, semanales y mensuales, bloquear los equipos que superan sus cuotas y redirigir sus solicitudes a una página de aviso. Proxy Monitor funciona en Linux con Apache2. Sus informes incluyen únicamente el tráfico que pasa por Squid. |
Only tested on Ubuntu 24.04/26.04 LTS. Other versions or distributions are not tested and are used at your own risk.
| CPU | RAM | Storage | Dependencies |
|---|---|---|---|
| Intel Core i5/Xeon/AMD Ryzen 5 (≥ 3.0 GHz) | 16 GB | 2 GB SSD | Squid Cache v6.13, Apache v2.4.58, PHP 8.3.6 |
|
• |
• |
# other required packages (checked by pmsetup.sh, no extra setup needed)
apt install -y wget curl git zip unzip ipset nbtscan libcgi-session-perl libgd-perl libjson-xs-perl \
coreutils fonts-lato fonts-liberation fonts-dejavu \
perl cron sudo util-linux iproute2 passwd findutils sed \
grep hostname ncurses-bin systemd libc-bin iptables \
gawk gzip procps logrotate
# squid
apt install -y squid-openssl squid-langpack squid-common squidclient squid-purge
mkdir -p /var/log/squid &>/dev/null
touch /var/log/squid/{access,cache,store,deny}.log &>/dev/null
chown proxy:proxy /var/log/squid/*.log
chmod 640 /var/log/squid/*.log
for cache_type in rock ufs; do
mkdir -p /var/spool/squid/${cache_type} 2>/dev/null
done
chown -R proxy:proxy /var/spool/squid
chmod -R 700 /var/spool/squid
usermod -aG proxy www-data
systemctl enable squid.service
squid -z
cp -f /etc/logrotate.d/squid{,.bak} &>/dev/null
sed -i '/sharedscripts/a \ create 0644 proxy proxy' /etc/logrotate.d/squid
sed -i 's/rotate 2/rotate 7/' /etc/logrotate.d/squid
sed -i -E 's/^([[:space:]]*)(hourly|daily|monthly|yearly)$/\1weekly/' /etc/logrotate.d/squid
# php
apt install -y php libapache2-mod-php php-cli php-curl
# Detect PHP version
if command -v php &>/dev/null; then
PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;" 2>/dev/null)
echo "PHP version detected: $PHP_VERSION"
else
echo "Error: PHP not installed"
exit 1
fi
# Ensure php.ini exists for Apache
if [ ! -f /etc/php/$PHP_VERSION/apache2/php.ini ]; then
if [ -f /etc/php/$PHP_VERSION/cli/php.ini ]; then
mkdir -p /etc/php/$PHP_VERSION/apache2
cp /etc/php/$PHP_VERSION/cli/php.ini /etc/php/$PHP_VERSION/apache2/php.ini
echo "php.ini copied to /etc/php/$PHP_VERSION/apache2/"
else
echo "Error: php.ini not found"
exit 1
fi
fi
cp -f /etc/php/$PHP_VERSION/apache2/php.ini{,.bak} &>/dev/null
sed -i \
-e 's/^\s*;*\s*max_execution_time\s*=.*/max_execution_time = 120/' \
-e 's/^\s*max_input_time\s*=.*/max_input_time = 120/' \
-e 's/^;\s*max_input_time\s*=.*/max_input_time = 120/' \
-e 's/^\s*memory_limit\s*=.*/memory_limit = 1024M/' \
-e 's/^\s*post_max_size\s*=.*/post_max_size = 64M/' \
-e 's/^\s*upload_max_filesize\s*=.*/upload_max_filesize = 64M/' \
-e 's/^\s*;*\s*opcache.memory_consumption\s*=.*/opcache.memory_consumption = 256/' \
-e 's/^\s*;*\s*realpath_cache_size\s*=.*/realpath_cache_size = 16M/' \
/etc/php/$PHP_VERSION/apache2/php.ini
# apache
apt install -y apache2 apache2-doc apache2-utils apache2-dev \
apache2-suexec-pristine libaprutil1t64 libaprutil1-dev \
libtest-fatal-perl
systemctl enable apache2.service
apt -qq install -y --reinstall apache2-doc
cp -f /etc/apache2/mods-available/mpm_prefork.conf{,.bak} &>/dev/null
sed -i \
-e 's/^\(StartServers[[:space:]]*\)5/\110/' \
-e 's/^\(MinSpareServers[[:space:]]*\)5/\110/' \
-e 's/^\(MaxSpareServers[[:space:]]*\)10/\115/' \
-e 's/^\(MaxRequestWorkers[[:space:]]*\)150/\1200/' \
-e 's/^\(MaxConnectionsPerChild[[:space:]]*\)0/\11000/' \
/etc/apache2/mods-available/mpm_prefork.conf
# Enable modules
a2dismod -q mpm_event || true
a2enmod -q mpm_prefork || true
a2enmod -q php || trueproxymon/
├── modules/ # Web content served from /var/www/proxymon
│ ├── logview/ # Logview: Log and Live views for access logs and active requests
│ ├── squidai/ # AI: conversational assistant
│ ├── squidmon/ # Monitor: real-time traffic and ACL analysis
│ ├── squidreports/ # Reports: daily traffic reports
│ ├── warning/ # Captive portal warning page
│ └── index.html # Main page with the module tabs
├── config/ # Root-only files, installed to /etc/proxymon
│ ├── bandata/ # Data usage control (bandata.sh and its ACLs)
│ ├── tools/ # Maintenance scripts
│ │ ├── pmbk.sh # Backup tool
│ │ ├── proxymonenv.sh # Shared configuration reader; sourced, not executed
│ │ └── squidtool.sh # Log search and traffic reports
│ ├── squid/ # squid.conf template, deployed only on a fresh Squid
│ └── web/ # Apache vhosts, installed to sites-available
└── pmsetup.sh # Installer: install, update, uninstall
git clone --depth=1 https://github.com/maravento/proxymon.git
cd proxymon
# Install
sudo bash pmsetup.sh --install
# Update
sudo bash pmsetup.sh --update
# Uninstall
sudo bash pmsetup.sh --uninstall
# Interactive menu
sudo bash pmsetup.sh
# Help
sudo bash pmsetup.sh --help # or -h| Command | Description | Descripción |
|---|---|---|
sudo ./pmsetup.sh |
Opens the interactive menu with options to install, update, uninstall or exit. | Abre el menú interactivo con opciones para instalar, actualizar, desinstalar o salir. |
sudo ./pmsetup.sh --install |
Installs and configures Proxy Monitor, including Apache rules, proxymon.env, ACL lists, Apache and PHP settings, and scheduled tasks. Stops if the configured WEB_ROOT already exists; use --update or --uninstall in that case. |
Instala y configura Proxy Monitor, incluidas las reglas de Apache, proxymon.env, las listas ACL, los ajustes de Apache y PHP y las tareas programadas. Se detiene si el directorio configurado en WEB_ROOT ya existe; en ese caso, use --update o --uninstall. |
sudo ./pmsetup.sh --update |
Updates code and permissions without prompting for input. Preserves configuration and operational data. | Actualiza el código y los permisos sin solicitar datos. Conserva la configuración y los datos de operación. |
sudo ./pmsetup.sh --uninstall |
Requests confirmation before uninstalling Proxy Monitor. | Solicita confirmación antes de desinstalar Proxy Monitor. |
sudo ./pmsetup.sh -h / sudo ./pmsetup.sh --help |
Displays help with the available installer options. | Muestra la ayuda con las opciones disponibles del instalador. |
Traffic that bypasses Squid does not appear in its reports. The results in Squidmon Search and Traffic Search are examples. Actual results vary with your environment, the amount of log history, and the resources available to process ACLs.
El tráfico que no pase por Squid no aparecerá en sus informes. Los resultados de Squidmon Search y Traffic Search son ejemplos. Los resultados reales dependen del entorno, la cantidad de registros históricos y los recursos disponibles para procesar las ACL.
| SCOPE | ALCANCE |
|---|---|
|
|
| OUT OF SCOPE | FUERA DE ALCANCE |
|
|
| Description | Descripción |
|---|---|
• update updates the web content under WEB_ROOT, the root scripts under CONFIG_DIR and their permissions.• Preserves PHP configuration, ACL lists and both configuration files ( proxymon.env and the LLM .env) unchanged. Applies these values to Apache paths, Listen directives and the parser, Bandata and backup cron entries; retains other virtualhost directives.• Stops Apache, creates a backup with pmbk.sh, replaces the code and restarts Apache.• Application code and its directories are owned by root; preserved data and configuration retain their ownership.• Does not change the ownership or permissions of the shared /var/www directory.• Rejects symbolic links in code directories and replaces code files without following destination links. • The copy excludes the preserved files and directories listed below. |
• update actualiza el contenido web de WEB_ROOT, los scripts ejecutados como root de CONFIG_DIR y sus permisos.• Conserva la configuración de PHP, las listas ACL y ambos archivos de configuración ( proxymon.env y .env del LLM) sin modificaciones. Aplica estos valores a las rutas de Apache, sus directivas Listen y las entradas de cron del parser, Bandata y copias; mantiene las demás directivas de los virtualhosts.• Detiene Apache, crea una copia de seguridad con pmbk.sh, reemplaza el código y vuelve a iniciar Apache.• El código de la aplicación y sus directorios pertenecen a root; los datos y la configuración preservados conservan sus propietarios.• No cambia el propietario ni los permisos del directorio compartido /var/www.• Rechaza enlaces simbólicos en directorios de código y reemplaza archivos de código sin seguir enlaces de destino. • La copia excluye los archivos y directorios preservados que se enumeran a continuación. |
| Path | Description | Descripción |
|---|---|---|
squidreports/report |
Daily Squidreports reports | Informes diarios de Squidreports |
squidreports/reportstats |
Additional statistics; preserved by update and included in the pmbk.sh backup |
Estadísticas adicionales; conservadas por update e incluidas en la copia de pmbk.sh |
squidreports/realname.cfg |
Hostname mappings | Correspondencia entre IP y nombres de equipo |
squidreports/skipuser.cfg |
Excluded users | Usuarios excluidos |
squidreports/squidreports.cfg |
Squidreports configuration | Configuración de Squidreports |
squidreports/group.cfg |
User groups | Grupos de usuarios |
squidmon/etc/config |
Squidmon configuration file | Archivo de configuración de Squidmon |
warning/warning.html |
Captive portal warning page | Página de aviso del portal cautivo |
/etc/proxymon/bandata/acl |
Bandata quota lists | Listas de cuota de Bandata |
⚠️ WARNING -- Update interruptions: Do not interrupt an update with Ctrl-C. Apache remains stopped during the process. The installer attempts to restart it on exit, but an interruption may leave the service stopped and the update incomplete. If it happens, start Apache withsudo systemctl start apache2and run the update again.
⚠️ WARNING -- Update interruptions: No interrumpa una actualización con Ctrl-C. Apache permanece detenido durante el proceso. El instalador intenta iniciarlo al salir, pero una interrupción puede dejar el servicio detenido y la actualización incompleta. Si ocurre, inicie Apache consudo systemctl start apache2y repita la actualización.
| Description | Descripción |
|---|---|
Uninstall preserves the shared ACL directory (ACL_PATH, /etc/acl by default). It does not offer to delete it. |
La desinstalación conserva el directorio compartido de ACL (ACL_PATH, /etc/acl por defecto). No ofrece eliminarlo. |
| After uninstalling, restart the computer to clear any remaining temporary Bandata rules. | Después de desinstalar, reinicie el equipo para eliminar las reglas temporales de Bandata restantes. |
Access Proxymon: http://localhost:18080
Warning for Bandata: http://SERVER_IP:18081
| Description | Descripción |
|---|---|
Keys are grouped by use: General, Network, Squid, ACL, Squidreports, Squidmon, SquidAI, Squidtool, Bandata and Backup. Installation generates this layout; update leaves .env unchanged. All keys precede the final separator.• pmsetup.sh creates /etc/proxymon/proxymon.env during installation.• It provides shared settings for bandata.sh, squidtool.sh, logview/api.php, logview/connections.php, squidai/worker.php, Squidreports, Squidmon and pmbk.sh.• Installation generates the keys. Existing configuration files must be adjusted manually when new keys are needed. • The update option preserves its existing values. |
Las claves se agrupan por uso: General, Network, Squid, ACL, Squidreports, Squidmon, SquidAI, Squidtool, Bandata y Backup. La instalación genera esta estructura; update conserva .env sin modificaciones. Todas las claves preceden al separador final.• pmsetup.sh crea /etc/proxymon/proxymon.env durante la instalación.• Contiene la configuración compartida que utilizan bandata.sh, squidtool.sh, logview/api.php, logview/connections.php, squidai/worker.php, Squidreports, Squidmon y pmbk.sh.• La instalación genera las claves. Los archivos de configuración existentes deben ajustarse manualmente cuando se necesitan claves nuevas. • La opción update conserva sus valores existentes. |
| Variable | Read by | Description | Descripción |
|---|---|---|---|
WEB_ROOT, CONFIG_DIR |
pmsetup.sh, pmbk.sh |
Web application and root-script directories. Defaults: /var/www/proxymon and /etc/proxymon. |
Directorios de la aplicación web y los scripts de root. Valores iniciales: /var/www/proxymon y /etc/proxymon. |
PANEL_PORT, WARNING_PORT |
pmsetup.sh, squidtool.sh, worker.php, bandata.sh |
Panel and warning ports. Defaults: 18080 and 18081. Apache keeps the panel on loopback and the warning page on SERVER_IP. |
Puertos del panel y los avisos. Valores iniciales: 18080 y 18081. Apache mantiene el panel en localhost y los avisos en SERVER_IP. |
PANEL_DOMAINS |
worker.php |
Public HTTPS panel domains accepted by SquidAI, separated by commas. Empty by default: only local panel origins are allowed. Use bare domains, without a scheme, port or path, for example proxy.example.com. See the SquidAI section. |
Dominios públicos HTTPS del panel admitidos por SquidAI, separados por comas. Vacío por defecto: solo se autorizan los orígenes locales del panel. Escriba dominios sin esquema, puerto ni ruta, por ejemplo proxy.example.com. Ver la sección SquidAI. |
BACKUP_DIR |
pmbk.sh |
Backup destination. Default: /etc/bak/proxymon. Changing this default is not recommended. |
Destino de las copias de seguridad. Valor inicial: /etc/bak/proxymon. No se recomienda modificar este valor. |
TOOL_REPORT_DIR |
pmsetup.sh, squidtool.sh, pmbk.sh |
Directory for generated traffic and log-search HTML reports, served through Apache's Squidtool alias. | Directorio de informes HTML de tráfico y búsqueda, publicado mediante el alias Squidtool de Apache. |
SQUIDTOOL_MIN_HITS |
squidtool.sh |
Minimum requests per row in traffic reports without an IP filter. Default: 20, written automatically without a prompt. Changing this default is not recommended. Reports for one IP show all rows. Accepts nonnegative integers without leading zeros. |
Mínimo de solicitudes por fila en informes de tráfico sin filtro de IP. Valor inicial: 20, escrito automáticamente sin preguntas. No se recomienda modificar este valor. Los informes de una IP muestran todas las filas. Acepta enteros no negativos sin ceros iniciales. |
SQUIDTOOL_ALERT_THRESHOLD |
squidtool.sh |
Request threshold for highlighting and counting traffic rows as alerts. Default: 300, written automatically without a prompt. Changing this default is not recommended. Accepts nonnegative integers without leading zeros. |
Umbral de solicitudes para resaltar y contar filas de tráfico como alertas. Valor inicial: 300, escrito automáticamente sin preguntas. No se recomienda modificar este valor. Acepta enteros no negativos sin ceros iniciales. |
SQUIDMON_CONFIG |
pmsetup.sh, Squidmon, pmbk.sh |
Squidmon settings file. Its log source comes from SQUID_LOG_FILE. |
Archivo de configuración de Squidmon. Su registro de origen proviene de SQUID_LOG_FILE. |
LLM_ENV_FILE |
pmsetup.sh, worker.php, pmbk.sh |
SquidAI credential file. Default: /etc/proxymon/.env. |
Archivo de credenciales de SquidAI. Valor inicial: /etc/proxymon/.env. |
REPORT_STATS_PATH |
pmsetup.sh, Squidreports, SquidAI, pmbk.sh |
Additional Detail and Analyze statistics. Default: the original report directory followed by stats. Remains separate from Bandata's original reports. |
Estadísticas adicionales de Detail y Analyze. Valor inicial: directorio de informes originales seguido de stats. Permanece separado de los informes originales utilizados por Bandata. |
LAN |
bandata.sh |
LAN interface the quota rules apply to | Interfaz LAN a la que se aplican las reglas de cuota |
SERVER_IP |
pmsetup.sh, worker.php |
Server's own IPv4; excluded from the reports | IPv4 del servidor; se excluye de los informes |
RANGE |
pmsetup.sh, squidreports.pl, analytics.cgi |
LAN network in CIDR notation. Used by Analyze and regenerated subnet statistics. Unmatched addresses remain individual. Missing, empty or invalid values stop these consumers. Does not configure Apache access. | Red LAN en formato CIDR. La utilizan Analyze y las estadísticas por subred regeneradas. Las direcciones sin coincidencia permanecen individuales. Un valor ausente, vacío o inválido detiene estos consumidores. No configura el acceso de Apache. |
REPORT_IP_GLOB |
bandata.sh |
Glob that matches the client IPs inside a Squidreports report | Patrón de nombres de archivo que selecciona las IP de cliente en los informes de Squidreports |
SQUIDREPORTS_DIR |
bandata.sh, Squidreports |
Squidreports installation directory | Directorio de instalación de Squidreports |
REPORT_PATH |
bandata.sh, worker.php, Squidreports, pmbk.sh |
Directory holding the daily Squidreports reports | Directorio con los informes diarios de Squidreports |
REALNAME_CFG, SKIPUSERS_CFG |
bandata.sh, worker.php, Squidreports |
Squidreports hostname mappings and excluded-user list | Correspondencia entre IP y nombres de equipo, y lista de usuarios excluidos de Squidreports |
ACL_PATH, ACL_MAC_PATH, ACL_SQUID_PATH |
pmsetup.sh, bandata.sh, worker.php |
ACL tree shared with the other projects on the host, and its MAC and Squid branches | Árbol de ACL compartido con los otros proyectos del host, y sus ramas MAC y Squid |
ACL_BANDATA_PATH |
bandata.sh |
Directory holding Bandata's own quota lists | Directorio con las listas de cuota propias de Bandata |
ALLOW_LIST |
bandata.sh |
allowdata.txt: IPs exempt from every quota. This is the only Bandata ACL the administrator edits, manually on the server. The web interface does not provide an editor. |
allowdata.txt: IP exentas de toda cuota. Es la única ACL de Bandata que edita el administrador, manualmente en el servidor. La interfaz web no permite editarla. |
BLOCK_LIST_DAY, BLOCK_LIST_WEEK, BLOCK_LIST_MONTH |
bandata.sh |
banday.txt, banweek.txt and banmonth.txt: block lists managed automatically by Bandata. Do not edit them manually; the web interface does not provide an editor. |
banday.txt, banweek.txt y banmonth.txt: listas de bloqueo administradas automáticamente por Bandata. No deben editarse manualmente; la interfaz web no permite editarlas. |
SQUID_LOG_DIR, SQUID_LOG_FILE |
pmsetup.sh, squidtool.sh, api.php, worker.php, Squidreports, Squidmon |
Squid log directory and access.log path |
Directorio de logs de Squid y ruta de access.log |
SQUID_MGR_HOST, SQUID_MGR_PORT |
connections.php |
Where Squid's cache manager answers; Logview reads the requests in flight from it. SQUID_MGR_PORT defaults to 3128 and is shared with other projects |
Dirección y puerto del administrador de caché de Squid; Logview consulta allí las solicitudes en curso. SQUID_MGR_PORT tiene valor inicial 3128 y se comparte con otros proyectos |
SQUID_INTERCEPT_PORT |
Other projects | Squid intercept port, default 3129. Shared key for other projects. |
Puerto transparente de Squid, valor inicial 3129. Clave compartida para otros proyectos. |
SQUID_MGR_PASSWD |
connections.php |
Empty by default. Set it only if squid.conf declares cachemgr_passwd mypassword all, and use the very same value |
Vacía de forma predeterminada. Defínala únicamente si squid.conf declara cachemgr_passwd mipassword all, y utilice el mismo valor |
WARNING_HTML |
bandata.sh |
Captive portal page where Bandata writes the current quota values | Página del portal cautivo donde Bandata escribe los valores de cuota vigentes |
CACHE_PATH |
pmsetup.sh, worker.php |
SquidAI cache directory, owned by www-data with mode 750 |
Directorio de caché de SquidAI, propiedad de www-data con permisos 750 |
MAX_BANDWIDTH_DAY, MAX_BANDWIDTH_WEEK, MAX_BANDWIDTH_MONTH |
bandata.sh |
The three quota limits; see Bandata below | Los tres límites de cuota; consulte Bandata |
BANDATA_HOTSPOT, HOTSPOT_PATH |
bandata.sh |
Whether a UniFi hotspot is in use, and where its files live | Si hay un hotspot UniFi en uso, y la ubicación de sus archivos |
UPDATE_REALNAME |
bandata.sh |
Whether Bandata refreshes Squidreports' names, exclusions and ACL groups on each run | Indica si Bandata actualiza los nombres, exclusiones y grupos por ACL de Squidreports en cada ejecución |
⚠️ WARNING -- Configuration defaults: Changing the default values inproxymon.envis at the sysadmin's own risk.
⚠️ WARNING -- Configuration defaults: El administrador del sistema cambia los valores predeterminados deproxymon.envbajo su propia responsabilidad.
| Description | Descripción |
|---|---|
• The installer establishes paths and ports in proxymon.env. Runtime modules read these settings; legacy paths in preserved squidreports.cfg files no longer override them. Configure Squidmon's log source through SQUID_LOG_FILE; its form displays this value read-only.• Run pmsetup.sh --update after changing ports to apply Apache's configuration. Changing a data path does not move existing files: relocate the data and retain its permissions before using the new path. pmbk.sh backs up the configured original reports and additional statistics.• /etc/proxymon/proxymon.env remains the fixed configuration entry point. Installation defaults are declared by the installer. Project-relative library paths and operating-system paths remain independent of environment settings.• The installation sets two fixed Squid ports: 3128 for the cache and 3129 for intercept. SQUID_MGR_PORT and SQUID_INTERCEPT_PORT record these values; they do not configure Squid. To change a port, edit proxymon.env and squid.conf with the same value. |
• El instalador establece las rutas y los puertos en proxymon.env. Los módulos leen estos valores; las rutas antiguas de archivos squidreports.cfg preservados ya no los reemplazan. Configure el registro de Squidmon mediante SQUID_LOG_FILE; su formulario muestra este valor sin permitir editarlo.• Ejecute pmsetup.sh --update después de cambiar puertos para aplicar la configuración de Apache. Cambiar una ruta de datos no mueve los archivos existentes: traslade los datos y conserve sus permisos antes de utilizar la nueva ruta. pmbk.sh respalda los informes originales y las estadísticas adicionales configurados.• /etc/proxymon/proxymon.env permanece como punto fijo de entrada a la configuración. El instalador declara los valores iniciales de instalación. Las rutas relativas de bibliotecas y las rutas del sistema operativo permanecen independientes de la configuración del entorno.• La instalación fija dos puertos de Squid: 3128 para la caché y 3129 para intercept. SQUID_MGR_PORT y SQUID_INTERCEPT_PORT registran estos valores; no configuran Squid. Para cambiar un puerto, edite proxymon.env y squid.conf con el mismo valor. |
LLM_ENV_FILEpoints to a second file,.envby default, with the SquidAI credentialsLLM_URL,LLM_API_KEY,LLM_MODELandLLM_RESPONSE_FORMAT. The installer creates this file only if absent, using a template embedded inpmsetup.sh. Existing content is preserved. See API Configuration.
LLM_ENV_FILEindica un segundo archivo,.envpor defecto, con las credenciales de SquidAILLM_URL,LLM_API_KEY,LLM_MODELyLLM_RESPONSE_FORMAT. El instalador crea este archivo únicamente si no existe, utilizando una plantilla incluida enpmsetup.sh. Conserva el contenido existente. Ver «API Configuration».
| Description | Descripción |
|---|---|
Shared Bash file installed at CONFIG_DIR/tools/proxymonenv.sh. It is loaded automatically with source by pmsetup.sh, bandata.sh, squidtool.sh and pmbk.sh. Do not run it separately or schedule it in cron.Provides load_proxymon_env to read general configuration from proxymon.env, resolve references between keys and check the file owner and permissions. It does not modify configuration files or load the LLM credentials file. |
Archivo Bash compartido instalado en CONFIG_DIR/tools/proxymonenv.sh. Lo cargan automáticamente mediante source los scripts pmsetup.sh, bandata.sh, squidtool.sh y pmbk.sh. No se ejecuta por separado ni se programa en cron.Proporciona load_proxymon_env para leer la configuración general de proxymon.env, resolver referencias entre claves y comprobar el propietario y los permisos del archivo. No modifica archivos de configuración ni carga el archivo de credenciales del LLM. |
Each module reads the Squid log according to what it does, so their historical coverage differs. The retention on disk is set by rotate in /etc/logrotate.d/squid, which the installer sets to seven weekly rotations.
|
Cada módulo lee el registro de Squid según su función, así que su cobertura histórica es distinta. La retención en disco la define rotate en /etc/logrotate.d/squid, que el instalador fija en siete rotaciones semanales.
|
| Module | Reads | Lee | Coverage / Cobertura |
|---|---|---|---|
| Squidmon | access.log |
access.log |
Recent activity / Actividad reciente |
| Logview | access.log |
access.log |
Recent activity / Actividad reciente |
| SquidAI | Squidreports reports, access.log and access.log.1 |
Informes de Squidreports, access.log y access.log.1 |
Full history by report, two weeks by log / Histórico completo por informe, dos semanas por registro |
squidtool.sh |
access.log and every rotated file |
access.log y todos los rotados |
Full retention / Retención completa |
| Monitor (Squidmon) monitors Squid traffic in real time. It shows blocked domains and clients, traffic patterns, and ACL matches. Filter the activity to generate reports on network traffic and blocked content. | Monitor (Squidmon) ofrece análisis del tráfico de Squid en tiempo real. Muestra estadísticas sobre dominios y clientes bloqueados, patrones de tráfico y coincidencias con las ACL. También permite filtrar la actividad y generar informes detallados sobre el tráfico de red y el contenido bloqueado. |
| This section defines the parameters that Squidmon uses to interpret and display network activity, including data sources (access control lists —ACLs—), the maximum number of lines to analyze from the Squid log, the time range of the data, and the automatic refresh interval. Each list is declared with its full path, one per line, and the module reads exactly that path: it never searches any directory. The default entries are: | Aquí se configuran los parámetros que Squidmon usa para mostrar la actividad de la red: las listas de control de acceso (ACL), el máximo de líneas del registro de Squid que se analizarán, el período de consulta y el intervalo de actualización. Cada lista se declara con su ruta completa, una por línea. El módulo lee esa ruta y no busca en ningún directorio. Estas son las entradas predeterminadas: |
/etc/acl/squid/blocktlds.txt=Blocked TLD
/etc/acl/squid/blockdomains.txt=Blocked Sites
regex:^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(:\d+)?(?=[/?#]|$)=Block IPv4
regex:(adlinkfly|announce\.php\?passkey=|info_hash|iptv|jndi:|mtc[0-9]|\.onion|peer_id=|porn|psiphon|torrent|ultrasurf)=Blocked Patterns| Description | Descripción |
|---|---|
To change the lists, enter each full path in the Config section, one per line, followed by = and its label. Squidmon opens exactly that path and searches no directory. If you move a list, edit its line in Config. |
Para cambiar las listas, indique en la sección Config la ruta completa de cada archivo, una por línea, seguida de = y su etiqueta. Squidmon abre esa ruta y no busca en ninguna carpeta. Si cambia la ubicación de una lista, actualice su entrada en Config. |
sudo nano /etc/proxymon/proxymon.env
# path to ACLs folder
ACL_PATH=/etc/acl| Description | Descripción |
|---|---|
For a rule to block traffic, it must be defined in both Squidmon configuration and squid.conf. Here is an example using the default ACLs: |
Para que una regla bloquee tráfico, debe estar definida tanto en la configuración de Squidmon como en squid.conf. Este es un ejemplo con las ACL predeterminadas: |
sudo nano /etc/squid/squid.conf
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
include /etc/squid/conf.d/*.conf
# Block: TLDs
acl blocktlds dstdomain "/etc/acl/squid/blocktlds.txt"
http_access deny workdays blocktlds
# Block: domains
acl blockdomains dstdomain "/etc/acl/squid/blockdomains.txt"
http_access deny workdays blockdomains
# Block: patterns
acl blockpatterns dstdomain "/etc/acl/squid/blockpatterns.txt"
http_access deny workdays blockpatterns
⚠️ WARNING -- Search resource usage: Default values are 24 hours and 50,000 lines from access.log. Increasing these values may slow down the module and raise system resource usage. Refer to the Squidmon Search section. To reset the filters to their default values, press the Reset to Default button.
⚠️ WARNING -- Search resource usage: Los valores predeterminados son 24 horas y 50 000 líneas de access.log. Si los aumenta, el módulo podría tardar más y consumir más recursos. Consulte la sección Squidmon Search. Para restablecer los valores iniciales, pulse Reset to Default.
| Description | Descripción |
|---|---|
| Top Blocked Domains: Shows the domains Squid blocks most often, along with the port and number of blocked requests. This helps identify frequently blocked sites or services and adjust access rules. | Top Blocked Domains: Muestra los dominios que Squid bloquea con mayor frecuencia, junto con el puerto y el número de solicitudes bloqueadas. Esta información ayuda a identificar qué sitios o servicios se bloquean más y a ajustar las reglas de acceso. |
| Top Blocked Clients: Shows the client IP addresses with the most blocked requests. Each row includes the total number of requests, how many were blocked, and the percentage they represent. This helps identify clients that often try to access restricted content and may need follow-up. | Top Blocked Clients: Muestra las IP de los clientes con más solicitudes bloqueadas. Cada fila incluye el total de solicitudes, cuántas se bloquearon y qué porcentaje representan. Esta información permite identificar equipos que requieren seguimiento por sus intentos de acceso a contenido restringido. |
| Description | Descripción |
|---|---|
| • Expand a client IP to view its traffic statistics, including total, blocked and allowed requests. • Filter by ACL, search for IP addresses or domains, and select a period of 24 hours, 7 days or 30 days. • Generate a PDF report for each client. |
• Despliegue una IP para consultar el total de solicitudes y cuántas fueron bloqueadas o permitidas. • Filtre por ACL, busque IP o dominios y seleccione períodos de 24 horas, 7 días o 30 días. • Genere un informe PDF para cada cliente. |
| Description | Descripción |
|---|---|
• Squidmon classifies traffic using ACLs (Access Control Lists), such as Blocked TLD, Blocked Sites, Blocked Patterns, Block IPv4 and Unknown ACL. The last one covers rules defined in squid.conf that are not among the ACLs listed in Config.• Search by IP address or domain, and filter to show only blocked or only allowed traffic. • Select Clean Filters to clear the filters. |
• Squidmon clasifica el tráfico según las ACL, como Blocked TLD, Blocked Sites, Blocked Patterns, Block IPv4 y Unknown ACL. Esta última agrupa las reglas de squid.conf que no aparecen en la sección Config.• Busque por IP o dominio y filtre para ver solo el tráfico bloqueado o solo el permitido. • Pulse Clean Filters para borrar los filtros. |
| Description | Descripción |
|---|---|
| • Generate PDF traffic reports. • Select the last 24 hours, 7 days or 30 days. You can also generate a report for a client or domain. • The Generate PDF Report button appears in the interface. |
• Genere informes PDF de tráfico. • Seleccione las últimas 24 horas, los últimos 7 días o los últimos 30 días. También puede generar un informe para un cliente o dominio. • El botón Generate PDF Report aparece en la interfaz. |
| Description | Descripción |
|---|---|
| Expand a client IP to see the blocked URLs, the matching ACL rule (for example, Blocked Sites), and how many times each URL was requested. This helps identify browsing patterns and adjust access rules. | Al desplegar una IP, puede consultar las URL bloqueadas, la regla de ACL que coincidió —por ejemplo, Blocked Sites— y cuántas veces se solicitó cada URL. Estos datos ayudan a reconocer patrones de navegación y ajustar las reglas de acceso. |
| Description | Descripción |
|---|---|
If a Squid ACL uses url_regex, Squidmon cannot read it from a file. Enter the expression directly in the module's Config section, as shown here: |
Si una ACL de Squid usa url_regex, Squidmon no puede leerla desde un archivo. Copie su expresión directamente en la sección Config del módulo, como en este ejemplo: |
regex:(adlinkfly|announce\.php\?passkey=|info_hash|iptv|jndi:|mtc[0-9]|\.onion|peer_id=|porn|psiphon|torrent|ultrasurf)=Blocked Patterns
regex:^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(:\d+)?(?=[/?#]|$)=Block IPv4| Description | Descripción |
|---|---|
| • Result: 6 clients found in 0.08 seconds. Client IP-based filtering with domain resolution. • Data source: Squid access logs, /var/log/squid/access.log.• Search method: Real-time log parsing with ACL filtering. • Use case: Real-time client activity, immediate threat detection. |
• Resultado: 6 clientes encontrados en 0,08 s. Filtrado basado en IP del cliente con resolución de dominio. • Fuente de datos: Registros de acceso de Squid, /var/log/squid/access.log.• Método de búsqueda: Análisis de registros en tiempo real con filtrado ACL. • Caso de uso: Actividad de cliente en tiempo real, detección inmediata de amenazas. |
| Description | Descripción |
|---|---|
• Squidmon reads only the current access.log; it does not process rotated files. The same applies to Logview. SquidAI also reads the uncompressed rotated files (access.log.1, access.log.2, ...), but never the compressed .gz ones.• Rotation in Proxymon is weekly. A rotation leaves access.log empty, so Squidmon and Logview lose the hours that moved to the rotated file. Weekly limits that gap to one day out of seven.• Rotation always happens at 00:00, imposed by the logrotate timer. Do not configure size or maxsize: those split the current day, and Squidreports rebuilds each day from a single file.• The installer also adds a prerotate hook to /etc/logrotate.d/squid. It closes the previous day's report before access.log is rotated. When that file already defines its own prerotate, the installer reports it and leaves it untouched.• Disable Squid's internal rotation with logfile_rotate 0.• In /etc/logrotate.d/squid, you can keep seven rotations with rotate 7. |
• Squidmon solo lee el access.log actual; no procesa los archivos rotados. Lo mismo ocurre con Logview. SquidAI lee además los rotados sin comprimir (access.log.1, access.log.2, ...), pero nunca los comprimidos .gz.• La rotación en Proxymon es semanal. Una rotación deja vacío el access.log, por lo que Squidmon y Logview pierden las horas que pasaron al archivo rotado. La frecuencia semanal limita ese hueco a un día de cada siete.• La rotación ocurre siempre a las 00:00, impuesta por el temporizador de logrotate. No configure size ni maxsize: parten el día en curso, y Squidreports reconstruye cada día a partir de un solo archivo.• El instalador añade además un bloque prerotate a /etc/logrotate.d/squid. Cierra el informe del día anterior antes de rotar access.log. Si ese archivo ya define su propio prerotate, el instalador lo informa y no lo modifica.• Desactive la rotación interna de Squid con logfile_rotate 0.• En /etc/logrotate.d/squid, puede conservar siete rotaciones con rotate 7. |
# Disable Squid internal rotation
sudo nano /etc/squid/squid.conf
# TAG: logfile_rotate
logfile_rotate 0
# Logrotate (pmsetup.sh already sets weekly; this only restores it)
sudo sed -i -E 's/^([[:space:]]*)(hourly|daily|monthly|yearly)$/\1weekly/' /etc/logrotate.d/squid
# Optional:
sudo sed -i 's/rotate 2/rotate 7/' /etc/logrotate.d/squid| Description | Descripción |
|---|---|
Squidreports parses access.log and writes one folder per day under /var/www/proxymon/squidreports/report/. The daily view provides user details, top sites, large downloads and the additional reports described below. |
Squidreports analiza access.log y escribe una carpeta por día en /var/www/proxymon/squidreports/report/. La vista diaria permite consultar detalles por usuario, sitios más visitados, descargas grandes y los informes adicionales descritos a continuación. |
| The first time you open Reports, reports may not be available yet. This happens if they have not been generated or your network traffic has not passed through Squid. The installer attempts to generate the initial report; if it does not appear, run this command: | La primera vez que abra Reports, puede que todavía no haya informes. Esto ocurre si aún no se han generado o si el tráfico de la red no ha pasado por Squid. El instalador intenta generar el informe inicial; si no aparece, ejecute este comando: |
sudo /var/www/proxymon/squidreports/squidreports.pl today| Description | Descripción |
|---|---|
| In General Statistics, enter a word or value in the search bar and select SEARCH. The table will show matching rows, so you do not have to scan the entire report. | En General Statistics, escriba una palabra o un valor en la barra de búsqueda y pulse SEARCH. La tabla mostrará las filas coincidentes, sin necesidad de recorrer todo el informe. |
| Description | Descripción |
|---|---|
| • Result: 1,323 matches in 5.4 seconds. Searches Squidreports daily reports for the entered term, regardless of letter case. • Data source: Squidreports reports, /var/www/proxymon/squidreports/report/YYYYMMDD/.• Search method: Reads report files and searches for the literal term. • Use case: Historical analysis, domain trends, data usage reports. |
• Resultado: 1 323 coincidencias en 5,4 s. Busca el texto indicado en los informes diarios de Squidreports, sin distinguir mayúsculas de minúsculas. • Fuente de datos: Informes de Squidreports, /var/www/proxymon/squidreports/report/YYYYMMDD/.• Método de búsqueda: Lectura de los archivos de informes y búsqueda literal del término. • Caso de uso: Análisis histórico, tendencias de dominios, informes de consumo de datos. |
The installer schedules Squidreports report generation every 10 minutes. To change the frequency, edit its entry in /etc/cron.d/proxymon. A second entry runs yesterday at 00:05, because today stops selecting the previous day at midnight. Its --wait-lock waits for the generator still running instead of giving up.
|
El instalador programa la generación de informes de Squidreports cada 10 minutos. Para cambiar la frecuencia, edite su tarea en /etc/cron.d/proxymon. Una segunda tarea ejecuta yesterday a las 00:05, porque today deja de seleccionar el día anterior a medianoche. Su opción --wait-lock espera al generador que siga activo en lugar de abandonar.
|
sudo nano /etc/cron.d/proxymon
*/10 * * * * www-data /var/www/proxymon/squidreports/squidreports.pl today
5 0 * * * www-data /var/www/proxymon/squidreports/squidreports.pl yesterday --wait-lock
You can add users manually to realname.cfg and exclude IP addresses from reports with skipuser.cfg.
|
Puede añadir usuarios manualmente a realname.cfg y excluir IP de los informes con skipuser.cfg.
|
When
UPDATE_REALNAME=true—the default for a new installation—Bandata generatesrealname.cfgfrom non-excluded MAC ACLs and, when enabled, data fromuhm-auth.txt. It also generatesskipuser.cfgfrom the IP addresses inmac-unlimited.txtand IPv4 entries in/etc/hosts. If it finds data, it replaces the contents of those files, so manual edits may be lost.Cuando
UPDATE_REALNAME=true—valor predeterminado al instalar—, Bandata generarealname.cfgcon las ACL MAC no excluidas y, si corresponde, los datos deuhm-auth.txt. También generaskipuser.cfgcon las IP demac-unlimited.txty las direcciones IPv4 de/etc/hosts. Si encuentra datos, reemplaza el contenido de esos archivos, por lo que los cambios manuales pueden perderse.
sudo nano /var/www/proxymon/squidreports/realname.cfg
# example:
192.168.X.2 Client1
192.168.X.24 Client12
sudo nano /var/www/proxymon/squidreports/skipuser.cfg
# example:
192.168.X.3 CEO| Description | Descripción |
|---|---|
Group summarizes client traffic by ACL membership. When UPDATE_REALNAME=true, Bandata rebuilds group.cfg inside SQUIDREPORTS_DIR on each run. Active IPs from ACL_MAC_PATH/mac-limited.txt belong to 01. limited. With BANDATA_HOTSPOT=true, active IPs from HOTSPOT_PATH/acl/uhm-auth.txt belong to 02. hotspot. Only entries beginning with a; are included. Unlimited clients remain excluded from reports.The installer enables UHM integration when both HOTSPOT_PATH/uhm.env and HOTSPOT_PATH/acl/uhm-auth.txt exist. Without this integration, Bandata generates only the limited assignments. Clients recorded without an assignment appear as Not in group.Bandata replaces group.cfg, including when no active assignments remain, so manual edits are overwritten. Each generated daily report receives a copy in .group. Existing historical assignments remain unchanged until that date is regenerated. The installer option update preserves the installed file; Bandata updates it on its next run. |
Group resume el tráfico de los clientes según su pertenencia a las ACL. Con UPDATE_REALNAME=true, Bandata reconstruye group.cfg dentro de SQUIDREPORTS_DIR en cada ejecución. Las IP activas de ACL_MAC_PATH/mac-limited.txt pertenecen a 01. limited. Con BANDATA_HOTSPOT=true, las IP activas de HOTSPOT_PATH/acl/uhm-auth.txt pertenecen a 02. hotspot. Solo se incluyen entradas que comienzan con a;. Los clientes unlimited siguen excluidos de los informes.El instalador habilita la integración con UHM cuando existen HOTSPOT_PATH/uhm.env y HOTSPOT_PATH/acl/uhm-auth.txt. Sin esta integración, Bandata genera únicamente las asignaciones limited. Los clientes registrados sin asignación aparecen como Not in group.Bandata reemplaza group.cfg, incluso cuando no quedan asignaciones activas, por lo que sobrescribe los cambios manuales. Cada informe diario generado recibe una copia en .group. Las asignaciones históricas existentes se conservan hasta regenerar esa fecha. La opción update del instalador conserva el archivo instalado; Bandata lo actualiza en su siguiente ejecución. |
To exclude IP addresses from reports, add them to skipuser.cfg. If UPDATE_REALNAME=true, Bandata normally rebuilds this file from mac-unlimited.txt and /etc/hosts, so manual changes may be replaced:
|
Para excluir IP de los informes, añádalas a skipuser.cfg. Si UPDATE_REALNAME=true, Bandata normalmente vuelve a generar este archivo a partir de mac-unlimited.txt y /etc/hosts, por lo que puede reemplazar los cambios manuales:
|
sudo nano /var/www/proxymon/squidreports/skipuser.cfg
# example
192.168.X.1| Use one of the following tools to discover devices on your local network. Replace the example IP range where applicable: | Utilice una de las siguientes herramientas para detectar dispositivos en su red local. Sustituya el rango de IP del ejemplo cuando corresponda: |
# Install required tools
sudo apt install -y nbtscan nmap arp-scan nast sudo netdiscover
# Run the following commands to scan your local network:
# 1. Using nbtscan
sudo nbtscan 192.168.X.0/24
# 2. Using nmap
sudo nmap -sn 192.168.X.0/24
# 3. Using arp-scan
sudo arp-scan --localnet
# 4. Using nast
sudo nast -m
# 5. Using netdiscover
sudo netdiscover| Description | Descripción |
|---|---|
Squidreports preserves the base report formats and paths used by Bandata. Additional metrics are stored separately under reportstats/YYYYMMDD/ (the configured report path followed by stats). Detail reads the original reports and these additional metrics. Existing additional metrics in old report folders remain readable until that date is regenerated. Analyze displays historical statistics and charts. Charts are generated on request, without saving images or HTML pages. |
Squidreports conserva los formatos y las rutas de los informes base utilizados por Bandata. Las métricas adicionales se guardan por separado en reportstats/YYYYMMDD/ (la ruta configurada de informes seguida de stats). Detail lee los informes originales y estas métricas adicionales. Las métricas adicionales existentes en carpetas antiguas siguen siendo legibles hasta regenerar esa fecha. Analyze muestra estadísticas históricas y gráficos. Los gráficos se generan bajo petición, sin guardar imágenes ni páginas HTML. |
| Description | Descripción |
|---|---|
| Detailed Report provides detailed traffic reports within Squidreports. It provides daily, weekly, monthly and yearly summaries, with details by user and site. | Detailed Report permite consultar informes detallados de tráfico dentro de Squidreports. Ofrece resúmenes diarios, semanales, mensuales y anuales, con detalles por usuario y sitio. |
| Daily access: In General Statistics, select View in the Detail column for the required date. The daily User Statistics link also opens this report when its metrics are available. | Acceso diario: En General Statistics, pulse View en la columna Detail de la fecha deseada. El enlace diario User Statistics también abre este informe cuando sus métricas están disponibles. |
| Monthly and yearly access: In the Ranking box, use MONTH or YEAR in the fourth column, Detail. These links open the detailed report for the selected period. | Acceso mensual y anual: En el cuadro Ranking, utilice MONTH o YEAR en la cuarta columna, Detail. Estos enlaces abren el informe detallado del período seleccionado. |
| Weekly access: In Ranking, WEEK opens weekly Top Sites, Total, Group or Detail. Top Sites, Total and Group retain their usual tables and tools. Choose the ISO week and either Full week (Mon–Sun) or Bandata (Mon–Fri). The initial week comes from the latest daily report in the selected month or year. Reports read existing daily data and show missing dates explicitly. Bandata evaluates the previous Monday–Friday on Monday; the report shows consumption, not historical blocking status. Detail includes a daily breakdown for all users or the selected user/IP. | Acceso semanal: En Ranking, WEEK abre los informes semanales de Top Sites, Total, Group o Detail. Top Sites, Total y Group conservan sus tablas y herramientas habituales. Seleccione la semana ISO y Full week (Mon–Sun) o Bandata (Mon–Fri). La semana inicial corresponde al último informe diario del mes o año seleccionado. Los informes leen los datos diarios existentes e indican las fechas ausentes. Bandata evalúa el lunes el período de lunes a viernes anterior; el informe muestra consumo, no el estado histórico de bloqueo. Detail incluye el desglose diario de todos los usuarios o del usuario/IP seleccionado. |
| Users and IP addresses: The initial table summarizes each user's requests, transferred bytes, consumption share, cache HIT/MISS bytes and percentages, accumulated duration, average request duration, time share, throughput and largest object with its URL. With the default configuration, unauthenticated traffic is identified by client IP; authenticated traffic uses the username. It does not create a separate IP breakdown for an authenticated user. | Usuarios y direcciones IP: La tabla inicial resume las solicitudes, bytes transferidos, porcentaje de consumo, bytes y porcentajes de caché HIT/MISS, duración acumulada, duración media por solicitud, porcentaje de tiempo, velocidad media y objeto de mayor tamaño con su URL. Con la configuración predeterminada, el tráfico sin autenticación se identifica por la IP del cliente; el autenticado utiliza el nombre de usuario. No crea un desglose independiente por IP para un usuario autenticado. |
| Site details: Select a user or IP address to view their sites for the same period. The table shows the same traffic, cache and duration metrics by site, excluding the largest-object column. Users returns to the summary for that period. | Detalle por sitio: Seleccione un usuario o una IP para consultar sus sitios durante el mismo período. La tabla muestra las mismas métricas de tráfico, caché y duración por sitio, sin la columna del objeto de mayor tamaño. Users vuelve al resumen del período. |
| Denied Accesses: Opens denied requests for the selected period and, when selected, the user. Each row shows the date, user or IP, time, Squid code and URL. This includes blocked requests and authentication failures recorded as denied by Squid. Denied requests remain outside the traffic totals. | Denied Accesses: Abre las solicitudes denegadas del período y, si se ha seleccionado, del usuario. Cada fila muestra fecha, usuario o IP, hora, código de Squid y URL. Incluye solicitudes bloqueadas y fallos de autenticación registrados como denegados por Squid. Las solicitudes denegadas se excluyen de los totales de tráfico. |
| Metric interpretation: Duration is the sum of request durations, not the user's connected time. Average request duration is expressed in milliseconds. Throughput divides transferred bytes by accumulated request duration; it is not a measurement of the network link's speed. | Interpretación de métricas: La duración es la suma de las duraciones de las solicitudes, no el tiempo de conexión del usuario. La duración media por solicitud se expresa en milisegundos. La velocidad media divide los bytes transferidos entre la duración acumulada; no mide la velocidad del enlace de red. |
| Print and storage: Print opens the browser's print dialog. Tables are generated from existing report data when opened; no duplicate HTML archive or graphs are stored. | Impresión y almacenamiento: Print abre el diálogo de impresión del navegador. Las tablas se generan desde los datos de los informes al consultarlas; no se almacena otro archivo histórico de HTML ni gráficos. |
Older reports: Daily .sitestat files store cache and duration metrics by user/site under reportstats/YYYYMMDD/, separately from the original reports. Missing detailed metrics appear as —, rather than zero. Regenerate the affected dates from retained Squid logs to recover those metrics. |
Informes anteriores: Los archivos diarios .sitestat guardan métricas de caché y duración por usuario/sitio en reportstats/YYYYMMDD/, separadas de los informes originales. Las métricas detalladas ausentes aparecen como —, en lugar de cero. Regenere las fechas afectadas desde los registros conservados de Squid para recuperar esas métricas. |
| Description | Descripción |
|---|---|
| Access: Select Analyze beside the Ranking title or in Detail. This opens the analysis view within Squidreports. | Acceso: Pulse Analyze junto al título Ranking o dentro de Detail. Abre la vista de análisis dentro de Squidreports. |
| Periods: Select Day, Week, Month or Year, fill the corresponding fields and press Apply. Weeks use ISO numbering and the ISO week-year, which may include dates from the adjacent calendar year. Detail opens the same selected period. | Períodos: Seleccione Day, Week, Month o Year, complete los campos correspondientes y pulse Apply. Las semanas usan numeración ISO y el año de semana ISO, que puede incluir fechas del año calendario adyacente. Detail abre el mismo período seleccionado. |
| History: Displays recorded intervals by hour for a day, by day for a week or month, and by month for a year. Select bytes, requests, HIT/MISS bytes, throughput, HIT/MISS throughput or denied requests for the chart. The original report totals appear separately. Missing intervals are not filled with zero. | History: Muestra los intervalos registrados por hora para un día, por día para una semana o mes y por mes para un año. Permite graficar bytes, solicitudes, bytes HIT/MISS, velocidad media, velocidad HIT/MISS o solicitudes denegadas. Los totales de los informes originales aparecen por separado. Los intervalos ausentes no se completan con cero. |
| MIME: Aggregates content types for the selected period, with requests, bytes, cache, duration, throughput, first/last access and largest object. The type comes from Squid's log; HTTPS tunnels do not reveal their enclosed content. | MIME: Agrupa tipos de contenido para el período, con solicitudes, bytes, caché, duración, velocidad media, primer/último acceso y objeto de mayor tamaño. El tipo proviene del registro de Squid; los túneles HTTPS no revelan su contenido interno. |
Networks: Groups client IPs by configured network, with traffic, cache, duration, throughput and largest object. Select a network to inspect its users/IPs. The main network comes from RANGE in /etc/proxymon/proxymon.env. Unmatched addresses remain individual. In squidreports.cfg, optional additional $analytics_networks entries use [label, CIDR]; IPv4 and IPv6 are supported. The longest matching prefix wins. |
Networks: Agrupa IP de clientes por red configurada, con tráfico, caché, duración, velocidad media y objeto de mayor tamaño. Seleccione una red para consultar sus usuarios/IP. La red principal se lee de RANGE en /etc/proxymon/proxymon.env. Las direcciones sin coincidencia permanecen individuales. En squidreports.cfg, las entradas opcionales adicionales de $analytics_networks usan [nombre, CIDR]; admite IPv4 e IPv6. Prevalece el prefijo coincidente más específico. |
Domains and Sites: Domains combines subdomains and opens their individual sites. Sites opens users for a destination; selecting a user shows their sites within the selected domain. Tables retain first/last access, cache, duration, throughput and largest object. Domain grouping uses the bundled Public Suffix List, including wildcard and exception rules. International suffixes are stored as ASCII/Punycode. Optional $analytics_domain_suffixes adds literal suffixes. |
Domains y Sites: Domains agrupa subdominios y abre sus sitios individuales. Sites abre los usuarios de un destino; seleccionar un usuario muestra sus sitios dentro del dominio seleccionado. Las tablas conservan primer/último acceso, caché, duración, velocidad media y objeto de mayor tamaño. La agrupación utiliza la Public Suffix List incluida, con comodines y excepciones. Los sufijos internacionales se guardan en ASCII/Punycode. $analytics_domain_suffixes permite añadir sufijos literales. |
| Denied: Ranks denied destinations by request count. Each destination shows its users, Squid codes and first/last access. Includes authentication failures recorded as denied. These requests remain outside allowed-traffic totals. | Denied: Ordena los destinos denegados por cantidad de solicitudes. Cada destino muestra usuarios, códigos de Squid y primer/último acceso. Incluye fallos de autenticación registrados como denegados. Estas solicitudes se excluyen de los totales de tráfico permitido. |
Storage and coverage: Original files stay in REPORT_PATH/YYYYMMDD/. Detail's additional files and Analyze's analyzer.json share REPORT_STATS_PATH/YYYYMMDD/, distinguished by filename. The parser replaces each day's aggregates when regenerating it. Dates missing additional metrics produce a coverage notice; regenerate them from retained logs. No additional pages or chart images are stored. |
Almacenamiento y cobertura: Los archivos originales permanecen en REPORT_PATH/YYYYMMDD/. Los archivos adicionales de Detail y analyzer.json de Analyze comparten REPORT_STATS_PATH/YYYYMMDD/, separados por nombre. El parser reemplaza los agregados del día al regenerarlo. Las fechas sin métricas adicionales muestran un aviso de cobertura; regenérelas desde registros conservados. No se guardan páginas adicionales ni imágenes de gráficos. |
| Tables and print: Tables show 100 rows per page. Distribution charts show the first 20 rows; History charts show recorded intervals. Print prints the current page. Rates divide summed bytes by summed request durations; zero-duration rates appear as —. Internet cost calculation is excluded. | Tablas e impresión: Las tablas muestran 100 filas por página. Los gráficos de distribución muestran las primeras 20 filas; los históricos muestran los intervalos registrados. Print imprime la página actual. Las velocidades dividen los bytes acumulados entre las duraciones acumuladas; con duración cero aparece —. Se excluye el cálculo de costes de Internet. |
Analyze reads the installed network configuration automatically; no example network needs copying. Additional network aliases remain optional in
squidreports.cfg. Subnet statistics use the same configuration when regenerated.Analyze lee automáticamente la configuración de red instalada; no necesita copiar una red de ejemplo. Los alias adicionales siguen siendo opcionales en
squidreports.cfg. Las estadísticas por subred usan la misma configuración al regenerarse.
| Description | Descripción |
|---|---|
Run domain-suffixes-update.sh manually as root. It is installed beside domain-suffixes.txt; no cron entry is added. |
Ejecute domain-suffixes-update.sh manualmente como root. Se instala junto a domain-suffixes.txt; no se añade ninguna entrada de cron. |
The updater loads SQUIDREPORTS_DIR from /etc/proxymon/proxymon.env through the shared reader. It does not assume the default web directory. Installation and update deploy the reader beside the updater. |
El actualizador carga SQUIDREPORTS_DIR de /etc/proxymon/proxymon.env mediante el lector compartido. No presupone el directorio web predeterminado. La instalación y la actualización despliegan el lector junto al actualizador. |
| Downloads the official PSL over HTTPS, validates its metadata, ICANN and PRIVATE sections and every rule, and normalizes international suffixes to ASCII/Punycode. Preserves wildcard and exception rules. | Descarga la PSL oficial mediante HTTPS, valida sus metadatos, las secciones ICANN y PRIVATE y cada regla. Normaliza sufijos internacionales a ASCII/Punycode y conserva comodines y excepciones. |
| Replaces the list only after validation succeeds. Download or validation failures leave the previous list unchanged. An identical list is not rewritten. The configured directory must be root-owned and not writable by group or others. | Reemplaza la lista solo después de validarla. Los fallos de descarga o validación conservan la lista anterior. Una lista idéntica no se reescribe. El directorio configurado debe pertenecer a root, sin escritura para grupo u otros. |
Logs to /var/log/proxymon.log. Requires curl and python3, included in installer dependencies. Project updates preserve the manually updated list. |
Registra en /var/log/proxymon.log. Requiere curl y python3, incluidos en las dependencias del instalador. Las actualizaciones del proyecto conservan la lista actualizada manualmente. |
Default installation path / Ruta de instalación predeterminada:
sudo bash /var/www/proxymon/squidreports/domain-suffixes-update.shUse the updater under your configured SQUIDREPORTS_DIR if this path differs.
Utilice el actualizador situado en su SQUIDREPORTS_DIR configurado si utiliza otra ruta.
Official source / Fuente oficial: Public Suffix List.
| The daily User Statistics link opens Detailed Report when the daily metrics are available. It summarizes traffic, cache usage, request durations and the largest object for each user or client IP. Select a user or IP to inspect their sites. | El enlace diario User Statistics abre Detailed Report cuando las métricas diarias están disponibles. Resume tráfico, uso de caché, duración de solicitudes y objeto de mayor tamaño por usuario o IP del cliente. Seleccione un usuario o una IP para consultar sus sitios. |
Traffic is grouped in three views: by content type, by file extension, and by client subnet. Each row gives the bytes, the number of requests and the share of the day's traffic. The three views share one page and differ only in the type parameter.
|
El tráfico se agrupa en tres vistas: por tipo de contenido, por extensión de archivo y por subred del cliente. Cada fila muestra los bytes, el número de solicitudes y el porcentaje del tráfico del día. Las tres vistas comparten una página y solo cambian en el parámetro type.
|
Lists requests denied by Squid during the day, with the user, time, Squid code and URL. It covers both the blocked requests, TCP_DENIED/403, and the authentication failures, TCP_DENIED/407. These lines never enter the traffic totals.
|
Muestra las solicitudes rechazadas por Squid durante el día, con usuario, hora, código de Squid y URL. Incluye tanto las solicitudes bloqueadas, TCP_DENIED/403, como los fallos de autenticación, TCP_DENIED/407. Estas solicitudes se excluyen de los totales de tráfico.
|
Squidreports displays traffic statistics and identifies users who exceed the configured threshold. To change that threshold, edit squidreports.cfg:
|
Squidreports muestra las estadísticas de tráfico y señala a los usuarios que superan el umbral configurado. Para cambiar ese umbral, edite squidreports.cfg:
|
sudo nano /var/www/proxymon/squidreports/squidreports.cfg
# Nomenclature: 10 = 10 MBytes, 512 = 512 Mbytes, 1000 = 1 Gbytes...
# By default it comes in 1000. Do not modify the value 1024.
#user maximum size per day limit (oversize)
$perusertrafficlimit = 1000*1024*1024;| Description | Descripción |
|---|---|
| In General Statistics, open Tools on the right side of the header to copy or print the table, or export it as PDF, XLSX, or CSV. | En General Statistics, abra Tools, a la derecha del encabezado, para copiar o imprimir la tabla y exportarla como PDF, XLSX o CSV. |
| Squidreports can export reports, but its site view shows a selection of top domains. To collect the domains recorded in the daily reports and create a list for a Squid ACL, run: | Squidreports permite exportar informes, pero su vista de sitios muestra una selección de los dominios principales. Para reunir los dominios registrados en los informes diarios y generar una lista para una ACL de Squid, ejecute: |
find /var/www/proxymon/squidreports/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 > domains.txt| Description | Descripción |
|---|---|
| Bandata is a script that sets data usage limits —daily, weekly, and monthly— for IP addresses on a LAN monitored with Squid, and automatically blocks those that exceed the established quotas. • Weekends are excluded from the calculation. • The limits must match those configured in Squid Report. • Bandata can generate realname.cfg to map IP addresses to names and skipuser.cfg to exclude IP addresses from Squidreports reports. It reads MAC ACLs, /etc/hosts, and, when enabled, the captive portal's uhm-auth.txt.• On its first run Bandata writes /etc/logrotate.d/bandata if that file is missing, so /var/log/bandata.log never needs a manual truncate. The generated rule rotates the log daily, keeps seven rotations compressed, and recreates it as 640 root adm. An existing file is left untouched, so your own changes are preserved. |
Bandata es un script que establece límites de consumo de datos —diario, semanal y mensual— para direcciones IP de una LAN monitorizada con Squid, y bloquea automáticamente aquellas que superan las cuotas establecidas. • Los fines de semana quedan excluidos del cálculo. • Los límites deben coincidir con los configurados en Squid Report. • Bandata puede generar realname.cfg para asociar IP con nombres y skipuser.cfg para excluir IP de los informes de Squidreports. Toma los datos de las ACL MAC, de /etc/hosts y, si está activado, de uhm-auth.txt del portal cautivo.• En su primera ejecución, Bandata crea /etc/logrotate.d/bandata si ese archivo no existe, por lo que /var/log/bandata.log nunca necesita un truncado manual. La regla generada rota el log a diario, conserva siete rotaciones comprimidas y lo recrea como 640 root adm. Si el archivo ya existe, no lo modifica, por lo que sus cambios se conservan. |
Bandata calculates usage from available Squidreports reports. If reports are missing or incomplete, calculated usage may be lower than actual usage.
Bandata calcula el consumo con los informes disponibles de Squidreports. Si faltan informes o están incompletos, el consumo calculado puede ser inferior al real.
A failure never penalizes a client. When Bandata cannot read its reports, cannot build a list, or cannot publish its rules, it clears the affected blocks and logs a
WARNING: ... -alert. The client regains access and the administrator investigates the cause. Missing report folders are not a failure: that case is reported asINFOand the quota is simply calculated over the days that exist.Una falla nunca penaliza al cliente. Cuando Bandata no puede leer sus informes, construir una lista o publicar sus reglas, vacía los bloqueos afectados y registra un
WARNING: ... -alert. El cliente recupera el acceso y el administrador investiga la causa. La ausencia de carpetas de informes no es una falla: ese caso se informa comoINFOy la cuota se calcula sobre los días que existen.
| Warning | When it appears | Cuándo aparece |
|---|---|---|
WARNING: banday.txt is missing |
The daily block list is absent when Bandata combines the three quota lists. The message names banweek.txt or banmonth.txt when that list is absent instead. |
Falta la lista diaria al combinar las tres listas de bloqueos por cuota. El mensaje identifica banweek.txt o banmonth.txt cuando falta esa lista. |
WARNING: clearing all Bandata quota blocks -alert |
Bandata detects a list preparation, set preparation or IP loading failure. It then attempts to clear all quota blocks. This warning does not confirm successful removal. | Bandata detecta un fallo al preparar listas, preparar conjuntos o cargar IP. Después intenta retirar todos los bloqueos por cuota. El aviso no confirma su retirada. |
| File and command failures | An unreadable file, a directory instead of a file, or a read error produces a different warning. The warning identifies the affected file; command failures also include the exit code. | Un archivo sin permiso de lectura, una carpeta o un error de lectura generan otro aviso. El aviso identifica el archivo afectado. Los fallos de comandos también incluyen su código de salida. |
| Description | Descripción |
|---|---|
The recovery mechanism clears the active bandata set to release all Bandata quota blocks. It runs when:
ipset flush bandata succeeding. |
El mecanismo de recuperación vacía el conjunto activo bandata para liberar todos los bloqueos por cuota. No retira bloqueos ajenos a Bandata. Se activa ante estos fallos:
ipset flush bandata termine correctamente. |
# The day reports cannot be read
2026-10-17 12:00:00 WARNING: cannot read day reports, day cleared -alert
# A block list cannot be built from the reports
2026-10-17 12:00:00 WARNING: cannot build daily list, day cleared -alert
2026-10-17 12:00:00 WARNING: cannot build weekly list, week cleared -alert
2026-10-17 12:00:00 WARNING: cannot build monthly list, month cleared -alert
# The kernel set is incomplete or cannot be put in service
2026-10-17 12:00:00 WARNING: block set half loaded, all blocks cleared -alert
2026-10-17 12:00:00 WARNING: cannot activate new set, all blocks cleared -alert
# Bandata - Monitor bandwidth usage and enforce data limits (every 5 minutes)
sudo nano /etc/cron.d/proxymon
*/5 * * * * root /etc/proxymon/bandata/bandata.sh2026-10-19 15:59:56 bandata start...
2026-10-19 15:59:56 Running Bandata Day...
2026-10-19 15:59:56 INFO: Daily Blocked:
192.168.0.86
2026-10-19 15:59:56 Running Bandata Week...
2026-10-19 15:59:57 INFO: Weekly Blocked:
192.168.0.86
192.168.0.101
192.168.0.127
2026-10-19 15:59:57 Running Bandata Month...
2026-10-19 16:00:01 INFO: Monthly Blocked:
192.168.0.60
192.168.0.68
2026-10-19 16:00:01 Running Ipset/Iptables Rules...
2026-10-19 16:00:01 Applying Iptables Rules...
2026-10-19 16:00:01 INFO: group.cfg updated
2026-10-19 16:00:01 INFO: Quota rules applied; blocked IPs: 5
2026-10-19 16:00:01 bandata done at: 2026-10-19 16:00:01| When an IP address exceeds its daily, weekly, or monthly quota, Bandata redirects its HTTP traffic to the Warning portal. Other traffic is blocked: | Cuando una IP supera su cuota diaria, semanal o mensual, Bandata redirige su tráfico HTTP al portal de advertencia (Warning) y bloquea el resto del tráfico: |
http://192.168.X.X:18081| To view the blocked IP addresses: | Para consultar las IP bloqueadas: |
cat /etc/proxymon/bandata/acl/{banmonth,banweek,banday}.txt | uniq
You can enter limits in gigabytes, megabytes, or bytes; for example, 0.5G, 512M, or 536870912. The default limits are 1 GB per day, 5 GB per week, and 20 GB per month.
|
Puede indicar los límites en gigabytes, megabytes o bytes; por ejemplo, 0.5G, 512M o 536870912. Los valores predeterminados son 1 GB al día, 5 GB a la semana y 20 GB al mes.
|
Bandata compares the day's usage with the daily limit and blocks IP addresses that exceed it. On each weekday run, it recalculates the daily list from that day's report; it clears the list on weekends. An IP address is no longer blocked by the daily quota once it disappears from that list, though it may remain blocked if it appears in the weekly or monthly list. To change the daily limit, edit /etc/proxymon/proxymon.env:
|
Bandata compara el consumo del día con el límite diario y bloquea las IP que lo superan. En cada ejecución de lunes a viernes recalcula la lista diaria con el informe de ese día; durante el fin de semana la vacía. La IP deja de estar bloqueada por cuota diaria cuando desaparece de esa lista, aunque puede seguir bloqueada si aparece en la lista semanal o mensual. Para cambiar el límite diario, edite /etc/proxymon/proxymon.env:
|
MAX_BANDWIDTH_DAY=1G
Every Monday, Bandata totals the usage recorded from Monday to Friday of the previous week and updates the weekly list. If an IP address exceeds the limit (5 GB by default), it remains blocked under the weekly quota until a later Monday calculation removes it from that list. It may also remain blocked if it appears in the daily or monthly list. To change the weekly limit, edit /etc/proxymon/proxymon.env:
|
Cada lunes, Bandata suma el consumo registrado de lunes a viernes de la semana anterior y actualiza la lista semanal. Si una IP supera el límite —5 GB de forma predeterminada—, permanece bloqueada por cuota semanal hasta que el cálculo de un lunes posterior la quite de esa lista. También puede seguir bloqueada si aparece en la lista diaria o mensual. Para cambiar el límite semanal, edite /etc/proxymon/proxymon.env:
|
MAX_BANDWIDTH_WEEK=5G
On every run, Bandata totals usage recorded on weekdays in the current month and updates the monthly list. If an IP address exceeds the limit (20 GB by default), it remains blocked under the monthly quota while it appears on that list. At the start of the next month, the list is calculated from the new month's reports, removing blocks that applied only to the previous month. The IP may remain blocked if it appears in the daily or weekly list. To change the monthly limit, edit /etc/proxymon/proxymon.env:
|
En cada ejecución, Bandata suma el consumo de los días hábiles del mes en curso y actualiza la lista mensual. Si una IP supera el límite —20 GB de forma predeterminada—, permanece bloqueada por cuota mensual mientras figure en esa lista. Al comenzar el mes siguiente, la lista se calcula con los informes del nuevo mes y elimina los bloqueos que solo correspondían al mes anterior. La IP puede seguir bloqueada si aparece en la lista diaria o semanal. Para cambiar el límite mensual, edite /etc/proxymon/proxymon.env:
|
MAX_BANDWIDTH_MONTH=20G| Bandata builds the blocked IP set by combining the daily, weekly, and monthly lists. An IP address is unblocked only when it no longer appears in any of the three. | Bandata forma el conjunto de IP bloqueadas uniendo las listas diaria, semanal y mensual. Una IP deja de estar bloqueada cuando ya no aparece en ninguna de las tres. |
| Description | Descripción |
|---|---|
| Logview contains two internal tabs: Log for access logs and Live for active requests. Both views remain inside Logview. The Log/Live buttons share the controls row; the Log search field has a compact width. Dark is the default theme for Log and Live. The shared theme selection is saved in the browser and applied before displaying the content when Logview reloads. Live uses the same selection when opened, including when its refresh is paused. |
Logview contiene dos pestañas internas: Log para los registros de acceso y Live para las solicitudes en curso. Ambas vistas permanecen dentro de Logview. Los botones Log/Live comparten la fila de controles; el campo de búsqueda de Log tiene un ancho reducido. El tema oscuro es el predeterminado de Log y Live. La selección de tema compartido se guarda en el navegador y se aplica antes de mostrar el contenido al recargar Logview. Live adopta esa selección al abrirse, incluso con su actualización pausada. |
| Description | Descripción |
|---|---|
• Log opens by default and displays new entries from /var/log/squid/access.log in a table that refreshes periodically.• Search the loaded entries, filter by cache code or HTTP status, and sort columns. |
• Log abre por defecto y muestra las nuevas entradas de /var/log/squid/access.log en una tabla que se actualiza periódicamente.• Puede buscar entre las entradas cargadas, filtrar por código de caché o estado HTTP y ordenar las columnas. |
| The search bar filters loaded entries by IP address, URL, user, HTTP method, cache code, or HTTP response code. | La barra filtra las entradas cargadas por IP, URL, usuario, método HTTP, código de caché o código de respuesta HTTP. |
| Description | Descripción |
|---|---|
| Live displays active Squid requests, grouped by client IP, current and average speeds, duration and speed subtotals. | Live muestra las solicitudes activas de Squid, agrupadas por IP de cliente, velocidad actual y media, duración y subtotales de velocidad. |
Live queries Squid's Cache Manager using SQUID_MGR_HOST, SQUID_MGR_PORT and SQUID_MGR_PASSWD from proxymon.env. Refresh defaults to five seconds; Stop pauses it. Refresh is stored per browser session. |
Live consulta el administrador de caché de Squid mediante SQUID_MGR_HOST, SQUID_MGR_PORT y SQUID_MGR_PASSWD de proxymon.env. Se actualiza cada cinco segundos por defecto; Stop pausa la actualización. El intervalo se conserva por sesión del navegador. |
| Description | Descripción |
|---|---|
SquidAI is an assistant for network administrators. It uses BM25 to find relevant information in its data and a language model (LLM) to respond in natural language. It combines data from Squid, Squidreports reports, and ACL lists to help answer questions about user profiles, blocked activity, incidents, and network usage:
|
SquidAI es un asistente especializado para administradores de red. Usa BM25 para localizar información relevante en sus datos y un modelo de lenguaje (LLM) para responder en lenguaje natural. Combina respuestas basadas en datos de Squid, informes de Squidreports y listas ACL. Puede ayudar a consultar perfiles de usuario, actividad bloqueada, incidentes y consumo de la red:
|
| Description | Descripción |
|---|---|
Panel published through a tunnel or reverse proxy. To send LLM queries from a public HTTPS panel, declare its domain in PANEL_DOMAINS, in /etc/proxymon/proxymon.env. Otherwise, worker.php rejects those POST requests with 403. Enter domains or subdomains separated by commas, without a scheme, port or path. Each valid domain authorizes its HTTPS origin on the default port, 443. A malformed entry is discarded and reported in the Apache error log. An empty value keeps only the local panel origins authorized; this key does not change Apache's loopback listener. |
Panel publicado por túnel o proxy inverso. Para enviar consultas al LLM desde un panel público HTTPS, declare su dominio en PANEL_DOMAINS, en /etc/proxymon/proxymon.env. Si no lo declara, worker.php rechaza esas peticiones POST con 403. Escriba dominios o subdominios separados por comas, sin esquema, puerto ni ruta. Cada dominio válido autoriza su origen HTTPS en el puerto predeterminado, 443. Los valores malformados se descartan y se registran en el log de errores de Apache. Un valor vacío conserva únicamente los orígenes locales del panel; esta clave no cambia la escucha de Apache en loopback. |
| Description | Descripción |
|---|---|
| User queries: "Show me JOHN-SMITH activity" "What did CARLOS-GARCIA do today?" "Report for ACCOUNTING-DEPT" |
Consultas de usuario: "Muéstrame la actividad de JOHN-SMITH" "¿Qué hizo CARLOS-GARCIA hoy?" "Informe de CONTABILIDAD" |
| Network queries: "Top 10 most visited domains today" "Who consumes the most bandwidth?" "Users who exceeded 3 GB" |
Consultas de red: "Top 10 dominios más visitados hoy" "¿Quién consume más ancho de banda?" "Usuarios que superaron 3 GB" |
| Security queries: "Are there security incidents?" "Detect any threat today?" "Is there torrent traffic?" |
Consultas de seguridad: "¿Hay incidentes de seguridad?" "¿Detectas alguna amenaza hoy?" "¿Hay tráfico de torrents?" |
| Blocked accesses: "Which IPs accessed blocked domains?" "Show blocked TLD accesses" |
Accesos bloqueados: "¿Qué IPs accedieron a dominios bloqueados?" "Muestra accesos a TLDs bloqueados" |
| User list: "List all registered users" "Show me all users" |
Lista de usuarios: "Lista todos los usuarios registrados" "Muéstrame todos los usuarios" |
The user names in the examples are illustrative. For the assistant to recognize them, they must exist in
realname.cfg(and not be excluded inskipuser.cfg), where Squidreports stores the IP-to-hostname mapping.Los nombres de usuario en los ejemplos son ilustrativos. Para que el asistente los reconozca, deben existir en
realname.cfg(y no estar excluidos enskipuser.cfg), donde Squidreports almacena la correspondencia entre IP y nombres de equipo.
| Description | Descripción |
|---|---|
For security incident detection, SquidAI uses /etc/acl/squid/blockpatterns.txt and direct IPv4 detection. Severity depends on the pattern type and number of matches; results can be classified as CRITICAL, HIGH, MEDIUM, or LOW. |
Para la detección de incidentes de seguridad, SquidAI utiliza /etc/acl/squid/blockpatterns.txt y detección de IPv4 directa. La severidad depende del tipo de patrón y del número de coincidencias; los resultados pueden clasificarse como CRITICAL, HIGH, MEDIUM o LOW. |
| Description | Descripción |
|---|---|
🔧 API Setup: SquidAI requires an LLM provider to function. The configuration file is located outside the webroot for security: sudo nano /etc/proxymon/.env /etc/proxymon/ contains two files: .env (SquidAI LLM credentials) and proxymon.env (shared Proxy Monitor configuration, including Bandata network and quota settings). Do not confuse them. Set your provider URL, API key and response format: LLM_URL=https://your-provider.com/endpointLLM_API_KEY=your_api_keyLLM_MODEL=model-nameLLM_RESPONSE_FORMAT=openai |
🔧 Configuración de API: SquidAI requiere un proveedor LLM para funcionar. El archivo de configuración se encuentra fuera del webroot por seguridad: sudo nano /etc/proxymon/.env /etc/proxymon/ contiene dos archivos: .env (credenciales LLM de SquidAI) y proxymon.env (configuración compartida de Proxy Monitor, incluidas la red y las cuotas de Bandata). No los confunda. Configure la URL del proveedor, la clave de API y el formato de respuesta: LLM_URL=https://su-proveedor.com/endpointLLM_API_KEY=su_api_keyLLM_MODEL=nombre-del-modeloLLM_RESPONSE_FORMAT=openai |
The URL format depends on the provider.
.env file for each provider's exact format. Leave LLM_MODEL empty if the model is already part of the URL. |
El formato de la URL depende del proveedor.
.env para ver el formato exacto de cada proveedor. Deje LLM_MODEL vacío si el modelo ya forma parte de la URL. |
LLM_RESPONSE_FORMAT tells the worker how to read the response: openai (most providers), ollama (local Ollama), or gemini (Google Gemini passthrough). |
LLM_RESPONSE_FORMAT indica al worker cómo leer la respuesta: openai (la mayoría de proveedores), ollama (Ollama local) o gemini (Google Gemini passthrough). |
| The file includes commented examples for: Cloudflare Workers AI, OpenAI, Groq, OpenRouter, Together AI, Ollama (local), LM Studio (local) and Google Gemini. Uncomment one block and fill in your credentials. | El archivo incluye ejemplos comentados para: Cloudflare Workers AI, OpenAI, Groq, OpenRouter, Together AI, Ollama (local), LM Studio (local) y Google Gemini. Descomente un bloque y complete sus credenciales. |
🔒 Security: The .env file is stored in /etc/proxymon/, outside the Apache webroot. Permissions are set to 640 (root:www-data), allowing root and processes in the www-data group, including Apache PHP, to read the file. |
🔒 Seguridad: El archivo .env se almacena en /etc/proxymon/, fuera del webroot de Apache. Los permisos son 640 (root:www-data): el archivo queda accesible para root y para los procesos del grupo www-data, incluido PHP de Apache. |
| 🔄 Rate Limits & Retries: LLM APIs may experience congestion depending on demand. SquidAI implements an automatic retry mechanism: up to 4 attempts with progressive delays (4s, 8s, 15s) before giving up. If the API is temporarily unavailable, the assistant will display retry messages. If all attempts fail, it displays the notice shown in the following table. | 🔄 Límites de solicitudes y reintentos: Las APIs LLM pueden experimentar congestión según la demanda. SquidAI implementa un mecanismo de reintento automático: hasta 4 intentos con esperas progresivas (4 s, 8 s y 15 s) antes de desistir. Si la API no está disponible temporalmente, el asistente mostrará mensajes de reintento. Si todos los intentos fallan, mostrará el aviso de la tabla siguiente. |
| Message | Description | Descripción |
|---|---|---|
![]() |
Example of the automatic retry message. | Ejemplo del mensaje de reintento automático. |
![]() |
Example shown when the API is unavailable. | Ejemplo de API no disponible. |
| 🔌 LLM Status: The LED indicates whether the connection is checking, connected, or offline. | 🔌 Estado LLM: El LED indica si la conexión se está verificando, está conectada o está fuera de línea. |
| Message | Description | Descripción |
|---|---|---|
![]() |
Checking LLM connection | Verificando conexión con el LLM |
![]() |
LLM connected and ready | LLM conectado y listo |
![]() |
LLM unreachable or offline | LLM inaccesible o fuera de línea |
| Description | Descripción |
|---|---|
Command-line utilities are installed in /etc/proxymon/tools and run from a terminal. The HTML reports they generate can be viewed from the panel. |
Las utilidades de consola se instalan en /etc/proxymon/tools y se ejecutan desde la terminal. Los informes HTML que generan se pueden consultar desde el panel. |
| Description | Descripción |
|---|---|
| Squidtool is a command-line utility with two functions: generate a traffic report and search Squid logs. Run it with: | Squidtool es una utilidad de consola con dos funciones: generar un informe de tráfico y buscar términos en los registros de Squid. Se ejecuta con: |
sudo /etc/proxymon/tools/squidtool.shBoth functions read
access.logand every rotated file, compressed or not, so they cover the full retention period set in/etc/logrotate.d/squid.Each function generates an HTML report and replaces the previous report of the same type, so only the latest result is kept. The reports are written to
TOOL_REPORT_DIR(/etc/proxymon/tools/reportsby default), outside the Apache webroot, and the panel serves them read-only under the same loopback-only restriction. Tool activity is logged beside the script (CONFIG_DIR/tools/squidtool.log).Las dos funciones leen
access.logy todos los rotados, comprimidos o no, así que cubren todo el periodo de retención definido en/etc/logrotate.d/squid.Cada función genera un informe HTML y reemplaza el anterior del mismo tipo; solo se conserva el resultado más reciente. Los informes se escriben en
TOOL_REPORT_DIR(/etc/proxymon/tools/reportspor defecto), fuera del webroot de Apache, y el panel los publica en modo lectura con la misma restricción a loopback. La herramienta registra su actividad junto al script (CONFIG_DIR/tools/squidtool.log).
| Description | Descripción |
|---|---|
Analyzes the requests recorded by Squid, grouping them by client IP and requested domain. It allows selecting a single IP or analyzing every IP, and defining the period to review. The analysis covers the current access.log and its rotated or compressed files. Requests are counted and sorted from the most active to the least. When every IP is analyzed, entries below 20 requests are excluded. Entries reaching or exceeding 300 requests are shown as alerts. The result is written to squid_traffic.html. |
Analiza las solicitudes registradas por Squid, agrupándolas por IP de cliente y dominio solicitado. Permite seleccionar una IP concreta o analizar todas las IP y definir el período que se desea revisar. El análisis incluye el access.log actual y sus archivos rotados o comprimidos. Las solicitudes se contabilizan y se ordenan de mayor a menor actividad. Cuando se analizan todas las IP, se excluyen las entradas con menos de 20 solicitudes. Las entradas que alcanzan o superan las 300 solicitudes se muestran como alertas. El resultado se genera en squid_traffic.html. |
| Description | Descripción |
|---|---|
• Searches for a specific term in the access.log and cache.log records, without distinguishing between uppercase and lowercase. The text is matched literally, not as a regular expression, so characters such as ?, &, = or * are searched as typed. The search includes the current, rotated and compressed files. In access.log it allows filtering by client IP and setting the search period. In cache.log the IP filter does not apply, because that record does not contain the client IP. The results from access.log and cache.log are shown separately, along with the number of matches found in each record. The result is written to squid_search.html.• For cache.log to record the ACL decisions -- which rule allowed or blocked each request -- Squid must have debug_options ALL,1 33,2 28,9 enabled in squid.conf. Without it the search still works, but that record only holds the usual service messages. Keep in mind that this directive makes cache.log grow considerably. |
• Busca un término específico en los registros access.log y cache.log, sin distinguir entre mayúsculas y minúsculas. El texto se busca de forma literal, no como expresión regular, de modo que caracteres como ?, &, = o * se buscan tal cual se escriben. La búsqueda incluye los archivos actuales, rotados y comprimidos. En access.log permite filtrar por IP de cliente y establecer el período de búsqueda. En cache.log no se aplica el filtro por IP porque este registro no contiene la IP del cliente. Los resultados de access.log y cache.log se muestran por separado, junto con la cantidad de coincidencias encontradas en cada registro. El resultado se genera en squid_search.html.• Para que cache.log registre las decisiones de ACL -- qué regla permitió o bloqueó cada solicitud -- Squid debe tener activada la directiva debug_options ALL,1 33,2 28,9 en squid.conf. Sin ella la búsqueda sigue funcionando, pero ese registro solo contendrá los mensajes habituales del servicio. Tenga en cuenta que esa directiva hace crecer cache.log de forma considerable. |
| Description | Descripción |
|---|---|
pmbk.sh creates a ZIP archive with the Proxy Monitor installation and configuration, including the paths listed below:
pmsetup.sh --update runs this backup before updating project files. |
pmbk.sh crea un archivo ZIP con la instalación y configuración de Proxy Monitor, incluidas las rutas que se enumeran a continuación:
pmsetup.sh --update ejecuta esta copia de seguridad antes de actualizar los archivos del proyecto. |
| Command | Description | Descripción |
|---|---|---|
sudo bash pmbk.sh |
Create a backup now | Crear una copia ahora |
sudo bash pmbk.sh --install |
Register the @monthly cron entry |
Registrar la entrada mensual en cron |
sudo bash pmbk.sh --uninstall |
Remove the cron entry, keeping the archives | Quitar la entrada de cron, conservando los archivos ZIP |
Backs up Proxymon into
BACKUP_DIR/pmbk_<YYYYMMDD_HHMMSS>.zip(BACKUP_DIR=/etc/bak/proxymonby default), keeping up to 3 archives.pmsetup.sh --installregisters the monthly cron entry automatically;pmsetup.sh --uninstallremoves it before removing the project. Restore withsudo unzip -X ARCHIVE.zip -d /to recover the stored Unix ownership and permissions. Validate the archive in an isolated directory before restoring.Respalda Proxymon en
BACKUP_DIR/pmbk_<YYYYMMDD_HHMMSS>.zip(BACKUP_DIR=/etc/bak/proxymonpor defecto), conservando hasta tres archivos ZIP.pmsetup.sh --installregistra la entrada mensual de cron automáticamente;pmsetup.sh --uninstallla elimina antes de quitar el proyecto. Restaure consudo unzip -X ARCHIVO.zip -d /para recuperar propietarios y permisos Unix almacenados. Valide el archivo en un directorio aislado antes de restaurar.
| Description | Descripción |
|---|---|
Project log: /var/log/proxymon.log. Installation and update configure daily rotation in /etc/logrotate.d/proxymon, keeping seven previous files plus the active log. Compression starts on the next rotation. Empty logs are not rotated; missing logs are tolerated. Squid and Apache keep their own policies. |
Log del proyecto: /var/log/proxymon.log. La instalación y la actualización configuran rotación diaria en /etc/logrotate.d/proxymon. Se conservan siete archivos anteriores y el activo. La compresión comienza en la siguiente rotación. Los logs vacíos no se rotan; los ausentes se toleran. Squid y Apache conservan sus propias políticas. |
/var/log/apache2/proxymon_access.log
/var/log/apache2/proxymon_error.log
/var/log/bandata.log # Rotated via /etc/logrotate.d/bandata
pmsetup.log # In pmsetup.sh's own directory, rewritten on each run
/etc/proxymon/tools/squidtool.log # In squidtool.sh's own directory, rewritten on each run| Description | Descripción |
|---|---|
Processing messages keep their timestamp and have no level or flag. STATUS is a viewer label, not text written in the log. Three trailing dots are reserved for these lines; other messages have no final period. |
Los mensajes de procesamiento conservan la fecha y no llevan nivel ni flag. STATUS es una etiqueta del visor; no se escribe en el log. Los tres puntos finales se reservan para estas líneas; los demás mensajes no llevan punto final. |
2026-10-17 12:00:00 Updating PHP...
2026-10-17 12:00:00 INFO: blockpatterns.txt: download failed; retry 2/3
2026-10-17 12:00:00 WARNING: blockpatterns.txt download failed -alert
2026-10-17 12:00:00 WARNING: pmbk.sh: monthly backup setup failed -alert
|
Part of Proxy Monitor reimplements selected functions from LightSquid, SARG, SqStat and SquidAnalyzer. These open-source tools no longer receive support or updates (EOL/EOS). We extend our special thanks to the developers who created these remarkable tools and devoted their time to building them. Without this foundation, the development of Proxy Monitor would not have been possible. |
Una parte de Proxy Monitor reimplementa funciones de LightSquid, SARG, SqStat y SquidAnalyzer. Estas herramientas de código abierto ya no reciben soporte ni actualizaciones (EOL/EOS). Agradecemos especialmente a los programadores que crearon estas magníficas herramientas y dedicaron su tiempo a desarrollarlas. Sin esta base, el desarrollo de Proxy Monitor no habría sido posible. |
| Original project / Developer | Last Official Version | Unofficial Update | Additional | Reimplemented in |
|---|---|---|---|---|
| LightSquid | v1.8-7 (2009) | v1.8.1 (2021) | Metro_tpl @semofajardo (2020) | squidreports |
| SARG | v2.4.0 (2020-01-16) | N/A | N/A | squidreports |
| Sqstat - Alex Samorukov | v1.20 (2006) | N/A | N/A | logview |
| SquidAnalyzer github | v6.6 (2017) | N/A | N/A | squidreports |
| This project is designed for use on a local network (LAN). It does not include the security hardening needed for direct exposure to the internet. If internet access is required, an on-demand tunnel is recommended instead of opening ports directly. This enables access when needed without leaving the server permanently exposed. | Este proyecto está diseñado para usarse en una red local (LAN). No cuenta con las medidas de seguridad necesarias para exponerlo directamente a Internet. Si se requiere acceso desde Internet, se recomienda utilizar un túnel bajo demanda en lugar de abrir puertos directamente. Así, el acceso se habilita cuando hace falta y el servidor no queda expuesto permanentemente. |
Optional tunnel:
This repository
|
Este repositorio
|
| This project uses a dual-licensing model to balance software freedom with content protection: | Este proyecto utiliza un modelo de licencia dual para equilibrar la libertad del software con la protección del contenido: |
| Content | Licensed Under |
|---|---|
| Scripts, Binaries, Infrastructure | |
| RAG, Workers, Specialized Modules, Docs |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.









































