%

pfstat sur OpenBSD : analyser le flux IPv4 et IPv6 dans PF

Article publié, le et modifié le
8 minutes de lecture

Cet article contient 1600 mots.
Source brute de l'article :
Commit version : 4bd1058

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.


⇒ 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
Info

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

  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 :
*  * * * * -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.

Voici un aperçu :

Aperçu de la page 'pfstat.hml'
Aperçu de la page 'pfstat.hml'

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
Info

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 :

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 :