mouss wrote:
> Gaëtan PERRIER a écrit :
>> C'est ce que je fais par défaut mais là je voulais ajouter dynamiquement des
>> règles en fonction de l'apparition de connections vpn par ex. mais finalement
>> je me dis que ce n'est peut-être pas problématique de les ajouter en premier
>> avec un iptables -I ?
>>
> 
> 
> La méthode usuelle est de créer une chaîne et d'insérer les règles
> dynamiques dans cette chaîne.
> 
> si l'anglais ne te fait pas peur, tu peux jeter un coup d'oeil sur:
> 
> http://dave.thehorners.com/tech-talk/unix-linux-bsd-osx-etc/76-information-about-the-linuxunix-os-and-friends/86-iptables-a-real-mans-firewall
> 

Voila ce que cela donne chez moi :p!

[code]
# ifup eth3
Chargement du fichier : fw_config.sh
dthfw v0.2
Chargement du fichier : fw_modules.sh
Chargement du fichier : fw_proc.sh
Chargement du fichier : fw_rules.sh
Chargement du fichier : eth3.sh
[+] Loading iptables rules for eth3 interface ... Done.

# iptables -L -v | grep eth3
    0     0 eth3_in_new  all  --  eth3   any     anywhere
anywhere
   17  3006 eth3_out_new  all  --  any    eth3    anywhere
anywhere
Chain eth3_in_new (1 references)
Chain eth3_out_new (1 references)

# ifdown eth3
Chargement du fichier : fw_config.sh
dthfw v0.2
Chargement du fichier : fw_modules.sh
Chargement du fichier : fw_proc.sh
Chargement du fichier : fw_rules.sh
Chargement du fichier : eth3.sh
[+] Unloading rules for eth3 interface ... Done.

# iptables -L -v | grep eth3

[/code]

Avec un simple script bash présent dans:

 - /etc/network/if-pre-up.d/
 - /etc/network/if-post-down.d

Un petit exemple:
[code]
#!/bin/bash

DTHFW="dthfw"

if [ "$MODE" = "start" ]; then
        MODE=load
else
        MODE=unload
fi

invoke-rc.d $DTHFW $MODE $IFACE

exit 0
[/code]

Ensuite, c'est le script firewall qui prend le relais et fait les
vérifications d'usage:
   - firewall démarré,
   - recherche des règles associées à l'interface ...

Aujourd'hui j'ai un fichier de règles par interface.

Chaque fichier est renseigné de la même façon:

[code]
#!/bin/sh

METHOD=$1
IFACE=$2

IPTABLES='/sbin/iptables'

IN_CHAIN=$IFACE'_in_new'
OUT_CHAIN=$IFACE'_out_new'

=============================================================================
# Unload iptables rules for this specific interface
#
# This function removes all specific rules linked to this interface.
# Therefore, the user defined chains are unlinked from the dynamic
# chain, then flushed and by the end removed
#
# syntax : unload
#
# return : nothing
unload ()
{
        $IPTABLES -D dyn_in_new -i $IFACE -j $IN_CHAIN
        $IPTABLES -F $IN_CHAIN
        $IPTABLES -X $IN_CHAIN

        $IPTABLES -D dyn_out_new -o $IFACE -j $OUT_CHAIN
        $IPTABLES -F $OUT_CHAIN
        $IPTABLES -X $OUT_CHAIN
}

#
=============================================================================
# Load iptables rules for this specific interface
#
# This function adds all specific rules linked to this interface.
# Therefore, the user defined chains are created and linked to the
# dynamic chains, then the ruleset is applied
#
# syntax : load
#
# return : nothing
load ()
{
...
}
[/code]

On remarquera les chaines utilisateurs dyn_in_new et dyn_out_new dans
lesquelles sont ajoutées une chaine utilisateur par interface.

L'avantage est grand, car:
  - Le firewall n'est jamais redémarré à moins d'une modification de la
politique par défaut.
  - Chaque ruleset associé à une interface peut-être chargé/déchargé de
façon simple.
  - Une mise à jour de mon ruleset pour mon interface de test peut
échouer sans impacter tout le firewall et verrouiller ainsi tous les accès.
  - Toutes les interfaces bénéficient de la politique par défaut bien
qu'ajouter plus tard.

-- 
Franck Joncourt
http://debian.org - http://smhteam.info/wiki/
Fingerprint : C10E D1D0 EF70 0A2A CACF 9A3C C490 534E 75C0 89FE

Attachment: signature.asc
Description: OpenPGP digital signature

Répondre à