Description
pfstat est un projet de Daniel Hartmeir pour générer des statistiques graphiques du flux réseau qui passe au-travers du parefeu PF.
- Site web officiel : https://www.benzedrine.ch/pfstat.html
⇒ Environnement :
- OpenBSD : 6.9 ⇒ 7.1
Installation
Classique : # pkg_add pfstat pfstatd
Le paquet pfstatd n’est pas essentiel pour une configuration simple et minimale. Il devient intéressant pour être fonctionner avec un utilisateur dédié. ;-)
Configuration
PF
En admettant que l’interface réseau est de type em0, modifions le fichier
de configuration /etc/pf.conf
pour ajouter :
set loginterface em0
pfstat
La configuration de pfstat n’est pas compliquée. Pour débuter, le package installe un fichier de configuration exemple, juste pour IPv4.
- Fichier de configuration :
/etc/pfstat.conf
Il faut le modifier pour changer le chemin du répertoire de destination où seront les futures images créées pour la vision et l’analyse.
En admettant toujours que l’interface reseau à analyser est em0 :
# sed -i -e 's/sis0/em0/g;s/benzedrine.cx/pfstat/g' /etc/pfstat.conf
La commande va changer toutes les lignes où :
- l’interface sis0 par em0
- le chemin de publication contenant benzedrine.cx par pfstat.
Ensuite, il suffit de configurer la crontab de root pour que le binaire pfstat analyse le flux réseau.
* * * * * -ns /usr/local/bin/pfstat -q -d /var/db/pfstat/pfstat.db
*/15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db
30 0 * * * -ns /usr/local/bin/pfstat -t 30 -d /var/db/pfstat/pfstat.db
- la première ligne fonctionne toutes les minutes pour analyser et enregistrer
- la seconde ligne a pour propos de générer les images toutes les quinze minutes depuis la base de données de pfstat
- la troisième ligne aura pour propos d’effacer toutes les jours à 0:30 les données qui sont vieilles de plus de trente jours.
⇒ Cela nécessite la création du répertoire de la future base de données :
# mkdir -p /var/db/pfstat/
Juste pour info, cela peut être absolument un tout autre chemin sur le système d’exploitation, et avoir un tout autre nom de base de données. C’est à vous de voir…
Voilà une configuration minimale fonctionnelle !
Passons à une configuration plus poussée avec un utilisateur dédié qui va gérer et le service et l’utilisation du binaire.
Utilisateur _pfstat
L’utilisateur dédié nous sera utile pour démarrer le service pfstatd avec les droits utilisateurs de _pfstat, puis d’utiliser pfstat avec cet utilisateur…
# useradd -s /sbin/nologin -d /var/db/pfstat _pfstat
# chown _pfstat /var/db/pfstat
pfstatd
Il suffit d’activer le service, de le paramétrer et le démarrer :
# rcctl enable pfstatd
# rcctl set pfstatd flags -u _pfstat -a 127.0.0.1
# rcctl start pfstatd
N’ayant pas paramétré de numéro de port, c’est celui par défaut, à savoir 9999, qui sera écouté.
Des outils comme nc peuvent permettre de s’assurer du fonctionnement ;
essayez nc localhost 9999
, vous devriez avoir les statistiques qui
s’affichent rapidement les unes à les suites des autres, ligne après ligne.
Si ce n’est pas le cas, il y a un soucis…
pfstatd et PF
Je vous encourage vivement à bloquer au niveau du pare-feu d’OpenBSD, toutes tentatives de communications sur le service de pfstatd !
Une règle comme la suivante devrait suffire :
block drop in on ! lo0 proto tcp to port 9999
pfstat et _pfstat
Maintenant nous allons pouvoir reconfigurer l’utilisation de pfstat en tenant compte de l’utilisateur dédié _pfstat
- dans un premier temps, décommentons ou supprimons les écritures dans la crontab de root,
- pour paramétrer celle de l’utilisateur _pfstat :
- créer un fichier de crontab, tel que crontab4pfstat, contenant les déclarations suivantes :
* * * * * -ns /usr/local/bin/pfstat -q -d /var/db/pfstat/pfstat.db -r 127.0.0.1
*/15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db
30 0 * * * -ns /usr/local/bin/pfstat -t 30 -d /var/db/pfstat/pfstat.db
Petites explications :
- Remarquez l’usage de l’option
-r
suivie de l’adresse de bouclage localhost ; cette option nous permet d’interroger le service “à distance” pour récupèrer les statistiques et les enregistrer dans la base de données.
Maintenant injections le fichier crontab4pfstat dans la crontab de l’utilisateur _pfstat :
# crontab -u _pfstat crontab4pfstat
Surveillance de _pfstat
Il y a différents moyens de surveiller l’activité de l’utilisateur _pfstat :
top -U _pfstat
:
load averages: 0.05, 0.38, 0.38
56 processes: 54 idle, 2 on processor
CPU0 states: 0.0% user, 0.0% nice, 0.0% sys, 0.0% spin, 0.0% intr, 100% idle
Memory: Real: 84M/5985M act/tot Free: 9778M Cache: 2757M Swap: 0K/32G
PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND
16833 _pfstat 2 0 700K 984K sleep/6 netcon 0:00 0.00% pfstatd
$ fstat -u _pfstat -n
USER CMD PID FD DEV INUM MODE R/W SZ|DV
_pfstat pfstatd 16833 wd 4,0 2 40755 r 512
_pfstat pfstatd 16833 0 4,0 27162 20666 rw 2,2
_pfstat pfstatd 16833 1 4,0 27162 20666 rw 2,2
_pfstat pfstatd 16833 2 4,0 27162 20666 rw 2,2
_pfstat pfstatd 16833 3 4,0 27028 20600 r 73,0
_pfstat pfstatd 16833 4* internet stream tcp 0x0 127.0.0.1:9999
$ ps aux -U _pfstat
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
_pfstat 16833 0.0 0.0 700 984 ?? I 1:19AM 0:00.02 /usr/local/bin/pfstatd -u _pfstat -a 127.0.0.1
Ces trois commandes nous confirment que :
- le service pfstatd est démarré avec l’utilisateur _pfstat
- le service pfstatd écoute bien sur la boucle locale, sur le port 9999 et qu’il est en attente de connexion, dans le cas de ces exemples.
Configurons maintenant httpd !
httpd
Commençons par créer le répertoire :
# mkdir -p /var/www/htdocs/pfstat/
Puis occupons-nous du fichier de configuration de httpd /etc/httpd.conf
et ajoutons les déclarations suivantes, au besoin :
types {
include "/usr/share/misc/mime.types"
}
server "pfstat" {
listen on 127.0.0.1 port 80
location "/pfstat/" {
directory auto index
root "/htdocs/"
}
}
Il reste à vérifier la configuration et activer/démarrer le service :
# rcctl enable httpd
# httpd -n && rcctl start httpd
Il ne reste plus qu’à consulter localement, tel que : http://localhost/pfstat
Voilà une configuration minimale qui fonctionne et qui restituera des images.
httpd et _pfstat
Du fait d’avoir créé l’utilisateur _pfstat, donnons à l’utilisateur le droit d’écrire dans le répertoire web :
# usermod -G www _pfstat
# chown -R _pfstat:www /var/www/htdocs/pfstat
- ainsi nous intégrons l’utilisateur _pfstat au groupe web www
- cela nous permet ensuite de pouvoir écrire dans le répertoire web
PFstats
PFstats est mon petit projet de page responsive web pour consulter de manière agréable les images générées par pfstat.
Elle est conçue pour analyser des statistiques d’une heure, quotidiennes, hebdomadaires, et mensuelles, voire annuelles.
- dépôt : https://tildegit.org/hucste/pfstats
- N’hésitez pas à lire le fichier README.md
- Sous Licence BSD 2 Clauses
Voici un aperçu :
Quelques explications :
pfstat.conf
⇒ Le fichier de configuration pfstat.conf est configuré :
- pour analyser IPv4 et IPv6, au-travers de l’interface réseau em0, Modifier l’interface par la vôtre.
- pour restituer des graphiques d’une heure, quotidien, hebdomadaire, et mensuel.
- et pour publier vers le répertoire de publication web
/var/www/htdocs/pfstat
.
Il faut le copier à la place du fichier de configuration original.
Si vous analysez le fichier correctement, j’ai commenté toutes les lignes
concernant le traitement des queues ; en effet quand les lignes sont actives,
pfstat se plaint et s’arrête avec le message suivant :
/etc/pfstat.conf:61: ALTQ-style queues not supported anymore
Il semble que ce ne soit plus supporté !
pfstat.html
Copier les fichiers .css, .js, et .html dans le répertoire de publication web
convert-img.sh
⇒ Ce script shell sert à convertir les images JPEG générées par pfstat au format avif, et webp.
Il nécessite l’installation des paquets libavif, et libwebp.
- Ajoutez l’utilisateur _pfstat au groupe de votre utilisateur, puis
- donnez les droits nécessaires sur le script shell
# usermod -G votre-identifiant-utilisateur _pfstat
# chmod 0750 /home/votre-identifiant-utilisateur/pfstats/convert-img.sh
pfstats et crontab
Il faudra modifier la deuxième ligne de la crontab de l’utilisateur _pfstat, tel que :
15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db; /dir/convert-img.sh
Ainsi se déroulent les étapes suivantes :
- la création des images se fait à l’heure programmée
- le script de conversion d’images s’exécute
pfstats et httpd
Pour gérer correctement les images au format avif et webp, il peut être nécessaire de modifier légérement la configuration d’httpd, pour ajouter dans le bloc de directives types :
image/avif avif
Tel que :
types {
include "/usr/share/misc/mime.types"
image/avif avif
}
⇒ Pour vérifier le support du format webp :
$ grep webp /usr/share/misc/mime.types
image/webp webp
Si la commande n’affiche aucun résultat, alors il faudra ajouter au bloc
types : image/webp webp
.
Depuis OpenBSD 6.9, ce n’est pas nécessaire.
pfstats et nginx
Si vous êtes plutôt un fan de nginx, lisez mes articles suivants pour savoir comment gérer :
- le format avif : Nginx gère les images au format AVIF
- le format webp : Nginx gère les images au format Webp
Il vous suffit d’adapter la configuration pour la consultation de la page web de pfstats.
Dépannage
ALTQ-style queues not supported anymore
Le message complet est le suivant :
/etc/pfstat.conf:61: ALTQ-style queues not supported anymore
Il semble que l’analyse des queues ne soit plus possible. Supprimez ou commentez toutes lignes relatives.
Dans le fichier de configuration que je fournis, elles sont commentées, juste au cas où ce serait une erreur de compréhension ou qu’il me manque une information pour les rendre fonctionnelles.
dbopen: /var/db/pfstat/pfstat.db: No such file or directory
Avez-vous bien pensé à créer le répertoire ; vérifiez !
Voilà !
Documentations
⇒ Projet PFstats : https://tildegit.org/hucste/pfstats
⇒ Qui supportent ces formats :