---
date: 2021-07-28T00:13:24+02:00
description: "Installer et utiliser pfstat, pour analyser le flux réseau IPv4 et IPv6 au-travers du parefeu PF, sous OpenBSD !"
draft: false
tags: ['supervision','dataviz','pfstat','OpenBSD','httpd']
title: "pfstat sur OpenBSD : analyser le flux IPv4 et IPv6 dans PF"
translationKey: "monitor-pfstat-openbsd"
---
## 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 :
```cfg
set loginterface em0
```
{{< note info >}}
Si vous avez plusieurs interfaces réseaux, il est possible de toutes les
analyser ; ligne après ligne, ajoutez chacune d'elles, si nécessaire.
{{}}
### 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** :
```sh
# 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.
```cfg
* * * * * -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 :
```sh
# 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…
```sh
# 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 :
```sh
# 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 :
```cfg
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**
1. dans un premier temps, décommentons ou supprimons les écritures dans
la crontab de root,
2. pour paramétrer celle de l'utilisateur **_pfstat** :
- créer un fichier de crontab, tel que **crontab4pfstat**, contenant
les déclarations suivantes :
```conf
* * * * * -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** :
```sh
# crontab -u _pfstat crontab4pfstat
```
#### Surveillance de _pfstat
Il y a différents moyens de surveiller l'activité de l'utilisateur **_pfstat** :
- `top -U _pfstat` :
```sh
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
```
---
```sh
$ 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 :
```sh
# 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 :
```cfg
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 :
```sh
# 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 :
```sh
# 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](https://tildegit.org/hucste/pfstats/src/branch/main/README.md)
- Sous [Licence BSD 2 Clauses](https://tildegit.org/hucste/pfstats/src/branch/main/LICENSE)
Voici un aperçu :
{{< img a="Aperçu de la page 'pfstat.hml'" s="openbsd/pfstats.html.png" w="250" >}}
---
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
```sh
# usermod -G votre-identifiant-utilisateur _pfstat
# chmod 0750 /home/votre-identifiant-utilisateur/pfstats/convert-img.sh
```
{{< note info >}}
La génération des images au format AVIF est un peu lente ; ce qui n'est
pas le cas des images Webp. Cela dépend aussi de la puissance machine.
{{}}
### pfstats et crontab
Il faudra modifier la deuxième ligne de la crontab de l'utilisateur
**_pfstat**, tel que :
```cfg
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** :
```cfg
image/avif avif
```
Tel que :
```cfg
types {
include "/usr/share/misc/mime.types"
image/avif avif
}
```
⇒ Pour vérifier le support du format webp :
```sh
$ 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 : {{< inside "web/nginx/nginx-image-avif" >}}
- le format webp : {{< inside "web/nginx/nginx-image-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 :
- https://caniuse.com/avif
- https://caniuse.com/webp
---
- [https://oldblog.chown.me/blog/faire-des-graphes-a-partir-des-infos-de-pf.html](https://oldblog.chown.me/blog/faire-des-graphes-a-partir-des-infos-de-pf.html)
---