[firewall] UTF8ification

darcs-hash:20110226142229-ffbb2-644d5bfccc4a25e96cf024662eb7c207e59eaa2d.gz
This commit is contained in:
Nicolas Dandrimont 2011-02-26 15:22:29 +01:00
parent fed9b34339
commit 852db3b217

View file

@ -1,15 +1,15 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: iso-8859-1 -*- # -*- coding: utf-8 -*-
# The authors of this code are # The authors of this code are
# Manuel Sabban <manu@feyd-rautha.org> # Manuel Sabban <manu@feyd-rautha.org>
# Frédéric Pauget <pauget@crans.ens-cachan.fr> # Frédéric Pauget <pauget@crans.ens-cachan.fr>
# Mathieu Segaud <matt@minas-morgul.org> # Mathieu Segaud <matt@minas-morgul.org>
# Nicolas Salles <salles@crans.org> # Nicolas Salles <salles@crans.org>
# #
# Rewritten as inherited classes from firewall_crans # Rewritten as inherited classes from firewall_crans
# by Mathieu Segaud <matt@minas-morgul.org> # by Mathieu Segaud <matt@minas-morgul.org>
# #
# Copyright (c) 2004 Manuel Sabban, Frédéric Pauget # Copyright (c) 2004 Manuel Sabban, Frédéric Pauget
# Copyright (c) 2005 Mathieu Segaud # Copyright (c) 2005 Mathieu Segaud
# Copyright (c) 2006 Nicolas Salles # Copyright (c) 2006 Nicolas Salles
# #
@ -82,7 +82,7 @@ def redirect_chain(table, chain_in, chain_out, ip) :
iptables("-t %s -N %s" % (table, chain_out)) iptables("-t %s -N %s" % (table, chain_out))
except IptablesError: except IptablesError:
iptables("-t %s -F %s" % (table, chain_out)) iptables("-t %s -F %s" % (table, chain_out))
# On redirige les paquets de la chaîne in dans la chaîne out # On redirige les paquets de la chaîne in dans la chaîne out
iptables("-t %s -A %s -o ens -s %s -j %s" % (table, chain_in, ip, chain_out)) iptables("-t %s -A %s -o ens -s %s -j %s" % (table, chain_in, ip, chain_out))
iptables("-t %s -A %s -o crans -d %s -j %s" % (table, chain_in, ip, chain_out)) iptables("-t %s -A %s -o crans -d %s -j %s" % (table, chain_in, ip, chain_out))
@ -90,21 +90,21 @@ def redirect_chain(table, chain_in, chain_out, ip) :
class firewall_crans : class firewall_crans :
""" """
Classe parente pour les firewalls du crans Classe parente pour les firewalls du crans
Implémentée directement à partir du firewall de komaz, initialement Implémentée directement à partir du firewall de komaz, initialement
écrit par Manuel Sabban et Frédéric Pauget. écrit par Manuel Sabban et Frédéric Pauget.
* les méthodes à surcharger pour l'implémentation eme des firewall * les méthodes à surcharger pour l'implémentation eme des firewall
sont mangle_table, nat_table, filter_table, pour la préparation sont mangle_table, nat_table, filter_table, pour la préparation
du fw, start_fw_funcs pour la mise en place du filtrage. du fw, start_fw_funcs pour la mise en place du filtrage.
* serveurs_maj, adh_maj_list_to_do et serveurs_maj_list_to_do, * serveurs_maj, adh_maj_list_to_do et serveurs_maj_list_to_do,
pour la mise en place de la MAC-IP. pour la mise en place de la MAC-IP.
en particulier, adh_maj_list_to_do et serveurs_maj_list_to_do en particulier, adh_maj_list_to_do et serveurs_maj_list_to_do
sont factorisées pour la simple et bonne raison que les sources sont factorisées pour la simple et bonne raison que les sources
de la liste to_do originale ne seront pas forcément identiques de la liste to_do originale ne seront pas forcément identiques
(c'est un peu sale...) (c'est un peu sale...)
* la classe parente contient à peu de choses prés tout ce qu'il * la classe parente contient à peu de choses prés tout ce qu'il
faut pour mettre en place un fw basique n'effectuant que la faut pour mettre en place un fw basique n'effectuant que la
verif MAC-IP. verif MAC-IP.
""" """
@ -119,7 +119,7 @@ class firewall_crans :
debug = 1 debug = 1
def exception_catcher(self,tache) : def exception_catcher(self,tache) :
""" Exécute la tache founie en gérant les diverses exceptions """ Exécute la tache founie en gérant les diverses exceptions
pouvant survenir pouvant survenir
Retourne 1 en cas d'erreur et 0 sinon """ Retourne 1 en cas d'erreur et 0 sinon """
try : try :
@ -146,7 +146,7 @@ class firewall_crans :
def __del__(self) : def __del__(self) :
""" Destruction du lock """ """ Destruction du lock """
# Comprend pas pourquoi il faut réimporter ici -- Fred # Comprend pas pourquoi il faut réimporter ici -- Fred
from lock import remove_lock from lock import remove_lock
remove_lock('firewall') remove_lock('firewall')
@ -180,16 +180,16 @@ class firewall_crans :
return return
def restart(self): def restart(self):
""" Rédémarrage du firewall """ """ Rédémarrage du firewall """
cprint(u'Redémarrage firewall', 'gras') cprint(u'Redémarrage firewall', 'gras')
self.start(False) self.start(False)
def start(self,aff_txt_intro=True) : def start(self,aff_txt_intro=True) :
""" Construction du firewall """ Construction du firewall
aff_txt_intro s'occupe uniquement de l'esthétisme aff_txt_intro s'occupe uniquement de l'esthétisme
""" """
if aff_txt_intro: cprint(u'Démarrage firewall', 'gras') if aff_txt_intro: cprint(u'Démarrage firewall', 'gras')
# Préliminaires # Préliminaires
if not self.__machines() or self.exception_catcher(self.__stop) : if not self.__machines() or self.exception_catcher(self.__stop) :
cprint(u"Abandon", 'rouge') cprint(u"Abandon", 'rouge')
return return
@ -205,17 +205,17 @@ class firewall_crans :
# On peux router # On peux router
self.post_start_hook() self.post_start_hook()
cprint(u"\t -> fin de la procédure de démarrage",'vert') cprint(u"\t -> fin de la procédure de démarrage",'vert')
def stop(self): def stop(self):
""" Arrête le firewall """ """ Arrête le firewall """
cprint(u"Arrêt du firewall", 'gras') cprint(u"Arrêt du firewall", 'gras')
self.pre_stop_hook() self.pre_stop_hook()
self.exception_catcher(self.__stop) self.exception_catcher(self.__stop)
cprint(u"\t -> fin de la procédure d'arrêt",'vert') cprint(u"\t -> fin de la procédure d'arrêt",'vert')
def __stop(self) : def __stop(self) :
self.anim = anim("\tSuppression des règles") self.anim = anim("\tSuppression des règles")
iptables("-t nat -P PREROUTING ACCEPT") iptables("-t nat -P PREROUTING ACCEPT")
iptables("-F") iptables("-F")
iptables("-t nat -F") iptables("-t nat -F")
@ -227,8 +227,8 @@ class firewall_crans :
def test_mac_ip(self) : def test_mac_ip(self) :
""" Reconstruit la correspondance MAC-IP des machines des adhérents """ """ Reconstruit la correspondance MAC-IP des machines des adhérents """
self.anim = anim('\tChaîne TEST_MAC-IP',len(self.__machines())+1) self.anim = anim('\tChaîne TEST_MAC-IP',len(self.__machines())+1)
iptables("-t nat -P PREROUTING ACCEPT") iptables("-t nat -P PREROUTING ACCEPT")
iptables("-t nat -F TEST_MAC-IP") iptables("-t nat -F TEST_MAC-IP")
self.anim.cycle() self.anim.cycle()
@ -276,10 +276,10 @@ class firewall_crans :
pass pass
def port_maj(self,ip_list) : def port_maj(self,ip_list) :
""" Mise à jour des ports pour les ip fournies """ """ Mise à jour des ports pour les ip fournies """
# Note : système bourrin (on efface les chaînes et on refait) # Note : système bourrin (on efface les chaînes et on refait)
# mais rapide et efficace (si qqn veut se casser le cul à # mais rapide et efficace (si qqn veut se casser le cul à
# un système aussi délicat que pour la correspondance MAC-IP...) # un système aussi délicat que pour la correspondance MAC-IP...)
# -- Fred # -- Fred
serveur_maj = False serveur_maj = False
adh_maj = False adh_maj = False
@ -298,11 +298,11 @@ class firewall_crans :
self.exception_catcher(self.adh_maj_list_to_do) self.exception_catcher(self.adh_maj_list_to_do)
def mac_ip_maj(self,ip_list) : def mac_ip_maj(self,ip_list) :
""" Mise à jour de la correspondance MAC-IP pour les ip fournies """ """ Mise à jour de la correspondance MAC-IP pour les ip fournies """
## Que faut-il faire ? ## Que faut-il faire ?
self.anim = anim('\tAnalyse du travail à effectuer') self.anim = anim('\tAnalyse du travail à effectuer')
if ip_list == [''] : if ip_list == [''] :
print OK + ' (rien à faire)' print OK + ' (rien à faire)'
return return
mac_ip_maj = {} mac_ip_maj = {}
@ -317,10 +317,10 @@ class firewall_crans :
mac_ip_maj[ip] = None mac_ip_maj[ip] = None
elif len(machine) == 1 : elif len(machine) == 1 :
# Mise à jour de la machine # Mise à jour de la machine
if AddrInNet(ip,self.zone_serveur) : if AddrInNet(ip,self.zone_serveur) :
serveur_maj = True serveur_maj = True
# Il faut avoir payé ou être une machine du crans # Il faut avoir payé ou être une machine du crans
if db.search('paiement=ok&ip=%s'% ip)['machine'] or \ if db.search('paiement=ok&ip=%s'% ip)['machine'] or \
machine[0].proprietaire().__class__ == AssociationCrans: machine[0].proprietaire().__class__ == AssociationCrans:
mac_ip_maj[ip] = machine[0] mac_ip_maj[ip] = machine[0]
@ -346,32 +346,32 @@ class firewall_crans :
for regle in iptables("-t nat -L TEST_MAC-IP -n").split('\n')[2:] : for regle in iptables("-t nat -L TEST_MAC-IP -n").split('\n')[2:] :
regle = regle.split() regle = regle.split()
if regle[0] == 'DROP': if regle[0] == 'DROP':
# On est arrivé à la fin de la liste # On est arrivé à la fin de la liste
break break
ip = regle[3] ip = regle[3]
mac = regle[6].lower() mac = regle[6].lower()
if ip in mac_ip_maj.keys() : if ip in mac_ip_maj.keys() :
# La règle correspond à une ip à mettre à jour # La règle correspond à une ip à mettre à jour
machine = mac_ip_maj[ip] machine = mac_ip_maj[ip]
try: try:
if not machine : if not machine :
# Il faut détruire cette entrée # Il faut détruire cette entrée
iptables("-t nat -D TEST_MAC-IP -s %s -m mac --mac-source %s -j RETURN" % (ip, mac)) iptables("-t nat -D TEST_MAC-IP -s %s -m mac --mac-source %s -j RETURN" % (ip, mac))
else : else :
if (isinstance(machine, MachineWifi) and mac != mac_wifi) \ if (isinstance(machine, MachineWifi) and mac != mac_wifi) \
or (not isinstance(machine, MachineWifi) and mac != machine.mac()): or (not isinstance(machine, MachineWifi) and mac != machine.mac()):
# La correspondance MAC-IP est fausse => on ajoute la bonne règle # La correspondance MAC-IP est fausse => on ajoute la bonne règle
self.__test_mac_ip(machine) self.__test_mac_ip(machine)
# Supression de l'ancienne ligne # Supression de l'ancienne ligne
iptables("-t nat -D TEST_MAC-IP -s %s -m mac --mac-source %s -j RETURN" % (ip, mac)) iptables("-t nat -D TEST_MAC-IP -s %s -m mac --mac-source %s -j RETURN" % (ip, mac))
# Toutes les autres occurences devront être détruites # Toutes les autres occurences devront être détruites
mac_ip_maj[ip]=None mac_ip_maj[ip]=None
except IptablesError, c: except IptablesError, c:
warn += str(c) + '\n' warn += str(c) + '\n'
# Ajout des machines qui n'étaient pas dans le firewall # Ajout des machines qui n'étaient pas dans le firewall
for machine in mac_ip_maj.values() : for machine in mac_ip_maj.values() :
if machine : if machine :
self.__test_mac_ip(machine) self.__test_mac_ip(machine)
@ -384,9 +384,9 @@ class firewall_crans :
self.exception_catcher(procedure) self.exception_catcher(procedure)
def build_chaine_adherent(self,chaine,methode) : def build_chaine_adherent(self,chaine,methode) :
# On construit d'abord les autorisations particulières # On construit d'abord les autorisations particulières
if not self.build_chaine(chaine, methode) : if not self.build_chaine(chaine, methode) :
# Puis si pas de problèmes les autorisations par défaut # Puis si pas de problèmes les autorisations par défaut
self.anim.reinit() self.anim.reinit()
for proto in [ 'tcp' , 'udp' ] : for proto in [ 'tcp' , 'udp' ] :
for port in self.ports_default["%s_%s" % ( proto, chaine) ] : for port in self.ports_default["%s_%s" % ( proto, chaine) ] :
@ -396,7 +396,7 @@ class firewall_crans :
print OK print OK
def build_chaine(self,chaine, methode) : def build_chaine(self,chaine, methode) :
self.anim = anim('\tChaîne %s' % chaine,len(self.__machines())+1) self.anim = anim('\tChaîne %s' % chaine,len(self.__machines())+1)
iptables("-F %s" % chaine) iptables("-F %s" % chaine)
self.anim.cycle() self.anim.cycle()
def procedure() : def procedure() :
@ -415,22 +415,22 @@ class firewall_komaz(firewall_crans) :
""" """
Structure du firewall : Structure du firewall :
table mangle : table mangle :
PREROUTING (policy par défaut : ACCEPT) PREROUTING (policy par défaut : ACCEPT)
1) proxy transparent 1) proxy transparent
2) marquage des paquets bittorrent 2) marquage des paquets bittorrent
POSTROUTING (policy par défaut : ACCEPT) POSTROUTING (policy par défaut : ACCEPT)
1) passage dans un sous-réseau de l'ip crans : SUBNET 1) passage dans un sous-réseau de l'ip crans : SUBNET
SUBNET classe pour chaque ip de son réseau dans la classe htb correspondante SUBNET classe pour chaque ip de son réseau dans la classe htb correspondante
table nat : table nat :
PREROUTING (policy par défaut : ACCEPT) PREROUTING (policy par défaut : ACCEPT)
1) passage par TEST_VIRUS_FLOOD pour tout ce qui n'est pas dans zone_serveur 1) passage par TEST_VIRUS_FLOOD pour tout ce qui n'est pas dans zone_serveur
2) passage dans RESEAUX_NON_ROUTABLES_DST 2) passage dans RESEAUX_NON_ROUTABLES_DST
3) passage est paquets venant de l'extérieur dans RESEAUX_NON_ROUTABLES_SRC 3) passage est paquets venant de l'extérieur dans RESEAUX_NON_ROUTABLES_SRC
4) on laisse passer vers filter les paquets suivants : 4) on laisse passer vers filter les paquets suivants :
source ou destination les serveurs de serveurs_crans source ou destination les serveurs de serveurs_crans
ce qui vient de l'extérieur ce qui vient de l'extérieur
5) passage par TEST_MAC-IP 5) passage par TEST_MAC-IP
TEST_VIRUS_FLOOD droppe les paquets contenant des virus ou les paquets de flood TEST_VIRUS_FLOOD droppe les paquets contenant des virus ou les paquets de flood
@ -439,18 +439,18 @@ class firewall_komaz(firewall_crans) :
TEST_MAC-IP envoi les bon paquets vers CRANS_VERS_EXT TEST_MAC-IP envoi les bon paquets vers CRANS_VERS_EXT
table filter : table filter :
FORWARD (policy par défaut : ACCEPT) FORWARD (policy par défaut : ACCEPT)
1) passage par BLACKLIST 1) passage par BLACKLIST
2) passage par FILTRE_P2P (ACCEPT sur le trafic de filtres_p2p, REJECT sur le trafic de 2) passage par FILTRE_P2P (ACCEPT sur le trafic de filtres_p2p, REJECT sur le trafic de
filtres_p2p_bloq, sanctions gérées par déconnexion.py) filtres_p2p_bloq, sanctions gérées par déconnexion.py)
3) ce qui a pour source les serveurs de serveurs_crans est dirigé vers SERVEURS_VERS_EXT 3) ce qui a pour source les serveurs de serveurs_crans est dirigé vers SERVEURS_VERS_EXT
4) ce qui a pour destination les serveurs de serveurs_crans est dirigé EXT_VERS_SERVEURS 4) ce qui a pour destination les serveurs de serveurs_crans est dirigé EXT_VERS_SERVEURS
5) tout ce qui vient de l'interface externe est dirigé vers EXT_VERS_CRANS 5) tout ce qui vient de l'interface externe est dirigé vers EXT_VERS_CRANS
6) ce qui a pour source les serveurs de serveurs_crans est dirigé vers EXT_VERS_CRANS 6) ce qui a pour source les serveurs de serveurs_crans est dirigé vers EXT_VERS_CRANS
BLACKLIST fitre des ip blacklistées (REJECT) BLACKLIST fitre des ip blacklistées (REJECT)
FILTRE_P2P filtre le traffic de p2p : logging des paquets matchés par les protocoles de filtres_p2p FILTRE_P2P filtre le traffic de p2p : logging des paquets matchés par les protocoles de filtres_p2p
rejet des paquets matchés par les protocoles de filtres_p2p_bloq au dessus de la limite rejet des paquets matchés par les protocoles de filtres_p2p_bloq au dessus de la limite
EXT_VERS_CRANS et CRANS_VERS_EXT EXT_VERS_CRANS et CRANS_VERS_EXT
ACCEPT pour les paquets vers les machines du crans (test port-ip) ACCEPT pour les paquets vers les machines du crans (test port-ip)
REJECT pour le reste REJECT pour le reste
@ -508,7 +508,7 @@ class firewall_komaz(firewall_crans) :
def mangle_table(self): def mangle_table(self):
self.anim = anim('\tStructure de la table mangle') self.anim = anim('\tStructure de la table mangle')
# On vide complètement la table # On vide complètement la table
iptables("-t mangle -F") iptables("-t mangle -F")
iptables("-t mangle -X") iptables("-t mangle -X")
@ -527,7 +527,7 @@ class firewall_komaz(firewall_crans) :
eth_ext = self.eth_ext eth_ext = self.eth_ext
eth_int = self.eth_int eth_int = self.eth_int
# Classification du traffic : extérieur <-> ftp # Classification du traffic : extérieur <-> ftp
iptables("-t mangle -A POSTROUTING -o %(eth_int)s -d 136.231.136.10 " iptables("-t mangle -A POSTROUTING -o %(eth_int)s -d 136.231.136.10 "
"-j CLASSIFY --set-class 1:9997" % locals()) "-j CLASSIFY --set-class 1:9997" % locals())
iptables("-t mangle -A POSTROUTING -o %(eth_ext)s -s 136.231.136.10 " iptables("-t mangle -A POSTROUTING -o %(eth_ext)s -s 136.231.136.10 "
@ -546,14 +546,14 @@ class firewall_komaz(firewall_crans) :
warn = '' warn = ''
# Par défaut, on envoit les paquets dans la classe 9998 # Par défaut, on envoit les paquets dans la classe 9998
for net in NETs['all']: for net in NETs['all']:
iptables("-t mangle -A POSTROUTING -o %(eth_int)s -d %(net)s " iptables("-t mangle -A POSTROUTING -o %(eth_int)s -d %(net)s "
"-j CLASSIFY --set-class 1:9998" % locals()) "-j CLASSIFY --set-class 1:9998" % locals())
iptables("-t mangle -A POSTROUTING -o %(eth_ext)s -s %(net)s " iptables("-t mangle -A POSTROUTING -o %(eth_ext)s -s %(net)s "
"-j CLASSIFY --set-class 1:9998" % locals()) "-j CLASSIFY --set-class 1:9998" % locals())
# On crée les chaînes de sous-réseaux # On crée les chaînes de sous-réseaux
for net in NETs['all']: for net in NETs['all']:
for mask in conf_fw.mask: for mask in conf_fw.mask:
for subnet in NetSubnets(net, mask): for subnet in NetSubnets(net, mask):
@ -569,9 +569,9 @@ class firewall_komaz(firewall_crans) :
print OK print OK
adherents = db.search('paiement=ok')['adherent'] adherents = db.search('paiement=ok')['adherent']
self.anim = anim('\tGénération des classes de filtrage p2p', len(adherents)) self.anim = anim('\tGénération des classes de filtrage p2p', len(adherents))
# Création des classes et qdisc # Création des classes et qdisc
# for interface in [eth_ext, eth_int]: # for interface in [eth_ext, eth_int]:
# On vide les classes et qdisc # On vide les classes et qdisc
# try: # try:
@ -579,7 +579,7 @@ class firewall_komaz(firewall_crans) :
# except TcError, c: # except TcError, c:
# warn += str(c) + '\n' # warn += str(c) + '\n'
# # On construit les classes et qdisc de base # # On construit les classes et qdisc de base
# # La partie principale qui définit le comportement par défaut # # La partie principale qui définit le comportement par défaut
# tc("qdisc add dev %(interface)s root handle 1: htb r2q 1" % locals()) # tc("qdisc add dev %(interface)s root handle 1: htb r2q 1" % locals())
# tc("class add dev %(interface)s parent 1: classid 1:1 " # tc("class add dev %(interface)s parent 1: classid 1:1 "
# "htb rate %(debit_max)s ceil %(debit_max)s" % locals()) # "htb rate %(debit_max)s ceil %(debit_max)s" % locals())
@ -593,12 +593,12 @@ class firewall_komaz(firewall_crans) :
# tc("qdisc add dev %(interface)s parent 1:9997 " # tc("qdisc add dev %(interface)s parent 1:9997 "
# "handle 9997: sfq perturb 10" % locals()) # "handle 9997: sfq perturb 10" % locals())
# #
# # On construit ensuite les classes et qdisc pour chaque adhérent # # On construit ensuite les classes et qdisc pour chaque adhérent
# for adherent in adherents: # for adherent in adherents:
# self.anim.cycle() # self.anim.cycle()
# # On ne peut pas reprendre le numéro 1 # # On ne peut pas reprendre le numéro 1
# class_id = int(adherent.id()) + 1 # class_id = int(adherent.id()) + 1
# # Il nous faut un n° inférieur à 9999 unique # # Il nous faut un n° inférieur à 9999 unique
# qdisc_id = class_id # qdisc_id = class_id
# for interface in [self.eth_ext, self.eth_int]: # for interface in [self.eth_ext, self.eth_int]:
# tc("class add dev %(interface)s parent 1:1 classid 1:%(class_id)d " # tc("class add dev %(interface)s parent 1:1 classid 1:%(class_id)d "
@ -606,7 +606,7 @@ class firewall_komaz(firewall_crans) :
# tc("qdisc add dev %(interface)s parent 1:%(class_id)d " # tc("qdisc add dev %(interface)s parent 1:%(class_id)d "
# "handle %(qdisc_id)d: sfq perturb 10" % locals()) # "handle %(qdisc_id)d: sfq perturb 10" % locals())
# #
# # Classification des adhérents dans leur classe respective # # Classification des adhérents dans leur classe respective
# for machine in adherent.machines(): # for machine in adherent.machines():
# ip = machine.ip() # ip = machine.ip()
# if not AddrInNet(ip, NETs['all']): # if not AddrInNet(ip, NETs['all']):
@ -622,10 +622,10 @@ class firewall_komaz(firewall_crans) :
# | QOS pour le ftp | # | QOS pour le ftp |
# +-----------------+ # +-----------------+
# On ne veut pas que les gens à l'éxtérieur bouffe toute la # On ne veut pas que les gens à l'éxtérieur bouffe toute la
# bande passante. # bande passante.
# Classification des paquets à destination du ftp # Classification des paquets à destination du ftp
iptables("-t mangle -A POSTROUTING -o %(eth_int)s -p tcp -d 136.231.136.10 --dport 21 " iptables("-t mangle -A POSTROUTING -o %(eth_int)s -p tcp -d 136.231.136.10 --dport 21 "
"-j CLASSIFY --set-class 1:9997" % locals()) "-j CLASSIFY --set-class 1:9997" % locals())
@ -661,7 +661,7 @@ class firewall_komaz(firewall_crans) :
print OK print OK
def filter_table_tweaks(self) : def filter_table_tweaks(self) :
self.anim = anim('\tRègles spécifiques à komaz') self.anim = anim('\tRègles spécifiques à komaz')
for chaine in [ 'ADMIN_VLAN', 'EXT_VERS_SERVEURS', 'SERVEURS_VERS_EXT' , 'EXT_VERS_CRANS', 'CRANS_VERS_EXT', 'BLACKLIST_SRC', 'BLACKLIST_DST' , 'FILTRE_P2P', 'INGRESS_FILTERING' ] : for chaine in [ 'ADMIN_VLAN', 'EXT_VERS_SERVEURS', 'SERVEURS_VERS_EXT' , 'EXT_VERS_CRANS', 'CRANS_VERS_EXT', 'BLACKLIST_SRC', 'BLACKLIST_DST' , 'FILTRE_P2P', 'INGRESS_FILTERING' ] :
iptables('-N %s' % chaine) iptables('-N %s' % chaine)
iptables("-A FORWARD -i lo -j ACCEPT") iptables("-A FORWARD -i lo -j ACCEPT")
@ -687,21 +687,21 @@ class firewall_komaz(firewall_crans) :
print OK print OK
def classes_p2p_maj(self, ip_list): def classes_p2p_maj(self, ip_list):
""" Mise à jour de la classification pour les ip fournies """ Mise à jour de la classification pour les ip fournies
On ne crée que les règles iptables pour classer les paquets, les On ne crée que les règles iptables pour classer les paquets, les
classes correspondantes ne sont à créer que toutes à la fois """ classes correspondantes ne sont à créer que toutes à la fois """
## Que faut-il faire ? ## Que faut-il faire ?
self.anim = anim('\tAnalyse du travail à effectuer') self.anim = anim('\tAnalyse du travail à effectuer')
if ip_list == ['']: if ip_list == ['']:
print OK + ' (rien à faire)' print OK + ' (rien à faire)'
return return
print OK print OK
## Traitement ## Traitement
# MAJ des règles de classification de l'IP # MAJ des règles de classification de l'IP
def procedure(): def procedure():
self.anim = anim('\tMise à jour des classes p2p') self.anim = anim('\tMise à jour des classes p2p')
# Liste des classes candidates a la suppression # Liste des classes candidates a la suppression
scheduled_del = [] scheduled_del = []
@ -717,30 +717,30 @@ class firewall_komaz(firewall_crans) :
try: try:
for ip in ip_list: for ip in ip_list:
recherche = db.search('ip=%s&paiement=ok' % ip) recherche = db.search('ip=%s&paiement=ok' % ip)
# Si l'ip n'appartient pas à un adhérent, # Si l'ip n'appartient pas à un adhérent,
# on ne cherche pas plus loin # on ne cherche pas plus loin
if not recherche['adherent']: if not recherche['adherent']:
continue continue
machines = recherche['machine'] machines = recherche['machine']
if not machines: if not machines:
# Il faut supprimer cette entrée # Il faut supprimer cette entrée
iptables_option = '-D' iptables_option = '-D'
subnet = IpSubnet(ip, conf_fw.mask[-1]) subnet = IpSubnet(ip, conf_fw.mask[-1])
all_regles = iptables("-t mangle -L SUBNET-%(subnet)s -n" % locals()).split('\n') all_regles = iptables("-t mangle -L SUBNET-%(subnet)s -n" % locals()).split('\n')
regles = [line for line in all_regles if ip in line] regles = [line for line in all_regles if ip in line]
# On sélectionne la première qui doit contenir ce que l'on veut # On sélectionne la première qui doit contenir ce que l'on veut
regle = regles[0].split() regle = regles[0].split()
class_id = int(regle[7].split(':')[1]) class_id = int(regle[7].split(':')[1])
# On marque la classe comme candidate a la suppression # On marque la classe comme candidate a la suppression
scheduled_del.append(class_id) scheduled_del.append(class_id)
elif len(machines) == 1: elif len(machines) == 1:
# Il faut ajouter cette entrée # Il faut ajouter cette entrée
iptables_option = '-A' iptables_option = '-A'
machine = machines[0] machine = machines[0]
adherent = machine.proprietaire() adherent = machine.proprietaire()
ip = machine.ip() ip = machine.ip()
subnet = IpSubnet(ip, conf_fw.mask[-1]) subnet = IpSubnet(ip, conf_fw.mask[-1])
# On ne peut pas reprendre le numéro 1 # On ne peut pas reprendre le numéro 1
class_id = int(adherent.id()) + 1 class_id = int(adherent.id()) + 1
# On cree la classe et la qdisc s'il elles n'existent pas deja # On cree la classe et la qdisc s'il elles n'existent pas deja
# qdisc_id = class_id # qdisc_id = class_id
@ -760,7 +760,7 @@ class firewall_komaz(firewall_crans) :
# raise e # raise e
else: else:
warn += "Plusieurs machines avec l'IP %s\n" % ip warn += "Plusieurs machines avec l'IP %s\n" % ip
# Il nous faut un n° inférieur à 9999 unique # Il nous faut un n° inférieur à 9999 unique
iptables("-t mangle %(iptables_option)s SUBNET-%(subnet)s " iptables("-t mangle %(iptables_option)s SUBNET-%(subnet)s "
"-o %(eth_int)s -d %(ip)s -m mark --mark %(mark)s " "-o %(eth_int)s -d %(ip)s -m mark --mark %(mark)s "
"-j CLASSIFY --set-class 1:%(class_id)s" % locals()) "-j CLASSIFY --set-class 1:%(class_id)s" % locals())
@ -800,7 +800,7 @@ class firewall_komaz(firewall_crans) :
print OK print OK
def pre_stop_hook(self) : def pre_stop_hook(self) :
self.anim = anim("\tArrêt du routage") self.anim = anim("\tArrêt du routage")
status,output=getstatusoutput('echo 0 > /proc/sys/net/ipv4/ip_forward') status,output=getstatusoutput('echo 0 > /proc/sys/net/ipv4/ip_forward')
if status : if status :
print ERREUR print ERREUR
@ -829,10 +829,10 @@ class firewall_komaz(firewall_crans) :
self.exception_catcher(self.ext_vers_crans) self.exception_catcher(self.ext_vers_crans)
def log_chaines(self) : def log_chaines(self) :
""" Construction des chaînes de log (LOG_VIRUS et LOG_FLOOD) """ """ Construction des chaînes de log (LOG_VIRUS et LOG_FLOOD) """
self.anim = anim('\tCréation des chaînes de log') self.anim = anim('\tCréation des chaînes de log')
for filtre in [ 'VIRUS', 'FLOOD' ] : for filtre in [ 'VIRUS', 'FLOOD' ] :
# Vidage de la chaîne # Vidage de la chaîne
iptables('-t nat -F LOG_%s' % filtre) iptables('-t nat -F LOG_%s' % filtre)
iptables('-t nat -A LOG_%s %s %s:' % (filtre, self.log_template, filtre.capitalize()) ) iptables('-t nat -A LOG_%s %s %s:' % (filtre, self.log_template, filtre.capitalize()) )
iptables('-t nat -A LOG_%s -j DROP' % filtre ) iptables('-t nat -A LOG_%s -j DROP' % filtre )
@ -841,7 +841,7 @@ class firewall_komaz(firewall_crans) :
print OK print OK
def test_virus_flood(self) : def test_virus_flood(self) :
""" Construction de la chaîne TEST_VIRUS """ """ Construction de la chaîne TEST_VIRUS """
iptables('-t nat -F TEST_VIRUS_FLOOD') iptables('-t nat -F TEST_VIRUS_FLOOD')
self.anim = anim('\tFiltrage virus et floods') self.anim = anim('\tFiltrage virus et floods')
@ -855,39 +855,39 @@ class firewall_komaz(firewall_crans) :
iptables('-t nat -A TEST_VIRUS_FLOOD -p %s --dport %s -j LOG_VIRUS' % (proto, port) ) iptables('-t nat -A TEST_VIRUS_FLOOD -p %s --dport %s -j LOG_VIRUS' % (proto, port) )
self.anim.cycle() self.anim.cycle()
iptables('-t nat -A TEST_VIRUS_FLOOD %s -j RETURN' % self.filtre_flood) # Les limites en négatif ca ne marche pas. iptables('-t nat -A TEST_VIRUS_FLOOD %s -j RETURN' % self.filtre_flood) # Les limites en négatif ca ne marche pas.
self.anim.cycle() self.anim.cycle()
iptables('-t nat -A TEST_VIRUS_FLOOD -j LOG_FLOOD') iptables('-t nat -A TEST_VIRUS_FLOOD -j LOG_FLOOD')
self.anim.reinit() self.anim.reinit()
print OK print OK
def serveurs_vers_ext(self) : def serveurs_vers_ext(self) :
""" Reconstruit la chaîne SERVEURS_VERS_EXT """ """ Reconstruit la chaîne SERVEURS_VERS_EXT """
if not self.build_chaine('SERVEURS_VERS_EXT', self.__serveurs_vers_ext) : if not self.build_chaine('SERVEURS_VERS_EXT', self.__serveurs_vers_ext) :
self.anim.reinit() self.anim.reinit()
print OK print OK
def ext_vers_serveurs(self) : def ext_vers_serveurs(self) :
""" Reconstruit la chaîne EXT_VERS_SERVEURS """ """ Reconstruit la chaîne EXT_VERS_SERVEURS """
if not self.build_chaine('EXT_VERS_SERVEURS', self.__ext_vers_serveurs) : if not self.build_chaine('EXT_VERS_SERVEURS', self.__ext_vers_serveurs) :
self.anim.reinit() self.anim.reinit()
print OK print OK
# Attention les règles sont à l'envers. Hint '-I' # Attention les règles sont à l'envers. Hint '-I'
iptables("-I EXT_VERS_SERVEURS -p tcp --dport ssh -m state --state NEW\ iptables("-I EXT_VERS_SERVEURS -p tcp --dport ssh -m state --state NEW\
-m recent --name SSH --update --seconds 60 --hitcount 4 --rttl -j DROP") -m recent --name SSH --update --seconds 60 --hitcount 4 --rttl -j DROP")
iptables("-I EXT_VERS_SERVEURS -p tcp --dport ssh -m state --state NEW\ iptables("-I EXT_VERS_SERVEURS -p tcp --dport ssh -m state --state NEW\
-m recent --name SSH --set") -m recent --name SSH --set")
def crans_vers_ext(self) : def crans_vers_ext(self) :
""" Reconstruit la chaîne CRANS_VERS_EXT """ """ Reconstruit la chaîne CRANS_VERS_EXT """
self.build_chaine_adherent('CRANS_VERS_EXT',self.__crans_vers_ext) self.build_chaine_adherent('CRANS_VERS_EXT',self.__crans_vers_ext)
# Protocole GRE pour les VPN # Protocole GRE pour les VPN
iptables("-I CRANS_VERS_EXT -p gre -j ACCEPT") iptables("-I CRANS_VERS_EXT -p gre -j ACCEPT")
def ext_vers_crans(self) : def ext_vers_crans(self) :
""" Reconstruit la chaîne EXT_VERS_CRANS """ """ Reconstruit la chaîne EXT_VERS_CRANS """
self.build_chaine_adherent('EXT_VERS_CRANS',self.__ext_vers_crans) self.build_chaine_adherent('EXT_VERS_CRANS',self.__ext_vers_crans)
# Attention les règles sont à l'envers. Hint '-I' # Attention les règles sont à l'envers. Hint '-I'
iptables("-I EXT_VERS_CRANS -p tcp --dport ssh -m state --state NEW -j ACCEPT") iptables("-I EXT_VERS_CRANS -p tcp --dport ssh -m state --state NEW -j ACCEPT")
iptables("-I EXT_VERS_CRANS -p tcp --dport ssh -m state --state NEW\ iptables("-I EXT_VERS_CRANS -p tcp --dport ssh -m state --state NEW\
-m recent --name SSH --update --seconds 60 --hitcount 4 --rttl -j DROP") -m recent --name SSH --update --seconds 60 --hitcount 4 --rttl -j DROP")
@ -895,14 +895,14 @@ class firewall_komaz(firewall_crans) :
-m recent --name SSH --set") -m recent --name SSH --set")
def admin_vlan(self) : def admin_vlan(self) :
""" Reconstruit la chaîne ADMIN_VLAN """ """ Reconstruit la chaîne ADMIN_VLAN """
iptables("-F ADMIN_VLAN") iptables("-F ADMIN_VLAN")
#nounou_machines = [] #nounou_machines = []
#for adherent in db.search('droits=Nounou')['adherent'] : #for adherent in db.search('droits=Nounou')['adherent'] :
# for machine in adherent.machines() : # for machine in adherent.machines() :
# nounou_machines.append(machine.ip()) # nounou_machines.append(machine.ip())
iptables("-A ADMIN_VLAN -j REJECT") iptables("-A ADMIN_VLAN -j REJECT")
#self.anim = anim('\tChaîne ADMIN_VLAN', len(nounou_machines)) #self.anim = anim('\tChaîne ADMIN_VLAN', len(nounou_machines))
#for machine in nounou_machines : #for machine in nounou_machines :
# self.anim.cycle() # self.anim.cycle()
# iptables("-I ADMIN_VLAN -p tcp -s %s --dport ssh -j ACCEPT" % machine) # iptables("-I ADMIN_VLAN -p tcp -s %s --dport ssh -j ACCEPT" % machine)
@ -913,7 +913,7 @@ class firewall_komaz(firewall_crans) :
def __serveurs_vers_ext(self,machine): def __serveurs_vers_ext(self,machine):
ip=machine.ip() ip=machine.ip()
if not AddrInNet(ip,self.zone_serveur): if not AddrInNet(ip,self.zone_serveur):
# C'est une machine adhérent, rien à faire ici # C'est une machine adhérent, rien à faire ici
return return
mac = machine.mac() mac = machine.mac()
@ -928,7 +928,7 @@ class firewall_komaz(firewall_crans) :
def __ext_vers_serveurs(self,machine): def __ext_vers_serveurs(self,machine):
ip=machine.ip() ip=machine.ip()
if not AddrInNet(ip,self.zone_serveur): if not AddrInNet(ip,self.zone_serveur):
# C'est une machine adhérent, rien à faire ici # C'est une machine adhérent, rien à faire ici
return return
ports = { 'tcp' : machine.portTCPin(), ports = { 'tcp' : machine.portTCPin(),
@ -942,7 +942,7 @@ class firewall_komaz(firewall_crans) :
def __crans_vers_ext(self,machine): def __crans_vers_ext(self,machine):
ip=machine.ip() ip=machine.ip()
if AddrInNet(ip,self.zone_serveur): if AddrInNet(ip,self.zone_serveur):
# C'est un serveur, rien à faire ici # C'est un serveur, rien à faire ici
return return
ports = { 'tcp' : machine.portTCPout(), ports = { 'tcp' : machine.portTCPout(),
@ -956,7 +956,7 @@ class firewall_komaz(firewall_crans) :
def __ext_vers_crans(self,machine): def __ext_vers_crans(self,machine):
ip=machine.ip() ip=machine.ip()
if AddrInNet(ip,self.zone_serveur): if AddrInNet(ip,self.zone_serveur):
# C'est un serveur, rien à faire ici # C'est un serveur, rien à faire ici
return return
ports = { 'tcp' : machine.portTCPin(), ports = { 'tcp' : machine.portTCPin(),
@ -968,18 +968,18 @@ class firewall_komaz(firewall_crans) :
%(ip,proto,port)) %(ip,proto,port))
def blacklist(self): def blacklist(self):
""" Construit les chaînes de blackliste (BLACKLIST_{DST,SRC}) """ """ Construit les chaînes de blackliste (BLACKLIST_{DST,SRC}) """
iptables('-F BLACKLIST_DST') iptables('-F BLACKLIST_DST')
iptables('-F BLACKLIST_SRC') iptables('-F BLACKLIST_SRC')
# Peut-être à mettre dans config.py ? # Peut-être à mettre dans config.py ?
blacklist_sanctions = ('upload', 'warez', 'p2p', 'autodisc_p2p', 'autodisc_upload', 'bloq') blacklist_sanctions = ('upload', 'warez', 'p2p', 'autodisc_p2p', 'autodisc_upload', 'bloq')
blacklist = [] blacklist = []
# Recherche sur le champ ablacklist (clubs compris) # Recherche sur le champ ablacklist (clubs compris)
search = db.search('ablacklist=*&paiement=ok') search = db.search('ablacklist=*&paiement=ok')
self.anim = anim("\tBlackliste adhérents+clubs", len(search['adherent']+search['club'])) self.anim = anim("\tBlackliste adhérents+clubs", len(search['adherent']+search['club']))
for entite in search['adherent'] + search['club']: for entite in search['adherent'] + search['club']:
self.anim.cycle() self.anim.cycle()
sanctions = entite.blacklist_actif() sanctions = entite.blacklist_actif()
@ -1003,7 +1003,7 @@ class firewall_komaz(firewall_crans) :
self.anim.reinit() self.anim.reinit()
print OK print OK
self.anim = anim("\tChaînes BLACKLISTE", len(blacklist)) self.anim = anim("\tChaînes BLACKLISTE", len(blacklist))
for machine in blacklist: for machine in blacklist:
self.anim.cycle() self.anim.cycle()
iptables("-A BLACKLIST_DST -d %s -j REJECT --reject-with icmp-host-prohibited" % machine.ip()) iptables("-A BLACKLIST_DST -d %s -j REJECT --reject-with icmp-host-prohibited" % machine.ip())
@ -1012,7 +1012,7 @@ class firewall_komaz(firewall_crans) :
print OK print OK
def filtre_p2p(self): def filtre_p2p(self):
""" Construit la chaînes de filtrage du p2p (FILTRE_P2P) """ """ Construit la chaînes de filtrage du p2p (FILTRE_P2P) """
self.anim = anim("\tFiltrage p2p") self.anim = anim("\tFiltrage p2p")
iptables('-F FILTRE_P2P') iptables('-F FILTRE_P2P')
@ -1051,9 +1051,9 @@ class firewall_zamok(firewall_crans) :
SERV_OUT_ADM SERV_OUT_ADM
TEST_MAC-IP TEST_MAC-IP
table filter : table filter :
FORWARD (policy par défaut : DROP) FORWARD (policy par défaut : DROP)
rien ne passe pas la chaîne FORWARD rien ne passe pas la chaîne FORWARD
INPUT (policy par défaut : ACCEPT) INPUT (policy par défaut : ACCEPT)
""" """
@ -1064,7 +1064,7 @@ class firewall_zamok(firewall_crans) :
def serv_out_adm(self) : def serv_out_adm(self) :
self.anim = anim('\tOutput vers VLAN adm', len(adm_users)) self.anim = anim('\tOutput vers VLAN adm', len(adm_users))
# Supression des éventuelles règles # Supression des éventuelles règles
iptables("-t filter -F SERV_OUT_ADM") iptables("-t filter -F SERV_OUT_ADM")
for user in adm_users : for user in adm_users :
@ -1079,7 +1079,7 @@ class firewall_zamok(firewall_crans) :
iptables("-A SERV_OUT_ADM -p tcp --dport domain -j ACCEPT") iptables("-A SERV_OUT_ADM -p tcp --dport domain -j ACCEPT")
iptables("-A SERV_OUT_ADM -p udp --dport domain -j ACCEPT") iptables("-A SERV_OUT_ADM -p udp --dport domain -j ACCEPT")
# Pour le nfs (le paquet à laisser passer n'a pas d'owner) # Pour le nfs (le paquet à laisser passer n'a pas d'owner)
iptables("-A SERV_OUT_ADM -d fx.adm.crans.org -j ACCEPT") iptables("-A SERV_OUT_ADM -d fx.adm.crans.org -j ACCEPT")
# Rien d'autre ne passe # Rien d'autre ne passe
@ -1117,11 +1117,11 @@ class firewall_zamok(firewall_crans) :
self.serv_out_adm() self.serv_out_adm()
def blacklist(self): def blacklist(self):
"""Fondamentalement, bloque l'accès internet sur zamok aux """Fondamentalement, bloque l'accès internet sur zamok aux
adhérents sanctionnés""" adhérents sanctionnés"""
iptables("-F OUTPUT") iptables("-F OUTPUT")
# Règles OUTPUT de nat_table() à remettre en place # Règles OUTPUT de nat_table() à remettre en place
iptables("-t filter -A OUTPUT -o lo -j ACCEPT") iptables("-t filter -A OUTPUT -o lo -j ACCEPT")
iptables("-t filter -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT") iptables("-t filter -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT")
iptables("-t filter -A OUTPUT -o %s -j SERV_OUT_ADM" % self.eth_adm) iptables("-t filter -A OUTPUT -o %s -j SERV_OUT_ADM" % self.eth_adm)
@ -1150,7 +1150,7 @@ class firewall_zamok(firewall_crans) :
print OK print OK
def filter_table_tweaks(self) : def filter_table_tweaks(self) :
self.anim = anim('\tRègles spécifiques à zamok') self.anim = anim('\tRègles spécifiques à zamok')
iptables("-P INPUT ACCEPT") iptables("-P INPUT ACCEPT")
iptables("-P FORWARD DROP") iptables("-P FORWARD DROP")
print OK print OK
@ -1166,9 +1166,9 @@ class firewall_rouge(firewall_crans) :
SERV_OUT_ADM SERV_OUT_ADM
TEST_MAC-IP TEST_MAC-IP
table filter : table filter :
FORWARD (policy par défaut : DROP) FORWARD (policy par défaut : DROP)
rien ne passe pas la chaîne FORWARD rien ne passe pas la chaîne FORWARD
INPUT (policy par défaut : ACCEPT) INPUT (policy par défaut : ACCEPT)
""" """
@ -1192,7 +1192,7 @@ class firewall_rouge(firewall_crans) :
print OK print OK
def filter_table_tweaks(self) : def filter_table_tweaks(self) :
self.anim = anim('\tRègles spécifiques à rouge') self.anim = anim('\tRègles spécifiques à rouge')
iptables("-P INPUT ACCEPT") iptables("-P INPUT ACCEPT")
iptables("-P FORWARD DROP") iptables("-P FORWARD DROP")
print OK print OK
@ -1208,9 +1208,9 @@ class firewall_vert(firewall_crans) :
table nat : table nat :
MAC-IP MAC-IP
table filter : table filter :
FORWARD (policy par défaut : DROP) FORWARD (policy par défaut : DROP)
rien ne passe pas la chaîne FORWARD rien ne passe pas la chaîne FORWARD
INPUT (policy par défaut : ACCEPT) INPUT (policy par défaut : ACCEPT)
""" """
@ -1233,7 +1233,7 @@ class firewall_vert(firewall_crans) :
print OK print OK
def filter_table_tweaks(self) : def filter_table_tweaks(self) :
self.anim = anim('\tRègles spécifiques à vert') self.anim = anim('\tRègles spécifiques à vert')
iptables("-P INPUT ACCEPT") iptables("-P INPUT ACCEPT")
iptables("-P FORWARD DROP") iptables("-P FORWARD DROP")
print OK print OK
@ -1252,7 +1252,7 @@ class firewall_sable(firewall_rouge):
iptables("-t mangle -A PREROUTING -m mark --mark %s -j ACCEPT" % conf_fw.mark['proxy']) iptables("-t mangle -A PREROUTING -m mark --mark %s -j ACCEPT" % conf_fw.mark['proxy'])
# On marque les paquets venant du vlan radin vers de l'https # On marque les paquets venant du vlan radin vers de l'https
# pour qu'ils soient nattés # pour qu'ils soient nattés
iptables("-t mangle -A PREROUTING -i eth0.%d -p tcp -m tcp --dport 443 -j MARK --set-mark %s" % iptables("-t mangle -A PREROUTING -i eth0.%d -p tcp -m tcp --dport 443 -j MARK --set-mark %s" %
(vlans["radin"], conf_fw.mark["https-radin"])) (vlans["radin"], conf_fw.mark["https-radin"]))
@ -1289,7 +1289,7 @@ class firewall_sable(firewall_rouge):
# Nat pour le https sur le vlan radin # Nat pour le https sur le vlan radin
iptables("-t nat -A POSTROUTING -m mark --mark %s -j MASQUERADE" % conf_fw.mark["https-radin"]) iptables("-t nat -A POSTROUTING -m mark --mark %s -j MASQUERADE" % conf_fw.mark["https-radin"])
# Limite de débit sur le vlan radin # Limite de débit sur le vlan radin
try: try:
tc("qdisc del dev %s root" % if_radin) tc("qdisc del dev %s root" % if_radin)
except TcError, c: except TcError, c:
@ -1325,8 +1325,8 @@ class firewall_gordon(firewall_crans) :
table nat : table nat :
MAC-IP MAC-IP
table filter : table filter :
FORWARD (policy par défaut : ACCEPT) FORWARD (policy par défaut : ACCEPT)
INPUT (policy par défaut : ACCEPT) INPUT (policy par défaut : ACCEPT)
table mangle : table mangle :
POSTROUTING : le proxy transparent POSTROUTING : le proxy transparent
@ -1352,13 +1352,13 @@ class firewall_gordon(firewall_crans) :
print OK print OK
def filter_table_tweaks(self) : def filter_table_tweaks(self) :
self.anim = anim('\tRègles spécifiques à gordon') self.anim = anim('\tRègles spécifiques à gordon')
iptables("-P INPUT ACCEPT") iptables("-P INPUT ACCEPT")
iptables("-P FORWARD ACCEPT") iptables("-P FORWARD ACCEPT")
print OK print OK
def mangle_table(self): def mangle_table(self):
self.anim = anim('\tRègles spécifiques à gordon') self.anim = anim('\tRègles spécifiques à gordon')
iptables("-t mangle -A PREROUTING " + iptables("-t mangle -A PREROUTING " +
"-d ! 138.231.136.0/21 " + "-d ! 138.231.136.0/21 " +
("-i %s " % self.eth_wifi) + ("-i %s " % self.eth_wifi) +
@ -1383,7 +1383,7 @@ class firewall_gordon(firewall_crans) :
if __name__ == '__main__' : if __name__ == '__main__' :
# Chaînes pouvant être recontruites # Chaînes pouvant être recontruites
fw = eval('firewall_%s()' % hostname) fw = eval('firewall_%s()' % hostname)
chaines = [] chaines = []
for nom in dir(fw) : for nom in dir(fw) :
@ -1396,11 +1396,11 @@ if __name__ == '__main__' :
print """Usage: print """Usage:
%(p)s start : Construction du firewall. %(p)s start : Construction du firewall.
%(p)s restart : Reconstruction du firewall. %(p)s restart : Reconstruction du firewall.
%(p)s stop : Arrêt du firewall. %(p)s stop : Arrêt du firewall.
%(p)s <noms de chaînes> : reconstruit les chaînes %(p)s <noms de chaînes> : reconstruit les chaînes
Les chaînes pouvant être reconstruites sont : Les chaînes pouvant être reconstruites sont :
%(chaines)s %(chaines)s
Pour reconfiguration d'IPs particulières, utiliser generate. """ % \ Pour reconfiguration d'IPs particulières, utiliser generate. """ % \
{ 'p' : sys.argv[0].split('/')[-1] , 'chaines' : '\n '.join(chaines) } { 'p' : sys.argv[0].split('/')[-1] , 'chaines' : '\n '.join(chaines) }
sys.exit(-1) sys.exit(-1)
@ -1409,7 +1409,7 @@ Pour reconfiguration d'IPs particuli
__usage() __usage()
for arg in sys.argv[1:] : for arg in sys.argv[1:] :
if arg in [ 'stop', 'restart', 'start' ] and len(sys.argv) != 2 : if arg in [ 'stop', 'restart', 'start' ] and len(sys.argv) != 2 :
__usage("L'argument %s ne peut être employé que seul." % arg) __usage("L'argument %s ne peut être employé que seul." % arg)
if arg not in [ 'stop', 'restart', 'start' ] + chaines : if arg not in [ 'stop', 'restart', 'start' ] + chaines :
__usage("L'argument %s est inconnu." % arg) __usage("L'argument %s est inconnu." % arg)