FAQ BSDConsultez toutes les FAQ
Nombre d'auteurs : 6, nombre de questions : 127, dernière mise à jour : 20 novembre 2007 Ajouter une question
Cette FAQ a été réalisée à partir des contributions des membres du forum Unix de developpez.com et de l'équipe de rédaction.
Organisation : cette FAQ se compose de deux grandes parties. Une première, Questions générales, qui regroupe toutes les questions qui trouvent une réponse, commune ou non, pour l'ensemble des systèmes BSD. La deuxième est découpée en autant de sous-parties qu'il y a de systèmes BSD soit parce que la question est spécialisée soit parce que la réponse est incomplète pour qu'elle concerne chacun de ces systèmes.
Participer : nous sommes perpétuellement à l'écoute de vos suggestions et corrections, aussi mineures soient-elles. N'hésitez pas à nous en faire part par l'intermédiaire de la discussion prévue à cet effet .
Note : l'exactitude des informations figurant dans la présente FAQ sont autant que possible vérifiée avant intégration. Cependant, nous ne pouvons garantir l'absence de toute erreur, c'est pourquoi les auteurs ne pourront en aucun cas être tenus pour responsables.
- Où trouver de la documentation sur Packet Filter ?
- Comment utiliser Packet Filter ?
- Comment vérifier la syntaxe de ses règles ?
- Comment désactiver temporairement Packet Filter ?
- Comment créer une liste noire dynamique avec PF ?
- Comment rendre les entrées d'une table expirables ?
- Comment lire le résultat des règles sous le coup de la journalisation ?
- Comment gérer l'attribution d'adresses dynamique ?
- Quel est l'ordre à respecter au niveau des règles ?
Dans la documentation française d'OpenBSD : http://www.openbsd.org/faq/pf/fr/index.html .
De nombreux facteurs entrent en ligne de compte : le système utilisé et sa version ainsi que l'interaction souhaitée avec le noyau (intégré ou sous forme de modules) :
- FreeBSD : une version 5.3 au minimum est requise. Vous pouvez ensuite soit utiliser les modules soit intégrer, en ajoutant les options adéquates, Packet Filter au noyau.
Par contre, le support de la gestion de la bande passante (ALTQ) n'est pas disponible dans le cas de l'utilisation des modules. - NetBSD : le support de Packet Filter n'est pas encore complet et dépend énormément de votre version :
- Versions strictement inférieures à 2.0 : son utilisation n'est pas possible
- Versions 2.X : seul un module, que vous pourrez installer via les paquetages, est disponible
- Versions 3.X : vous avez le choix entre le module et l'intégration dans le noyau. En revanche un certain nombre de fonctionnalités sont indisponibles : ALTQ, carp et pfsync, le mot-clé group
- Versions 4.X (en développement) : identique aux versions 3.X mais les fonctionnalités non supportées sont limitées à pfsync et le mot-clé group reste sans effet.
- OpenBSD : apparu à la version 3.0, Packet Filter fait partie de son système de base (enfin pour être précis : intégré par le biais du noyau appelé generic).
Vous trouverez tous les détails à la mise en place de Packet Filter dans un tutoriel dédié : Activation de Packet Filter sur les systèmes BSD .
Avant de chercher à appliquer vos règles, il convient d'en vérifier au préalable leur syntaxe. Pour ce faire, combinez les options n (indiquant de les vérifier sans les charger) et f (suivie du fichier de règles à utiliser) de la commande pfctl :
Code linux : | Sélectionner tout |
pfctl -nf /root/pf.conf
La commande pfctl, liée à toutes les opérations sur Packet Filter prévoit une option pour désactiver le filtrage (comme le restant : translation d'adresse, etc) : il s'agit de -d.
Code linux : | Sélectionner tout |
pfctl -d
Code linux : | Sélectionner tout |
pfctl -e
- Déclarer dans la configuration de PF une table dont le contenu sera stocké dans un fichier (ici /etc/blacklist) :
Code : Sélectionner tout table <blacklist> file "/etc/blacklist"
- Toujours dans la configuration de PF, on ajoute une règle, l'une des premières, en entrée sur l'interface externe :
Code : Sélectionner tout 1
2# Ici l'interface externe est tun0 block in quick on tun0 from <blacklist>
- Enfin, pour ajouter dynamiquement une adresse sans avoir à redémarrer PF utiliser ces commandes (que vous pouvez simplifier en créant un script) :
Code linux : Sélectionner tout 1
2
3
4
5# Ici l'adresse IP à ajouter est 216.239.39.104 # Prise en compte dynamique de l'adresse IP par PF pfctl -t blacklist -T add 216.239.39.104 # Ajout de la nouvelle adresse IP à la liste noire pour le prochain démarrage de la machine ou de PF echo "216.239.39.104" >> /etc/blacklist
Il existe un petit logiciel appelé expiretable qui permet de supprimer toutes les adresses d'une table qui y ont été insérées depuis un certain délai.
- FreeBSD : ce programme est proposé par les ports dans la catégorie security. Il vous suffit donc de l'installer :
Code linux : Sélectionner tout 1
2
3
4
5
6# Par les logiciels portés cd /usr/ports/security/expiretable make install # Sous forme de paquet binaire pkg_add expiretable
- NetBSD : n'offrant ni port ni paquet il faudra le compiler à la main et procéder à quelques modifications :
Code linux : Sélectionner tout 1
2
3ftp http://expiretable.fnord.se/expiretable-0.6.tar.gz tar xzf expiretable-0.6.tar.gz cd expiretable-0.6
Code c : Sélectionner tout #include <sys/limits.h>
Code c : Sélectionner tout 1
2
3
4
5#ifndef __NetBSD__ #include <sys/limits.h> #else #include <machine/limits.h> #endif
Code c : Sélectionner tout 1
2if (setgroups(1, &pw->pw_gid) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) {
Code c : Sélectionner tout 1
2if (setgroups(1, &pw->pw_gid) || setgid(pw->pw_gid) || setegid(pw->pw_gid) || setuid(pw->pw_uid) || seteuid(pw->pw_uid)) {
Code linux : Sélectionner tout 1
2make make PREFIX=/usr/pkg install
- OpenBSD, propose lui aussi cet utilitaire par le biais des logiciels portés (catégorie sysutils). L'installation se fait comme suit :
Code linux : Sélectionner tout 1
2
3
4
5
6# Par les logiciels portés cd /usr/ports/sysutils/expiretable make install # Sous forme de paquet binaire pkg_add expiretable
Vous pouvez à présent l'utiliser. Ci-dessous la ligne de commande qui lance expiretable en tant que tâche de fond (options -d et -p) dont le but est de vérifier et supprimer tous les jours (option -t et sa valeur 1d pour un jour) les entrées de la table nommée http_bans :
Code linux : | Sélectionner tout |
expiretable -d -p -t 1d http_bans
La version 4.1 d'OpenBSD introduit la nouvelle sous-commande expire à la commande pfctl et son option -T, qui permet d'arriver aux mêmes résultats qu'expiretable mais manuellement (à moins d'utiliser cron). Exemple pour supprimer toutes les entrées qui ont plus de cinq minutes (300 secondes) : |
Code linux : | Sélectionner tout |
pfctl -t une_table -T expire 300
Pour lire un journal généré par pflog (assimilable à la commande cat) :
Code linux : | Sélectionner tout |
tcpdump -n -e -ttt -r /var/log/pflog
Code linux : | Sélectionner tout |
tcpdump -n -e -ttt -i pflog0
Comme toute interface, vous avez la possibilité d'ajouter à la commande tcpdump un filtre. Par exemple pour ne voir que tout ce qui est à destination de votre serveur HTTP et qui est autorisé à passer par Packet Filter :
Code linux : | Sélectionner tout |
tcpdump -n -e -ttt -i pflog0 inbound and dst port 80 and action pass
Packet Filter a prévu un moyen permettant de faire référence à l'adresse d'une interface qui est dynamiquement attribuée (tel DHCP). Il vous suffit en effet, là où une adresse est attendue, comme dans les parties from et to d'une règle de filtrage, d'entourer le nom de l'interface en question de parenthèses. Ainsi, Packet Filter se chargera de mettre à jour les règles et ne nécessitera aucune intervention de votre part. Illustration :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ##### Macros ##### tcpflags = "flags S/SFRA" if = "fxp0" # Nom de l'interface, ici elle est adressée par DHCP ##### Règles ##### # Par défaut : tout bloquer block log all # Trafic sortant # DHCP (nous n'avons pas encore d'adresse d'où le any dans la partie from) pass out quick on $if inet proto tcp from any port bootpc \ to any $tcpflags keep state # HTTP(S) pass out quick on $if inet proto tcp from ($if) \ to any port { http https } $tcpflags keep state # DNS pass out quick on $if inet proto udp from ($if) \ to any port domain keep state |
C'est le seul mécanisme offert par Packet Filter pour faire référence à une adresse dynamique. Les tables par exemple, contiendraient l'adresse de l'interface au moment de son insertion, elle ne sera jamais réactualisée par la suite. |
L'ensemble de vos règles doit suivre un certain ordre. Certains types d'entre elles doivent apparaître avant d'autres. L'organisation à respecter est la suivante :
- Les options (introduites par le mot clé set)
- La normalisation des paquets (scrub)
- La gestion de la bande passante : configuration et déclarations (altq puis queue)
- La traduction d'adresses (nat)
- Les redirections de trafic (rdr)
- Le filtrage (pass et block)
Si celle-ci n'est pas respectée pfctl vous l'indiquera par le message d'erreur suivant :
Code : | Sélectionner tout |
Rules must be in order: options, normalization, queueing, translation, filtering
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.