Persistance des règles Iptables

De EjnTricks

L'utilisation de Iptables permet de mettre en place des règles d'accès sur une machine. Ce firewall est très puissant et permet de mettre en place des règles sophistiquées. Cependant, lors de l'arrêt de la machine, celles-ci sont perdues et il est nécessaire de rejouer les configurations. Cet article se propose de décrire une solution pour effectuer automatiquement la sauvegarde, puis la restauration, avec une installation sous Ubuntu.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Study icon.png Analyse configuration réseau

La configuration réseau se situe au niveau du répertoire /etc/netword, dont le contenu est:

#sudo find /etc/network | sed 's/[^/]*\//|   /g;s/| *\([^| ]\)/+--- \1/'
|   +--- network
|   |   +--- interfaces
|   |   +--- if-up.d
|   |   |   +--- bind9
|   |   |   +--- avahi-daemon
|   |   |   +--- ethtool
|   |   |   +--- wpasupplicant
|   |   |   +--- upstart
|   |   |   +--- ntpdate
|   |   |   +--- openssh-server
|   |   |   +--- avahi-autoipd
|   |   |   +--- 000resolvconf
|   |   +--- if-down.d
|   |   |   +--- bind9
|   |   |   +--- resolvconf
|   |   |   +--- wpasupplicant
|   |   |   +--- upstart
|   |   |   +--- avahi-autoipd
|   |   +--- interfaces.d
|   |   +--- if-pre-up.d
|   |   |   +--- ethtool
|   |   |   +--- wpasupplicant
|   |   |   +--- wireless-tools
|   |   +--- run
|   |   +--- if-post-down.d
|   |   |   +--- avahi-daemon
|   |   |   +--- wpasupplicant
|   |   |   +--- wireless-tools

Les répertoires suivants attirent l'attention:

  • if-down.d
  • if-post-down.d
  • if-pre-up.d
  • if-up.d

Ceux-ci ressemblent étrangement aux actions possibles dans le fichier interface pour exécuter des scripts spécifiques. La consultation de la documentation confirme ceci. A noter que les répertoire if-pre-down et if-down-up ne sont pas mis à disposition par défaut avec Ubuntu. La documentation de interface est explicite sur ce point, étant des alias les scripts ne seront pas exécutés. Ces répertoires ne sont donc pas utiles.

L'utilisation de liens / scripts dans ces répertoires est grandement recommandée car cela évite la modification de fichier "système" et limite les risques d'erreurs.


Strategy-icon.png Stratégie de conservation

Backup-icon.png Backup

Les règles seront sauvegardées dans le répertoire /var/opt/backups/iptables:

#sudo mkdir -p /var/opt/backups/iptables
#sudo chmod -R 766 /var/opt/backups
#sudo chmod -R 700 /var/opt/backups/iptables

Le répertoire mis en place ne pourra être accédé que par le compte root afin de sécuriser l'accès aux sauvegardes.

Il faut ensuite créer le script, fichier /var/opt/backups/iptables/iptables-save.sh, qui va permettre de sauvegarde les règles mises en place à l'aide de l'outil iptables-save:

#!/bin/sh
iptables-save -c > /var/opt/backups/iptables/iptables.rules
chmod 600 /var/opt/backups/iptables/iptables.rules
exit 0

Ce script doit être exécutable et les permissions doivent également être restrictives:

#sudo chown root:root /var/opt/backups/iptables/iptables-save.sh
#sudo chmod 700 /var/opt/backups/iptables/iptables-save.sh

Dans le cadre d'une utilisation couplée avec Fail2ban, le résultat de la commande iptables-save -c exporte également les "chains" mises en place:

#sudo iptables-save -c
# Generated by iptables-save v1.4.20 on Mon Dec 30 16:00:51 2013
*filter
:INPUT ACCEPT [11508:1249240]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [9649:16781398]
:fail2ban-apache-scan - [0:0]
:fail2ban-ssh - [0:0]
:iptables-slapd - [0:0]
:iptables-tomcat - [0:0]
[0:0] -A INPUT -p tcp -m tcp --dport 389 -j iptables-slapd
[8591:729883] -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-scan
[1467:110128] -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
[0:0] -A INPUT -p tcp -m tcp --dport 8080 -j iptables-tomcat
[8591:729883] -A fail2ban-apache-scan -j RETURN
[1467:110128] -A fail2ban-ssh -j RETURN
[0:0] -A iptables-slapd -s 127.0.0.1/32 -j ACCEPT
[0:0] -A iptables-slapd -m iprange --src-range 192.168.1.2-192.168.1.9 -j ACCEPT
[0:0] -A iptables-slapd -j REJECT --reject-with icmp-port-unreachable
[0:0] -A iptables-tomcat -s 127.0.0.1/32 -j ACCEPT
[0:0] -A iptables-tomcat -m iprange --src-range 192.168.1.2-192.168.1.9 -j ACCEPT
[0:0] -A iptables-tomcat -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Mon Dec 30 16:00:51 2013

Or, ces "chains" sont créés automatiquement par Fail2ban lors de son démarrage. Il ne paraît donc pas nécessaire de les créer au démarrage de la machine. Qui plus est, si de nombreuses IPs ont été bannis, la table risque d'être conséquente et il n'est pas évident qu'il faille les conserver. En effet, ce sont essentiellement des tentatives de pirates et puisqu'ils ont été bannis lors de leur essai, il y a fort à parier qu'ils ne reviendront pas. Et au pire, ils seront à nouveau bannis.

