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

Le filtrage avec iptables


précédentsommairesuivant

9. Sauvegarde et restauration des tables de règles importantes

Le paquetage iptables est fourni avec deux outils très utiles, spécialement si vous utilisez des tables de règles importantes. Ces deux outils sont appelés iptables-save et iptables-restore et sont utilisés pour la sauvegarde et la restauration des tables de règles dans un format spécifique qui semble un peu différent du code shell standard que nous avons vu dans ce didacticiel.

iptables-restore peut être utilisé en conjonction avec des langages de script. Le gros problème est que vous devrez envoyer les résultats dans le stdin de iptables-restore. Si vous avez créé une très grosse table de règles (plusieurs milliers de règles) ce peut être une bonne idée, car il est plus rapide d'insérer toutes les nouvelles règles. Par exemple, vous pourrez exécuter make_rules.sh | iptables-restore.

9-1. Considérations de vitesse

Une des principales raisons d'utiliser iptables-save et iptables-restore est qu'elles améliorent la vitesse de chargement et de restauration des tables de règles importantes. Le problème principal lors du lancement de scripts shell contenant des règles iptables est que chaque invocation d'iptables dans le script extraira l'ensemble des règles de l'espace Netfilter du noyau, et après cela, insérera les règles, ou toute autre action en réponse à la commande spécifique. Enfin, ajoutera les nouvelles règles issues de sa propre mémoire dans l'espace noyau. L'utilisation d'un script shell, créé pour chacune des règles que vous voulez insérer, prend plus de temps pour l'extraction et l'insertion de la table de règles.

Pour résoudre ce problème, il existe les commandes iptables-save et restore. La commande iptables-save est utilisée pour sauvegarder la table de règles dans un fichier texte au format spécial, et la commande iptables-restore est utilisée pour charger ce fichier à nouveau dans le noyau. Le plus intéressant de ces commandes est qu'elles chargent et sauvegardent la table de règles en une seule action. iptables-save récupérera la table de règles du noyau et la sauvegardera dans un fichier en une seule action. iptables-restore enverra la table de règles au noyau en une seule action pour chaque table. En d'autres termes, au lieu d'effacer la table de règles du noyau quelque 30 000 fois, ce qui arrive pour les tables de règles importantes, et ensuite la renvoyer au noyau, nous pouvons maintenant sauvegarder cet ensemble dans un fichier en une ou deux actions.

Comme vous pouvez le comprendre, ces outils sont définitivement faits pour vous si vous utilisez un vaste ensemble de règles. Cependant, elles ont des inconvénients, comme nous le verrons dans la section suivante.

9-2. Inconvénients avec restore

Comme vous avez pu vous en étonner, iptables-restore fonctionne-t-il avec toutes sortes de scripts ? De loin, non, il ne pourra probablement jamais le faire. C'est le principal défaut d'iptables-restore, car il n'est pas capable de faire beaucoup de choses avec ces fichiers. Par exemple, si vous avez une connexion qui utilise une IP dynamique et que vous voulez récupérer cette IP à chaque démarrage de la machine et ensuite insérer cette valeur dans vos scripts ? Avec iptables-restore, c'est plus ou moins impossible.

Une possibilité pour faire ceci est de créer un petit script qui récupère les valeurs que vous voulez utiliser, ensuite faire un sed du fichier iptables-restore pour ces mots-clés spécifiques et les remplacer avec les valeurs collectées via le petit script. À ce point, vous pouvez les sauvegarder dans un fichier temporaire, et ensuite utiliser iptables-restore pour charger ces nouvelles valeurs. Ceci provoque cependant certains problèmes, et vous serez incapables de vous servir de iptables-save correctement, car il effacera probablement vos mots-clés ajoutés à la main dans le script de restauration. C'est une solution maladroite.

