Le "scrubbing" est la normalisation de paquets utilisée pour
supprimer toute ambiguïté dans l'interprétation d'un
paquet qui sera effectuée par la destination finale de ce
dernier. La directive scrub réassemble aussi des paquets
fragmentés, afin de protéger certains systèmes
d'exploitation de quelques types d'attaques. Cette directive rejette
aussi les paquets TCP contenants des combinaisons invalides de
drapeaux. Voici un exemple simple
d'utilisation de la directive scrub :
scrub in all
Ceci aura pour effet d'appliquer le "scrub" sur tous les paquets en
entrée de chaque interface.
Il existe des cas où il ne faut pas appliquer le "scrub". Par
exemple, une interface qui véhicule du trafic NFS à
travers PF. Certaines plates-formes non basées sur OpenBSD
envoient (et s'attendent à recevoir) des paquets étranges
-- des paquets fragmentés avec le bit "do not fragment" (ne pas
fragmenter) positionné, qui sont rejetés (comportement
normal) par scrub. On peut résoudre ce problème
en utilisant l'option no-df. Un autre exemple est l'utilisation
de jeux multi-joueurs qui ont des problèmes de connexion à
travers PF lorsque scrub est activé. Mis à part
ces cas quelque peu inhabituels, la normalisation de paquets "scrub" est
une pratique hautement recommandée.
La syntaxe de la directive scrub est très similaire
à la syntaxe de filtrage ce qui rend
aisé la normalisation de certains paquets et pas les autres.
Le mot-clé no peut être utilisé devant la directive
scrub pour ne pas normaliser certains paquets.
La première règle correspondante est appliquée, comme pour les
règles nat.
Supprime le bit "don't fragment" de l'en-tête du paquet
IP. Quelques systèmes d'exploitation sont connus pour
générer des paquets fragmentés avec le bit
"don't fragment" positionné. Ceci est
particulièrement vrai dans le cas de NFS. scrub va
bloquer tous les paquets qui sont dans ce cas sauf si l'option
no-df est spécifiée. Vu que certains
systèmes d'exploitation génèrent des paquets
"don't fragment" avec un champ d'identification à
zéro au niveau de l'en-tête IP, il est
recommandé d'utiliser no-df conjointement avec
l'option random-id.
random-id
Remplace le champ d'identification IP des paquets avec des valeurs
aléatoires pour contourner les valeurs prévisibles utilisées par
certains systèmes d'exploitation. Cette option s'applique aux
paquets qui ne sont pas fragmentés après le réassemblage optionnel
des paquets.
min-ttl num
S'assure que le Time To Live (TTL) est au moins égal à
la valeur donnée en argument dans les en-têtes des
paquets IP.
max-mss num
S'assure que le Maximum Segment Size (MSS) est au plus égal
à la valeur donnée en argument dans les en-têtes
des paquets TCP.
fragment reassemble
Met dans une mémoire tampon les fragments de paquets et les
réassemble en paquet complet avant de les transmettre au
moteur de filtrage. Les règles de filtrage peuvent ainsi se
charger de filtrer le paquet complet sans se soucier des fragments.
L'inconvénient est la mémoire additionnelle
nécessaire pour le tampon contenant les fragments de paquets.
C'est le comportement par défaut lorsqu'aucune option
fragment n'est spécifiée. C'est aussi la
seule option fragment qui fonctionne avec la NAT.
fragment crop
Supprime les fragments dupliqués et tout chevauchement entre
fragment. Contrairement à fragment reassemble, les
fragments ne sont pas gardés en mémoire tampon mais
sont transmis dès leur arrivée.
fragment drop-ovl
Assez similaire à fragment crop. Tous les paquets
fragments de paquets dupliqués et se chevauchant sont
supprimés ainsi que tous les fragments suivants qui
correspondent à ces fragments.
reassemble tcp
Normalise de manière "stateful" les connexions TCP. Lorsque
scrub reassemble tcp est utilisée, une direction
(in/out) peut ne pas être spécifiée. Les
normalisations suivantes sont effectuées :
Aucune extrémité de la connexion n'est
autorisée à réduire le TTL IP. Cette
normalisation est appliquée pour assurer une
protection contre un attaquant qui envoie un paquet de telle
façon à ce que ce dernier atteigne le
pare-feu, affecte les informations d'état
mémorisées pour cette connexion et expire
avant d'atteindre sa destination finale. Le TTL de tous les
paquets est positionné à la valeur la plus
haute observée pour la connexion.
Module les "timestamps"
RFC1323 dans
l'en-tête des paquets TCP avec un nombre aléatoire. Ceci peut
empêcher un observateur de déduire le "uptime"
d'un hôte ou de deviner combien d'hôtes sont
derrière une passerelle NAT.
Exemples :
scrub in on fxp0 all fragment reassemble min-ttl 15 max-mss 1400
scrub in on fxp0 all no-df
scrub on fxp0 all reassemble tcp