rss logo

Comment mettre en place un filtrage géographique sur OpenBSD avec PacketFilter

OpenBSD Logo

Je m'appuie régulièrement sur le système d’exploitation OpenBSD, réputé pour sa robustesse et sa sécurité, accompagné de son puissant pare-feu PacketFilter, pour protéger mes services. De nombreuses solutions commerciales proposent un filtrage géographique, ce qui m’a donné envie d’implémenter une fonctionnalité similaire directement dans ce système.

Grâce au filtrage géographique, nous pouvons restreindre l'accès à nos services en fonction de la localisation géographique, les rendant ainsi invisibles pour certaines régions et renforçant considérablement la sécurité globale de notre réseau.

Pour cela, nous utiliserons le mécanisme de tables de PacketFilter, associé à des listes d’adresses IP par pays fournies par ipdeny.com.

Format des listes de pays

Les listes de blocs d’adresses IP par pays fournies par ipdeny.com suivent un modèle d’URL cohérent : https://www.ipdeny.com/ipblocks/data/countries/COUNTRY_CODE.zone

Par exemple, pour obtenir la liste des États-Unis (code pays us), vous pouvez utiliser l’URL suivante : https://www.ipdeny.com/ipblocks/data/countries/us.zone.

  • Pour tĂ©lĂ©charger une liste d’IP spĂ©cifique Ă  un pays dans le rĂ©pertoire /etc/tables, utilisez la commande wget suivante :
root# wget --no-check-certificate https://www.ipdeny.com/ipblocks/data/countries/us.zone -O /etc/tables/us.zone
  • Vous pouvez vĂ©rifier le nombre d’entrĂ©es dans le fichier avec la commande suivante :
root# wc -l /etc/tables/us.zone
65296 /etc/tables/us.zone

Ce nombre est important car il reflète le nombre de blocs IP chargés dans la table. Heureusement, cela reste largement en dessous de la limite par défaut de table-entries, fixée à 200000 dans la configuration de PF d’OpenBSD (voir la documentation officielle ici).

Définir les règles PacketFilter

Maintenant que notre liste de filtrage géographique est en place, nous pouvons définir les règles de filtrage appropriées dans PacketFilter.

  • Par exemple, la configuration suivante permet uniquement aux adresses IP situĂ©es aux États-Unis d'accĂ©der Ă  notre serveur web :
wan = "em0"  # Assigns the network interface 'em0' to the variable 'wan'

# Sets the maximum number of entries allowed in the PF table to 200,000 (which is already the default)
set limit table-entries 200000

# Creates a new PF table named 'USA' and loads its contents from the file '/etc/tables/us.zone'
table <USA> persist file "/etc/tables/us.zone"

# Allows incoming HTTP traffic from the 'USA' table to the IP address 192.168.1.10 on ports 80 and 443
pass in quick on { $wan } proto tcp from <USA> to 192.168.1.10 port { 80, 443 }

# Blocks incoming HTTP traffic from any source to the IP address 192.168.1.10 on ports 80 and 443
block in quick on { $wan } proto tcp from any to 192.168.1.10 port { 80, 443 }
  • Rechargez les règles de PacketFilter pour appliquer les modifications :
root# pfctl -f /etc/pf.conf

La suite?

Pour maintenir le fichier /etc/tables/us.zone à jour, vous pouvez automatiser son téléchargement à l’aide d’une entrée crontab. Pour des instructions détaillées, consultez mon tutoriel séparé ici.