IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

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.

SommaireQuestions généralesRéseauPacket Filter (9)
précédent sommaire suivant
 

Dans la documentation française d'OpenBSD : http://www.openbsd.org/faq/pf/fr/index.html .

Mis à jour le 1er août 2007 julp

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 .

Mis à jour le 1er août 2007 julp

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
Il vous indiquera ainsi si celles-ci contiennent des erreurs et leur ligne.

Mis à jour le 1er août 2007 julp

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
Pour ensuite réactiver l'effet des règles courantes, utilisez l'option inverse, -e :

Code linux : Sélectionner tout
pfctl -e
Soyez conscients que sur la période où Packet Filter est totalement désactivé, vous êtes plus que jamais vulnérables.

Mis à jour le 1er août 2007 julp

  • 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

Mis à jour le 1er août 2007 julp

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
    3
    ftp http://expiretable.fnord.se/expiretable-0.6.tar.gz 
    tar xzf expiretable-0.6.tar.gz 
    cd expiretable-0.6
    Editez expiretable.c, pour remplacer :

    Code c : Sélectionner tout
    #include <sys/limits.h>
    Par :

    Code c : Sélectionner tout
    1
    2
    3
    4
    5
    #ifndef __NetBSD__ 
    #include <sys/limits.h> 
    #else 
    #include <machine/limits.h> 
    #endif
    Ainsi que :

    Code c : Sélectionner tout
    1
    2
            if (setgroups(1, &pw->pw_gid) || setegid(pw->pw_gid) || setgid(pw->pw_gid) 
                            || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) {
    Par :

    Code c : Sélectionner tout
    1
    2
            if (setgroups(1, &pw->pw_gid) || setgid(pw->pw_gid) || setegid(pw->pw_gid) 
                            || setuid(pw->pw_uid) || seteuid(pw->pw_uid)) {
    Lancez la compilation et installez-le :

    Code linux : Sélectionner tout
    1
    2
    make 
    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

Mis à jour le 1er août 2007 julp

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
Pour voir en temps réel les actions du pare-feu, on recourt à l'interface pflog (comparable à tail) :

Code linux : Sélectionner tout
tcpdump -n -e -ttt -i pflog0
pflog doit bien évidemment être actif pour pouvoir être utilisé et les règles qui nous intéressent être marquées du mot-clé log.

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

Mis à jour le 1er août 2007 julp

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.

Mis à jour le 20 novembre 2007 julp

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
Les macros et les tables peuvent être déclarées à n'importe quel endroit, l'essentiel étant qu'elles soient définies avant leur premier emploi.

Mis à jour le 20 novembre 2007 julp

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2022 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.