iptables-restore
Utilisation classique d'iptables
iptables(8)/ip6tables(8) est le principal outil de gestion du pare-feu Netfilter de Linux : c'est une commande qui permet en fait de configurer ce pare-feu en modifiant sa liste de règles. Il est le plus souvent utilisé dans des scripts shell qui effectuent une longue succession d'appels pour définir chaque règle :
# Supprimer les règles existantes ip6tables -f ip6tables -P INPUT DROP ip6tables -P OUTPUT ACCEPT ip6tables -A INPUT -i lo -j ACCEPT ip6tables -A INPUT -p ipv6-icmp -j ACCEPT ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ip6tables -A INPUT -p tcp --dport ssh -j ACCEPT ip6tables -A INPUT -p tcp --dports smtp -j ACCEPT […]
Cette approche souffre de plusieurs défauts :
- en appelant de multiple fois la commande
ip(6)tables
, elle effectue beaucoup de lectures et d'écritures inutiles dans la table de règles de Netfilter ; - si une erreur se produit pendant l'exécution du script, le pare-feu se retrouve dans une configuration à moitié appliquée.
Fichiers de règles iptables
Un outil de la famille iptables permet une approche plus efficace : iptables-restore(8) et son pendant iptables-save(8). Cet outil a été conçu pour l'utilisation suivante :
- vous configurez votre pare-feu manuellement, en lançant tranquillement
vos commandes
ip(6)tables
; - vous sauvegardez la configuration du pare-feu avec la commande
ip(6)tables-save
:# ip6tables-save > /etc/ip6tables.rules
- lorsque vous voulez appliquer à nouveau cette configuration sauvegardée
— notamment au démarrage de votre machines —, vous utilisez la commande
ip(6)tables-restore
:# ip6tables-restore < /etc/ip6tables.rules
Le fichier de règles iptables utilisé est tout à fait lisible et peut bien
évidemment être utilisé à la main : la plupart de ses lignes correspondent aux
arguments de la commande ip(6)tables
. En fait, cela
permet même une seconde approche intéressante : vous pouvez rédiger directement
votre configuration sous la forme d'un fichier utilisable avec ip(6)tables-restore
— vous pouvez même utiliser des
commentaires préfixés par # :
*filter -P INPUT DROP -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p ipv6-icmp -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp --dport ssh -j ACCEPT -A INPUT -p tcp --dports smtp -j ACCEPT […] COMMIT
L'intérêt de cette approche est… qu'elle corrige les défauts précédemment
évoqués d'un script appelant plusieurs fois la commande
ip(6)tables
: elle demande moins d'opération et est donc plus rapide à appliquer, et laissera le pare-feu entièrement configuré, ou pas du tout en cas d'erreur. En revanche, elle souffre d'un
inconvénient : elle n'est pas scriptable. Un fichier pour
ip(6)tables-restore
est une configuration, par un
script. En pratique, vous ne pouvez pas l'utiliser pour générer vos
règles de façon algorithmiques, par exemple à partir de variables et de boucles.
En réalité, vous pouvez très facilement contourner cela, en rédigeant un script
qui produise une configuration
ip(6)tables-restore
sur sa sortie standard, puis
l'utiliser ainsi :
# /etc/ip6tables.sh | ip6tables-restore
Un garde-fou
L'utilisation de fichiers de configuration
ip(6)tables-restore
présente un avantage
supplémentaire, sous la forme de l'outil
ip(6)tables-apply
: il permet d'appliquer une
nouvelle configuration, et de retourner à la configuration précédente si vous ne
pouvez plus vous connecter à votre machine, ceci afin de vous éviter de vous
retrouver « enfermé dehors ».
# ip6tables-apply /etc/bad_ip6tables.rules Applying new ruleset... done. Can you establish NEW connections to the machine? (y/N) Timeout. Something happened (or did not). Better play it safe... Reverting to old ruleset... done.
Notez que cet outil prend un fichier de règles en entrée. Aussi, si vous avez choisi d'utiliser un script de génération de règles, vous devrez l'exécuter pour sauvegarder sa sortie dans un fichier :
# /etc/ip6tables.sh > /tmp/ip6tables.rules # ip6tables-apply /tmp/ip6tables.rules