Une autre solution est de charger les scripts iptables-restore en premier, et ensuite charger les scripts qui insèrent les règles plus dynamiques à leur place. Bien sûr, comme vous pouvez le comprendre, c'est juste une reprise maladroite de la première solution. iptables-restore n'est tout simplement pas très bien adapté pour les configurations dans lesquelles les adresses IP sont assignées dynamiquement.

Un autre inconvénient avec iptables-restore et iptables-save est qu'il ne sont pas aussi complètement fonctionnels que si vous faites un script. Le problème est simplement que pas beaucoup de personnes l'utilisent et donc qu'il n'y a pas énormément de rapports de bogues. Même si ces problèmes existent, je vous recommande fortement d'utiliser ces outils qui fonctionnent très bien pour la plupart des tables de règles tant qu'elles ne contiennent pas certains nouveaux modules ou cibles qu'ils ne savent pas gérer correctement.

9-3. iptables-save

La commande iptables-save est, comme nous l'avons déjà expliqué, un outil pour sauvegarder dans la table de règles un fichier que iptables-restore peut utiliser. Cette commande est tout à fait simple, et prend seulement deux arguments. Regardons l'exemple suivant pour comprendre la syntaxe :

 
Sélectionnez
iptables-save [-c] [-t table]

L'argument -c indique à iptables-save de conserver les valeurs spécifiées dans les compteurs de bits et de paquets. Ce qui pourrait être utile si vous voulez redémarrer votre pare-feu principal, mais sans perdre les compteurs de bits et de paquets que nous pourrions utiliser dans un but de statistiques. Exécuter une commande iptables-save avec l'argument -c nous permet de redémarrer sans briser les routines de statistique et de comptage. La valeur par défaut est, bien sûr, de ne pas garder les compteurs intacts quand cette commande est exécutée.

L'argument -t indique à la commande iptables-save quelle table sauvegarder. Sans cet argument toutes les tables disponibles dans le fichier seront automatiquement sauvegardées. Ci-dessous, un exemple de ce que donne une commande iptables-save sans avoir chargé de table de règles.

 
Sélectionnez
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002
*filter
:INPUT ACCEPT [404:19766]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [530:43376]
COMMIT
# Completed on Wed Apr 24 10:19:17 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002
*mangle
:PREROUTING ACCEPT [451:22060]
:INPUT ACCEPT [451:22060]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [594:47151]
:POSTROUTING ACCEPT [594:47151]
COMMIT
# Completed on Wed Apr 24 10:19:17 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [3:450]
:OUTPUT ACCEPT [3:450]
COMMIT
# Completed on Wed Apr 24 10:19:17 2002

Les commentaires débutent avec la signe #. Chaque table est marquée par *<table-name>, par exemple, *mangle. Dans chaque table nous avons les spécifications de chaînes et les règles. Une spécification de chaîne ressemble à : <chain-name> <chain-policy> [<packet-counter>:<byte-counter>]. Le chain-name peut être, par exemple, PREROUTING, la règle d'action est décrite avant et peut être, par exemple, ACCEPT. Enfin les compteurs d'octets et de paquets sont les mêmes que dans la sortie de la commande iptables -L -v. Chaque déclaration de table se termine avec un mot-clé COMMIT. Le mot-clé COMMIT indique qu'à ce niveau toutes les règles seront envoyées au noyau par l'opérateur de transfert de données.

L'exemple ci-dessus est tout à fait basique, et je crois qu'il est approprié de montrer un bref exemple qui contient un petit iptables-save rulesetIptables-save ruleset. Si nous voulons lancer iptables-save sur celui-ci, la sortie de la commande sera :

 
Sélectionnez
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*filter
:INPUT DROP [1:229]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -i eth1 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*mangle
:PREROUTING ACCEPT [658:32445]
:INPUT ACCEPT [658:32445]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [891:68234]
:POSTROUTING ACCEPT [891:68234]
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*nat
:PREROUTING ACCEPT [1:229]
:POSTROUTING ACCEPT [3:450]
:OUTPUT ACCEPT [3:450]
-A POSTROUTING -o eth0 -j SNAT --to-source 195.233.192.1 
COMMIT
# Completed on Wed Apr 24 10:19:55 2002

