Grapher l’activité de PF grâce à pfstat

Aujourd’hui, point de bidouille, point de manipulations absconses, mais plutôt de jolis graphiques où l’on voit avec tendresse s’ébattre notre pare-feu OpenBSD PF.

Comment celà peut-il être dans le domaine du possible ? Tout simplement grâce à l’outil pfstat, écrit par le créateur de PF lui-même.

Afin de ne pas vous perdre en cours de lecture pour cause de démotivation devant les sigles cryptiques et autres incantations shellmaniques qui parsèment comme à l’accoutumée mes billets techniques, voici un aperçu de ce que nous allons obtenir:

Pfstat Screenshot

Pfstat Screenshot

Passons donc maintenant dans le vif du sujet. Nous allons créer les graphiques montrants les octets que PF à laissé passer sur l’interface sis0, ainsi que les packets passés et bloqués sur cette même interface sur une période de 24 heures.

Tout d’abord il faut installer pfstat:

# pkg_add -r pfstat

Puis on créé un fichier de configuration adéquat /usr/local/etc/pfstat.conf contenant ceci:

#On indique l’interface réseau, l’état, l’unité de mesure, le sens, le protocole, et si les données sont différentielles pour chaque valeur.

collect 1 = interface “sis0″ pass bytes in ipv4 diff
collect 2 = interface “sis0″ pass bytes out ipv4 diff

#On indique le chemin complet de l’image générée par pfstat, et qui sera affichée par notre serveur web
image “/usr/local/www/data/pfstat/images/pfstat-bandwidth-day.png”      {

#On donne la période affichée et la taille de l’image générée en pixels
from 24 hours to now
width 1000 height 400

#On dit ce qu’on affiche comme données dans notre image

#L’axe Y du graphique “1″ (voir “collect 1″ plus haut) se trouvera à gauche, les données sont de type bps, puis viennent les options pour la légende (nom du graphe, unité de mesure et couleur)
left
graph 1 bps “in” “byte/s” color 0 192 0 filled
right
graph 2 bps “out” “byte/s” color 0 0 255
}

#Les même graphiques que précédemment, mais en générant une image plus petite. Seuls les noms de l’image générée, et la taille de l’image en pixels change. De même on peut créer les graphiques pour la semaine, le mois et l’année passée en modifiant l’option “from”
image “/usr/local/www/data/pfstat/images/pfstat-bandwidth-day-small.png”        {
from 24 hours to now
width 500 height 200
left
graph 1 bps “in” “byte/s” color 0 192 0 filled
right
graph 2 bps “out” “byte/s” color 0 0 255
}

#On procède de la même manière avec les paquets, mais on y ajoute les paquets bloqués (ce qui n’avait pas sens dans les premiers graphiques qui eux affichent des octets)
collect 3 = interface “sis0″ pass packets in ipv4 diff
collect 4 = interface “sis0″ pass packets out ipv4 diff
collect 5 = interface “sis0″ block packets in ipv4 diff
collect 6 = interface “sis0″ block packets out ipv4 diff
image “/usr/local/www/data/pfstat/images/pfstat-packets-day.png”        {
from 24 hours to now
width 1000 height 400
left
graph 3 “pass in” “pkt/s” color 0 192 0 filled,
graph 4 “pass out” “pkt/s” color 0 0 255
right
graph 5 “block in” “pkt/s” color 255 0 0,
graph 6 “block out” “pkt/s” color 192 192 0
}
image “/usr/local/www/data/pfstat/images/pfstat-packets-day-small.png”  {
from 24 hours to now
width 500 height 200
left
graph 3 “pass in” “pkt/s” color 0 192 0 filled,
graph 4 “pass out” “pkt/s” color 0 0 255
right
graph 5 “block in” “pkt/s” color 255 0 0,
graph 6 “block out” “pkt/s” color 192 192 0
}

Bien sûr, il y a beaucoup d’autres possibilités, comme grapher les files d’attentes, les états. La page pfstat de l’auteur en montre un bon panel.