En conclusion, il peut être utile de filtrer les règles générées par Fail2ban. L'outil étant particulièrement bien réalisé, il est facile de trouver une règle de filtrage se basant sur le mot fail2ban:

#!/bin/sh
iptables-save -c | sed '/fail2ban/d' > /var/opt/backups/iptables/iptables.rules
chmod 600 /var/opt/backups/iptables/iptables.rules
exit 0

Le script étant opérationnel, il suffit de le référencer dans le répertoire /etc/network/if-post-down.d:

#sudo ln -s /var/opt/backups/iptables/iptables-save.sh /etc/network/if-post-down.d/iptables-save

Le contenu du répertoire /etc/network/if-post-down.d doit contenir le lien avec les droits d'exécution:

#sudo ll /etc/network/if-post-down.d
total 12
drwxr-xr-x 2 root root 4096 Dec 30 16:17 ./
drwxr-xr-x 7 root root 4096 Dec 30 15:33 ../
lrwxrwxrwx 1 root root   23 Dec 14 01:14 avahi-daemon -> ../if-up.d/avahi-daemon*
lrwxrwxrwx 1 root root   42 Dec 30 16:17 iptables-save -> /var/opt/backups/iptables/iptables-save.sh*
-rwxr-xr-x 1 root root 1070 Dec 18  2009 wireless-tools*
lrwxrwxrwx 1 root root   32 Nov 19 04:56 wpasupplicant -> ../../wpa_supplicant/ifupdown.sh*

Backup-restore.png Activation

Une fois le script d'exportation mis en place, il reste à créer celui d'activation des règles, dans le fichier <code>/var/opt/backups/iptables/iptables-load.sh, avec le contenu:

#!/bin/sh
iptables-restore --noflush < /var/opt/backups/iptables/iptables.rules
exit 0

Attention, l'argument --noflush est important dans le cadre de cet article. En effet, Fail2ban est utilisé en complément, et des "chains" sont créées lors de son démarrage. Or, le script iptables-load.sh va être exécuté après. Sans l'argument --noflush, ces "chains" sont supprimés pouvant provoqués des effets de bords indésirables.

Si [Fail2ban]] n'est pas utilisé, le contenu du script /var/opt/backups/iptables/iptables-load.sh peut s'affranchir du paramètre. Le contenu serait alors:

#!/bin/sh
iptables-restore < /var/opt/backups/iptables/iptables.rules
exit 0

Ce script doit être exécutable et les permissions doivent également être restrictives:

#sudo chown root:root /var/opt/backups/iptables/iptables-load.sh
#sudo chmod 700 /var/opt/backups/iptables/iptables-load.sh

Le script étant opérationnel, il suffit de le référencer dans le répertoire /etc/network/if-post-down.d:

#sudo ln -s /var/opt/backups/iptables/iptables-load.sh /etc/network/if-pre-up.d/iptables-load

Le contenu du répertoire /etc/network/if-pre-up.d doit contenir le lien avec les droits d'exécution:

#sudo ll /etc/network/if-pre-up.d
total 16
drwxr-xr-x 2 root root 4096 Dec 30 16:29 ./
drwxr-xr-x 7 root root 4096 Dec 30 15:33 ../
-rwxr-xr-x 1 root root  344 Apr 28  2012 ethtool*
lrwxrwxrwx 1 root root   42 Dec 30 16:29 iptables-load -> /var/opt/backups/iptables/iptables-load.sh*
-rwxr-xr-x 1 root root 3839 May  3  2012 wireless-tools*
lrwxrwxrwx 1 root root   32 Nov 19 04:56 wpasupplicant -> ../../wpa_supplicant/ifupdown.sh*

Run-icon.png Tests

Ces actions ont été mises en place afin de sauvegarder et charger les règles lors de l'arrêt / relance de la machine. Afin de tester les scripts, il n'est pas nécessaire d'effectuer un reboot. En redémarrant le service networking suffit:

#sudo service networking restart
networking stop/waiting
networking start/running


Warning-icon.png Attention

Une attention particulière doit être portée sur le nom des liens mis en place dans les sous répertoire de /etc/network. Si les scripts de sauvegarde et chargement ne sont pas pris en compte, il se peut que cela soit du au nom des liens.

En effet, ceux-ci sont exécutés à l'aide de la commande run-parts qui ne tient pas compte des fichiers contenant le caractère .. Il ne faut donc pas avoir d'extension dans les fichiers. Les premiers essais réalisés pour cet article donnait la création des liens ainsi:

#sudo ln -s /var/opt/backups/iptables/iptables-save.sh /etc/network/if-post-down.d/iptables-save.sh
#sudo ln -s /var/opt/backups/iptables/iptables-load.sh /etc/network/if-pre-up.d/iptables-load

Or, rien n'était réalisé. En supprimant les extension .sh, les scripts ont été exécutés somme attendus.


Viewer icon.png Voir aussi

Description de l'ensemble des solutions posibles. Documentation officielle: https://help.ubuntu.com/community/IptablesHowTo

Documentation de interfaces. Documentation officielle: http://manpages.ubuntu.com/manpages/trusty/en/man5/interfaces.5.html