Comment bloquer des IP avec une liste noire grâce aux tables PF sur OpenBSD
- Mise Ă jour le 02 mai 2026
Ce tutoriel explique comment utiliser le Packet Filter d’OpenBSD (PF) pour bloquer des adresses IP et des plages CIDR chargées depuis une liste noire externe. Le résultat est comparable, dans l’esprit, à PeerBlock sous Windows : les adresses présentes dans un fichier sont chargées dans une table PF puis bloquées par des règles du pare-feu.
Configuration
- Système : OpenBSD 7.8
- Pare-feu : Packet Filter (PF)
- Hôte protégé (exemple) :
192.168.1.10 - Fichier de liste noire :
/etc/blocklist
Commandes
Télécharger une liste noire
Vous pouvez télécharger des listes de blocage depuis iBlocklist. Par exemple, téléchargez la liste PrimaryThreats ici. Une fois téléchargée, extrayez et formatez le fichier afin de le rendre compatible avec le Packet Filter d’OpenBSD (PF).
- Télécharger la liste :
root# wget "URLtomyremotelist" -O list.zip
- Extraire la liste :
root# unzip file.zip
- Formater la liste :
root# cut -d ":" -f2 list.txt | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" > blocklist.tmp
root# sed -i 's/-/:/' blocklist.tmp
root# for i in $(cat blocklist.tmp); do echo "$i"; ipcalc -r "$i" | grep "/" >> blocklist; done
- Copier le fichier blocklist vers
/etc/blocklist:
root# cp blocklist /etc/blocklist
Configuration de Packet Filter
Ajoutez une table ainsi que les règles associées dans /etc/pf.conf. Cet exemple bloque le trafic provenant des adresses de la liste noire vers l’hôte protégé, ainsi que le trafic sortant de cet hôte vers ces mêmes adresses.
wan = "em0"
lan = "em1"
protected_host = "192.168.1.10"
# Augmente le nombre maximal d’adresses stockables dans les tables PF.
set limit table-entries 1000000
# Charge la liste noire externe dans une table persistante.
table <blocklist> persist file "/etc/blocklist"
pass out on $wan
pass in quick on $lan inet proto tcp from $protected_host to any port { 80 443 }
block in quick log on $wan from <blocklist> to $protected_host
block out quick log on $wan from $protected_host to <blocklist>
Valider et recharger PF
- Vérifier la syntaxe avant de charger la configuration :
root# pfctl -nf /etc/pf.conf
- Recharger PF si la vérification est correcte :
root# pfctl -f /etc/pf.conf
- Afficher le contenu de la table chargée :
root# pfctl -t blocklist -T show | more
Mettre à jour la liste noire sans recharger toutes les règles
Après avoir généré un nouveau fichier /etc/blocklist, vous pouvez remplacer uniquement le contenu de la table :
root# pfctl -t blocklist -T replace -f /etc/blocklist
Journalisation
Les règles d’exemple utilisent le mot-clé log, ce qui permet de surveiller les paquets correspondants via l’interface pflog0 avec tcpdump :
-n: ne pas résoudre les adresses IP en noms d’hôtes-e: afficher les en-têtes de couche liaison-ttt: afficher les horodatages avec la date et l’heure
root# tcpdump -n -e -ttt -i pflog0