Taille: 3971
Commentaire:
|
Taille: 3993
Commentaire:
|
Texte supprimé. | Texte ajouté. |
Ligne 23: | Ligne 23: |
{{{#! | |
Ligne 60: | Ligne 60: |
}}} | |
Ligne 65: | Ligne 66: |
{{{#! | |
Ligne 77: | Ligne 79: |
}}} |
Le parefeu
Il existe actuellement 2 parefeu en production.
Le plus récent, gen_conf/firewall.py, remplace les anciens firewall v6 et v4 sur zamok, les radius et le routeur v6.
L'ancien parefeu v4, gen_conf/firewall4/firewall.py reste en production sur odlyd et sable, temporairement.
Le nouveau parefeu
Utilisation
Il se lance avec /usr/scripts/gestion/gen_conf/firewall.py restart. Il se coupe avec l'instruction stop. Celle-ci coupure injectera un set de règles vide, avec policy accept.
Principes
Architecture générale
Le script est une class iptables qui a différentes sous-fonctions selon ce qu'on veut générer. Le début contient les fonctions de bases, d'intialisation des chaines iptables etc.
def __init__(self): self.nat4 = "\n*nat" self.mangle4 = "\n*mangle" self.filter4 = "\n*filter" self.nat6 = "\n*nat" self.mangle6 = "\n*mangle" self.filter6 = "\n*filter" self.conn = shortcuts.lc_ldap_readonly() etc... def commit(self, chain): self.add(chain, "COMMIT\n") def commit_filter(self): self.add("filter4", "COMMIT\n") self.add("filter6", "COMMIT\n") def commit_mangle(self): self.add("mangle4", "COMMIT\n") self.add("mangle6", "COMMIT\n") def commit_nat(self): self.add("nat4", "COMMIT\n") self.add("nat6", "COMMIT\n") def add(self, chain, value): setattr(self, chain, getattr(self, chain) + "\n" + value) def add_in_subtable(self, chain, subtable, value): if '4' in chain: self.add(chain, "-A " + subtable + " " + value) elif '6' in chain: self.add(chain, "-A " + subtable + " " + value) else: self.add(chain + '4', "-A " + subtable + " " + value) self.add(chain + '6', "-A " + subtable + " " + value)
On remarque donc déjà qu'il y a 6 attributs principaux à notre classe, filter4, filter6, nat4, nat6, mangle4 et mangle6.
Ainsi; au moment de l'injection des règles qui est faite au démarrage du parefeu, (iptables-restore) :
def restore_iptables(self, mode='4'): """Restoration de l'iptable générée""" if mode == '6': global_chain = self.nat6 + self.filter6 + self.mangle6 command_to_execute = ["sudo","-n","/sbin/ip6tables-restore"] else: global_chain = self.nat4 + self.filter4 + self.mangle4 command_to_execute = ["sudo","-n","/sbin/iptables-restore"] process = subprocess.Popen(command_to_execute, stdin=subprocess.PIPE, stdout=subprocess.PIPE) process.communicate(input=global_chain.encode('utf-8')) if self.export: print(global_chain)
Très simplement donc, on remet les règles ensembles pour le parefeu 6 d'un coté, le parefeu 4 de l'autre, et on restore. Savoir si on veut générer que le 4, le 6 ou les 2 est un argument de la fonction en question, on verra un peu plus tard comment c'est fait.
Ajout des chaines
L'idée a été de coder un parefeu unifié. Ainsi, on essaye de faire en sorte d'avoir le plus possible des tables compatibles avec iptables et ip6tables. Par exemple, l'acceptation des connexions déjà établies sera le même en v4 ou en v6
- def accept_established(self, subtable='ESTABLISHED-CONN'):
- """Accepte les connexions déjà établies""" self.init_filter(subtable, decision="-") self.jump_all_trafic("filter", "FORWARD", subtable) self.jump_all_trafic("filter", "INPUT", subtable) self.add_in_subtable("filter", subtable, """-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT""")
Pour les divers pare feu du crans