iptables-restore

Logo Netfilter (netfilter: firewalling, NAT and packet mangling for Linux)

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 :

  1. vous configurez votre pare-feu manuellement, en lançant tranquillement vos commandes ip(6)tables ;
  2. vous sauvegardez la configuration du pare-feu avec la commande ip(6)tables-save :
    # ip6tables-save > /etc/ip6tables.rules
  3. 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
Vus : 535
Publié par Tanguy Ortolo : 36