Mais revenons à nos affaires. Il nous faut maintenant créer le répertoire ou seront hebergées la page web d’affichage de nos graphiques ainsi que les images:

# mkdir -p /usr/local/www/data/pfstat/images

Puis on vérifie que ça fonctionne:

# pfstat -q -p

Cette commande demande à pfstat de compiler les statistiques de pf(4) pour l’instant t et de créer les graphiques correspondant à l’emplacement renseigné dans notre fichier de configuration. On peut vérifier le bon fonctionnement par la présence d’un fichier /var/db/pfstat.db ainsi que celle des graphiques.

# ls -l /var/db/pfstat.db
-rw——-  1 root  wheel  8192 Feb  6 08:41 /var/db/pfstat.db
# ls -l /usr/local/www/data/pfstat/images/
total 846
-rw-r–r–  1 root  wheel  24063 Feb  6 08:41 pfstat-bandwidth-day-small.png
-rw-r–r–  1 root  wheel  64065 Feb  6 08:41 pfstat-bandwidth-day.png
-rw-r–r–  1 root  wheel  27066 Feb  6 08:41 pfstat-packets-day-small.png
-rw-r–r–  1 root  wheel  66568 Feb  6 08:41 pfstat-packets-day.png

Maintenant que ça fonctionne, on automatise la récolte des statistiques de pf(4) grâce à une simple tâche cron(8). Ajoutons ceci dans /etc/crontab:

*    *    *    *    *    root    /usr/local/bin/pfstat -q -p -t 31:365

L’option -t, permet à pfstat de compresser les donnés vieilles de plus d’un mois et d’effacer celles de plus d’un an. Ainsi notre base /var/db/pfstat.db ne devrait pas grossir exagérément.

Il ne reste plus qu’à afficher tous ces jolis graphiques sur une page html (ou autre).

Par exemple:

Configuration Apache 2.2

Créer un fichier /usr/local/etc/apache22/Includes/pfstat.conf contenant

Alias /pfstat /usr/local/www/data/pfstat
DocumentRoot “/usr/local/www/data/pfstat”
<Directory “/usr/local/www/data/pfstat”>
DirectoryIndex index.html
Order deny,allow
Allow from all
Satisfy Any
</Directory>

Créer un fichier /usr/local/www/data/pfstat/index.html contenant


<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>




<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=US-ASCII”>
<title>PF Firewall Statistics</title>

</head>

<body text=”#000000″ bgcolor=”#FFFFFF” link=”#1919C0″ vlink=”#101030″ alink=”#FE0000″>

<h1>PF Firewall Statistics for sis0 interface</h1>

<h2>interface sis0 pass bytes ipv4, Bytes/s</h2>
<h3>Daily statistics</h3>
<a href=”images/pfstat-bandwidth-day.png”><img src=”images/pfstat-bandwidth-day-small.png” border=”0″></a>
<p>

<h2>interface sis0 pass/block packets ipv4, Packets/s</h2>
<h3>Daily statistics</h3>
<a href=”images/pfstat-packets-day.png”><img src=”images/pfstat-packets-day-small.png” border=”0″></a>
<p>

</body>

</html>




N’oublions pas de recharger la configuration d’apache:

# /usr/local/etc/rc.d/apache22 reload

Vous pouvez bien sûr vous inspirer ma de propre page pfstat pour compléter le tout.

A bientôt chers (et de plus en plus nombreux) lecteurs ;)


Feb11

2 Responses to “Grapher l’activité de PF grâce à pfstat”

  1. Merci beaucoup, excellent ce tuto rapide ! Juste une correction sur le cron, vu que j’ai mis mon fichier de conf dans /etc, j’ai du aussi ajouter -c /etc/pfstat.conf

    Voila :) Bonne continuation

  2. [...] Un petit tutoriel proposé par Laurent Cligny sur son site pour apprendre à PF à faire des graphiques, et voir, comme il le dit si bien “[...]avec tendresse s’ébattre notre pare-feu OpenBSD PF.[...]“. [...]

Leave a Reply

You must be logged in to post a comment.