250
Commentaire:
|
3971
|
Texte supprimé. | Texte ajouté. |
Ligne 1: | Ligne 1: |
{{{#!wiki caution '''Page en cours de réalisation''' }}} |
## page was renamed from CransTechnique/FireWall |
Ligne 5: | Ligne 3: |
Cette page a pour but d'expliquer ce qu'est un firewall, comment configurer un firewall sous Linux et comment fonctionnent les différents services associés au Crans. Vaste programme. |
= 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 == <<Navigation(children)>> ---- * CatégorieCrans * CatégoriePagePublique |
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...
- self.add(chain, "COMMIT\n")
- self.add("filter4", "COMMIT\n") self.add("filter6", "COMMIT\n")
- self.add("mangle4", "COMMIT\n") self.add("mangle6", "COMMIT\n")
- self.add("nat4", "COMMIT\n") self.add("nat6", "COMMIT\n")
- setattr(self, chain, getattr(self, chain) + "\n" + value)
- if '4' in chain:
- self.add(chain, "-A " + subtable + " " + value)
- self.add(chain, "-A " + subtable + " " + value)
- 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"]
- global_chain = self.nat4 + self.filter4 + self.mangle4 command_to_execute = ["sudo","-n","/sbin/iptables-restore"]
- print(global_chain)
- """Restoration de l'iptable générée""" if mode == '6':
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