Un ensemble de routines est fourni pour manipuler le filtrage de paquets, elles permettent d'ajouter ou de supprimer des chaînes (en anglais "Chains") et des règles. Une chaîne sert à nommée une liste de règles ordonnées. Il y a déjà un ensemble de chaînes prédéfinies sur le routeur fli4l (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING). Vous pouvez créer d'autre chaînes pour certaines fonctions et selon vos besoins.
add_rule <table> <chain> <rule> <comment> ins_rule <table> <chain> <rule> <position> <comment> del_rule <table> <chain> <rule> <comment>
les paramètres ont les significations suivantes :
fli4l configure les règles du filtrage de paquets avec certaine norme. Si vous souhaitez insérer vos propres règles, vous pouvez ajouter ces règles, après les régles par défaut. Pour cela, vous devez savoir quelle action l’utilisateur a effectué pour rejeter les paquets. Ces informations peut être obtenue pour les chaînes FORWARD et INPUT en utilisant deux fonctions, get_defaults et get_count. Après l'exécution de
get_defaults <chain>
On obtient les résultats suivants :
Après l'exécution de
get_count <chain>
la variable res contient le nombre de règle de la chaîne <chain>. Cette position est importante car vous ne pouvez pas utiliser simplement add_rule pour ajouter une règle à la fin de les chaînes de «filtage» prédéfini INPUT, FORWARD et OUTPUT. Car ces chaînes sont déjà terminées par des règles par défaut, qui traite tous les paquets restants, en fonction de la disponibilité de la variable PF_<Chaîne>_POLICY. Donc si vous insérez cette dernière règle après les autres il n'y aura aucun effet. La fonction get_count permet maintenant, de détecter l'emplace directement avant la dernier règle et de transmettre cette position à la fonction ins_rule avec le paramètre <position> ainsi, la règle souhaitée sera ajouter à la fin de la chaîne appropriée, cependant devant la dernier règle saisis.
Voici un exemple à partir du script opt/etc/rc.d/rc390.dns_dhcp du paquetage «dns_dhcp» pour une petit explication :
case $OPT_DHCPRELAY in yes) begin_script DHCRELAY "starting dhcprelay ..." idx=1 interfaces="" while [ $idx -le $DHCPRELAY_IF_N ] do eval iface='$DHCPRELAY_IF_'$idx get_count INPUT ins_rule filter INPUT "prot:udp if:$iface:any 68 67 ACCEPT" \ $res "dhcprelay access" interfaces=$interfaces' -i '$iface idx=`expr $idx + 1` done dhcrelay $interfaces $DHCPRELAY_SERVER end_script ;; esac
Ici vous pouvez voir dans le milieu de la boucle l'exécution de get_count suivie par l'exécution de la fonction ins_rule, entre autres la variable res est passé comme paramètre position.
fli4l utilise la syntaxe match:params dans les règles de filtrage des paquets, cela permet d'avoir des conditions supplémentaires pour les paquets (voir mac:, limit:, length:, prot:, ...). Si vous souhaitez ajouter des tests supplémentaires, vous devez faire comme ci-dessous :
Si vous testez de filtrage de paquets pour les règles IPv6, assurez-vous alors
que le nom du test n'est pas un composant d'une adresse IPv6 valide !
# IPv4 extension is available foo_p=yes # the actual IPv4 extension, adding matches to match_opt do_foo() { param=$1 get_negation $param match_opt="$match_opt -m foo $neg_opt --fooval $param" } # IPv6 extension is available foo6_p=yes # the actual IPv6 extension, adding matches to match_opt do6_foo() { param=$1 get_negation6 $param match_opt="$match_opt -m foo $neg_opt --fooval $param" }Le test de filtrage de paquets ne doit pas nécessairement être implémenté pour les protocoles IPv4 et IPv6 (bien que cela soit préférable et logique pour les deux protocoles de couche 3).
$ cd opt/etc/rc.d $ sh test-rules.sh 'foo:bar ACCEPT' add_rule filter FORWARD 'foo:bar ACCEPT' iptables -t filter -A FORWARD -m foo --fooval bar -s 0.0.0.0/0 \ -d 0.0.0.0/0 -m comment --comment foo:bar ACCEPT -j ACCEPT
+FW_GENERIC_MATCH(OPT_FOO) = 'foo:bar' : '' +FW_GENERIC_MATCH6(OPT_FOO) = 'foo:bar' : ''