Sophie

Sophie

distrib > * > 2010.0 > * > by-pkgid > a412ceb851151854794ced2a242192bb > files > 3812

howto-html-fr-20080722-1mdv2010.0.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Filtres hachés pour un filtrage massif très rapide</title><link href="style.css" rel="stylesheet" type="text/css" /><meta content="DocBook XSL Stylesheets V1.73.2" name="generator" /><link rel="start" href="index.html" title="HOWTO du routage avancé et du contrôle de trafic sous Linux" /><link rel="up" href="ch12.html" title="Chapitre 12. Filtres avancés pour la (re-)classification des paquets" /><link rel="prev" href="ch12s03.html" title="Les filtres de réglementation (Policing filters)" /><link rel="next" href="ch12s05.html" title="Filtrer le trafic IPv6" /></head><body><div class="navheader"><table summary="Navigation header" width="100%"><tr><th align="center" colspan="3">Filtres hachés pour un filtrage massif très rapide</th></tr><tr><td align="left" width="20%"><a accesskey="p" href="ch12s03.html">Précédent</a> </td><th align="center" width="60%">Chapitre 12. Filtres avancés pour la (re-)classification des paquets</th><td align="right" width="20%"> <a accesskey="n" href="ch12s05.html">Suivant</a></td></tr></table><hr /></div><div class="sect1" lang="fr"><div class="titlepage"><div><div><h2 class="title"><a id="lartc.adv-filter.hashing" />Filtres hachés pour un filtrage massif très rapide</h2></div></div></div><p>Si vous avez besoin de milliers de règles, par exemple, dans le cas où
vous avez beaucoup de clients ou d'ordinateurs, tous avec des spécifications
<acronym class="acronym">QoS</acronym> différentes, vous pourrez constater que le noyau passe
beaucoup de temps à analyser toutes ces règles.
</p><p>Par défaut, tous les filtres résident dans une grande chaîne qui est
analysée par ordre décroissant des priorités.
Si vous avez 1000 règles, 1000 contrôles peuvent être nécessaires pour 
déterminer ce qu'il faut faire d'un paquet.
</p><p>La vérification irait plus vite s'il y avait 256 chaînes avec
chacune quatre règles et si vous pouviez répartir les paquets sur ces 256 
chaînes, afin que la bonne règle soit présente.
</p><p>Ceci est rendu possible par le hachage.
Imaginons que vous ayez sur votre réseau 1024 clients avec des modems câble,
avec des adresses IP allant de <code class="literal">1.2.0.0</code> à 
<code class="literal">1.2.3.255</code>, et que chacun doit avoir un classement 
particulier, par exemple « <span class="quote">pauvre</span> », « <span class="quote">moyen</span> » et 
« <span class="quote">bourrage</span> ».
Cela vous ferait alors 1024 règles, dans le genre :
</p><pre class="screen"># tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \
  1.2.0.0 classid 1:1
# tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \
  1.2.0.1 classid 1:1
...
# tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \
  1.2.3.254 classid 1:3
# tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \
  1.2.3.255 classid 1:2
</pre><p>Pour aller plus vite, nous pouvons utiliser la dernière partie de 
l'adresse IP comme « <span class="quote">clé de hachage</span> ».
Nous obtenons alors 256 tables, la première ressemblant à ceci :
</p><pre class="screen"># tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \
  1.2.0.0 classid 1:1
# tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \
  1.2.1.0 classid 1:1
# tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \
  1.2.2.0 classid 1:3
# tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \
  1.2.3.0 classid 1:2
</pre><p>La suivante commence comme ceci :
</p><pre class="screen"># tc filter add dev eth1 parent 1:0 protocol ip prio 100 match ip src \
  1.2.0.1 classid 1:1
...
</pre><p>De cette manière, seules quatre recherches au plus sont nécessaires et
deux en moyenne.
</p><p>La configuration est plutôt compliquée, mais elle en vaut vraiment la 
peine du fait des nombreuses règles.
Nous créons d'abord un filtre racine, puis une table avec 256 entrées :
</p><pre class="screen"># tc filter add dev eth1 parent 1:0 prio 5 protocol ip u32
# tc filter add dev eth1 parent 1:0 prio 5 handle 2: u32 divisor 256
</pre><p>Nous ajoutons maintenant des règles dans la table précédemment
créée :
</p><pre class="screen"># tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \
        match ip src 1.2.0.123 flowid 1:1
# tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \
        match ip src 1.2.1.123 flowid 1:2
# tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \
        match ip src 1.2.3.123 flowid 1:3
# tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \
        match ip src 1.2.4.123 flowid 1:2
</pre><p>Ceci est l'entrée 123, qui contient les correspondances pour 
<code class="literal">1.2.0.13</code>, <code class="literal">1.2.1.123</code>, 
<code class="literal">1.2.2.123</code> et <code class="literal">1.2.3.123</code> qui les envoient
respectivement vers <code class="literal">1:1</code>, <code class="literal">1:2</code>,
<code class="literal">1:3</code> et <code class="literal">1:2</code>.
Notez que nous devons spécifier notre seau de hachage en hexadécimal, 
<code class="literal">0x7b</code> pour <code class="literal">123</code>.
</p><p>Nous créons ensuite un « <span class="quote">filtre de hachage</span> »qui dirige le 
trafic vers la bonne entrée de la table de hachage :
</p><pre class="screen"># tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 800:: \
        match ip src 1.2.0.0/16 \
        hashkey mask 0x000000ff at 12 \
        link 2:
</pre><p>Ok, certains nombres doivent être expliqués.
La table de hachage par défaut est appelée <code class="literal">800::</code> et tous
les filtres démarrent de là.
Nous sélectionnons alors l'adresse source qui est en position 12, 13, 14 et 15
dans l'en-tête IP, et indiquons que seule la dernière partie nous intéresse.
Ceci est envoyé vers la table de hachage <code class="literal">2:</code> qui a été créée
plus tôt.
</p><p>C'est plutôt compliqué, mais cela marche en pratique et les performances
seront époustouflantes.
Notez que cet exemple pourrait être amélioré pour que chaque chaîne contienne
un filtre, ce qui représenterait le cas idéal !
</p></div><div class="navfooter"><hr /><table summary="Navigation footer" width="100%"><tr><td align="left" width="40%"><a accesskey="p" href="ch12s03.html">Précédent</a> </td><td align="center" width="20%"><a accesskey="u" href="ch12.html">Niveau supérieur</a></td><td align="right" width="40%"> <a accesskey="n" href="ch12s05.html">Suivant</a></td></tr><tr><td valign="top" align="left" width="40%">Les filtres de réglementation 
  (<em class="wordasword">Policing filters</em>) </td><td align="center" width="20%"><a accesskey="h" href="index.html">Sommaire</a></td><td valign="top" align="right" width="40%"> Filtrer le trafic IPv6</td></tr></table></div></body></html>