Comme on peut le voir, chaque commande a été préfixée avec les compteurs d'octets et de paquets, car nous avons utilisé l'argument -c. Excepté pour ceci, la ligne de commande est tout à fait identique au script. Le seul problème est de savoir comment sauvegarder la sortie dans un fichier. Vraiment simple, et vous devriez savoir le faire si vous avez utilisé Linux auparavant. Il suffit d'utiliser un « pipe » (canal de communication) pour enregistrer la sortie de la commande dans le fichier. Ça ressemblera à cela :

 
Sélectionnez
iptables-save -c > /etc/iptables-save

La commande ci-dessus fera une sauvegarde de toute la table de règles appelée /etc/iptables-save avec les compteurs d'octets et de paquets toujours intacts.

9-4. iptables-restore

La commande iptables-restore est exécutée pour restaurer la table de règles de iptables qui a été sauvegardée par la commande iptables-save. Elle prend toutes les entrées standard, mais ne peut faire de restauration depuis un fichier de règles écrit à la main (script), malheureusement. La syntaxe de cette commande :

 
Sélectionnez
iptables-restore [-c] [-n]

L'argument -c restaure les compteurs d'octets et de paquets et doit être utilisé si vous voulez garder les compteurs précédemment enregistrés avec iptables-save. Cet argument peut aussi s'écrire avec sa forme de nom long --counters.

L'argument -n indique à iptables-restore de ne pas écraser les règles précédemment écrites dans la table, ou les tables. Le comportement par défaut de iptables-restore est d'effacer et supprimer toutes les règles inscrites auparavant. L'argument court -n peut être remplacé par son format long --noflush.

Pour charger une table de règles avec la commande iptables-restore, il existe plusieurs solutions, mais nous ne verrons que la plus simple et la plus commune :

 
Sélectionnez
cat /etc/iptables-save | iptables-restore -c
Ceci fonctionnera également :
iptables-restore -c < /etc/iptables-save

Ceci concaténera la table de règles située dans le fichier /etc/iptables-save et ensuite l'enverra vers iptables-restore qui récupérera cette table de règles sur l'entrée standard et la restaurera, en incluant les compteurs d'octets et de paquets. Cette commande peut varier à l'infini et nous pourrions montrer les diverses possibilités de « piping », cependant, c'est un peu hors du sujet de ce chapitre, et nous laisserons ceci comme exercice pour le lecteur.

La table de règles devrait maintenant être chargée correctement dans le noyau et fonctionnelle. Sinon, vous avez peut-être fait une erreur dans ces commandes.

9-5. Prochain chapitre

Le prochain chapitre sera consacré à la syntaxe des règles iptables et comment écrire proprement des tables de règles. Il montrera également certains styles de codage de base.


précédentsommairesuivant

Copyright © 2001-2006 Oskar Andreasson
La permission est accordée de copier, distribuer et/ou modifier ce document selon les termes de la « GNU Free Documentation License », version 1.1; en précisant les sections « Introduction » et toutes les sous-sections, avec les en-têtes « Auteur: Oskar Andreasson ». Une copie de la licence est inclue dans la section intitulée « GNU Free Documentation License ».
Tous les scripts de ce tutoriel sont couverts par la GNU General Public License. Les scripts sont de source libre; vous pouvez les redistribuer et/ou les modifier selon les termes de la GNU General Public License publiée par la « Free Software Foundation », version 2.
Ces scripts sont distribués dans l'espoir qu'ils seront utiles, mais SANS AUCUNE GARANTIE; sans même la garantie implicite qu'ils soient VENDABLES ou une QUELCONQUE APTITUDE POUR UN PROPOS PARTICULIER. Voir la GNU General Public License pour plus de détails.
Vous devriez avoir une copie de la GNU General Public License dans ce tutoriel, dans la section intitulée « GNU General Public License »; si ce n'est pas le cas, écrivez à la Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.