whitespaces

darcs-hash:20071024173647-f163d-8f61c1a48de8c81860fd5ac520a4bad427745809.gz
This commit is contained in:
segaud 2007-10-24 19:36:47 +02:00
parent adadcea7ef
commit f6766135ae

View file

@ -85,8 +85,8 @@ def redirect_chain(table, chain_in, chain_out, ip) :
# 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))
class firewall_crans : class firewall_crans :
""" """
Classe parente pour les firewalls du crans Classe parente pour les firewalls du crans
@ -112,11 +112,11 @@ class firewall_crans :
vlan_adm = NETs['vlan-adm'][0] vlan_adm = NETs['vlan-adm'][0]
adm_users = [ "root", "identd", "daemon", "postfix", "freerad", "amavis", "nut", "respbats", "list", "sqlgrey", "ntpd", "lp" ] adm_users = [ "root", "identd", "daemon", "postfix", "freerad", "amavis", "nut", "respbats", "list", "sqlgrey", "ntpd", "lp" ]
limit = " -m limit --limit 10/s --limit-burst 10 " limit = " -m limit --limit 10/s --limit-burst 10 "
log_template = '-m limit --limit 1/s --limit-burst 1 -j LOG --log-level notice --log-prefix ' log_template = '-m limit --limit 1/s --limit-burst 1 -j LOG --log-level notice --log-prefix '
filtre_flood = '-m hashlimit --hashlimit 20 --hashlimit-mode srcip --hashlimit-name flood' filtre_flood = '-m hashlimit --hashlimit 20 --hashlimit-mode srcip --hashlimit-name flood'
machines = [] machines = []
debug = 1 debug = 1
@ -141,11 +141,11 @@ class firewall_crans :
def __machines(self) : def __machines(self) :
""" Liste des machines du crans """ """ Liste des machines du crans """
return db.all_machines(graphic=True) return db.all_machines(graphic=True)
def __init__(self) : def __init__(self) :
""" Pose un lock """ """ Pose un lock """
make_lock('firewall') make_lock('firewall')
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
@ -195,16 +195,16 @@ class firewall_crans :
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
# Initialisation # Initialisation
self.exception_catcher(self.mangle_table) self.exception_catcher(self.mangle_table)
self.exception_catcher(self.nat_table) self.exception_catcher(self.nat_table)
self.exception_catcher(self.filter_table) self.exception_catcher(self.filter_table)
self.exception_catcher(self.filter_table_tweaks) self.exception_catcher(self.filter_table_tweaks)
# Remplissage # Remplissage
self.start_fw_funcs() self.start_fw_funcs()
# 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')
@ -215,7 +215,7 @@ class firewall_crans :
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")
@ -227,14 +227,14 @@ class firewall_crans :
iptables("-t mangle -X") iptables("-t mangle -X")
print OK print OK
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()
def procedure() : def procedure() :
for machine in self.__machines() : for machine in self.__machines() :
self.__test_mac_ip(machine) self.__test_mac_ip(machine)
@ -243,10 +243,10 @@ class firewall_crans :
iptables("-t nat -P PREROUTING ACCEPT") iptables("-t nat -P PREROUTING ACCEPT")
self.anim.reinit() self.anim.reinit()
print OK print OK
self.exception_catcher(procedure) self.exception_catcher(procedure)
def __test_mac_ip(self,machine): def __test_mac_ip(self,machine):
ip=machine.ip() ip=machine.ip()
mac=machine.mac() mac=machine.mac()
@ -291,7 +291,7 @@ class firewall_crans :
if adh_maj : if adh_maj :
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 ?
@ -299,7 +299,7 @@ class firewall_crans :
if ip_list == [''] : if ip_list == [''] :
print OK + ' (rien à faire)' print OK + ' (rien à faire)'
return return
mac_ip_maj = {} mac_ip_maj = {}
serveur_maj = False serveur_maj = False
for ip in ip_list : for ip in ip_list :
@ -325,14 +325,14 @@ class firewall_crans :
print WARNING print WARNING
if debug : if debug :
sys.stderr.write("Plusieurs machines avec l'IP %s\n" % ip) sys.stderr.write("Plusieurs machines avec l'IP %s\n" % ip)
print OK print OK
## Traitement ## Traitement
# Serveurs # Serveurs
if serveur_maj : if serveur_maj :
self.serveurs_maj() self.serveurs_maj()
# Correspondance MAC-IP # Correspondance MAC-IP
if mac_ip_maj or serveur_maj : if mac_ip_maj or serveur_maj :
def procedure() : def procedure() :
@ -365,7 +365,7 @@ class firewall_crans :
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 :
@ -375,7 +375,7 @@ class firewall_crans :
sys.stdout.write(warn) sys.stdout.write(warn)
else : else :
print OK print OK
self.exception_catcher(procedure) self.exception_catcher(procedure)
def build_chaine_adherent(self,chaine,methode) : def build_chaine_adherent(self,chaine,methode) :
@ -401,7 +401,7 @@ class firewall_crans :
iptables("-A %s -j REJECT" % chaine) iptables("-A %s -j REJECT" % chaine)
return self.exception_catcher(procedure) return self.exception_catcher(procedure)
""" """
Komaz Komaz
""" """
@ -413,10 +413,10 @@ class firewall_komaz(firewall_crans) :
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)
@ -427,12 +427,12 @@ class firewall_komaz(firewall_crans) :
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
RESEAUX_NON_ROUTABLES_DST droppe les paquets dont la destination est non routable RESEAUX_NON_ROUTABLES_DST droppe les paquets dont la destination est non routable
RESEAUX_NON_ROUTABLES_SRC droppe les paquets dont la source est non routable RESEAUX_NON_ROUTABLES_SRC droppe les paquets dont la source est non routable
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
@ -441,7 +441,7 @@ class firewall_komaz(firewall_crans) :
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 FILTRE_P2P filtre le traffic de p2p
EXT_VERS_CRANS et CRANS_VERS_EXT EXT_VERS_CRANS et CRANS_VERS_EXT
@ -451,20 +451,20 @@ class firewall_komaz(firewall_crans) :
ACCEPT pour bon mac-ip-port ACCEPT pour bon mac-ip-port
REJECT pour le reste REJECT pour le reste
""" """
# interfaces physiques # interfaces physiques
eth_ext = "ens" eth_ext = "ens"
eth_int = "crans" eth_int = "crans"
# Ports ouverts # Ports ouverts
ports_default = { 'tcp_EXT_VERS_CRANS' : [ '22' ], ports_default = { 'tcp_EXT_VERS_CRANS' : [ '22' ],
'tcp_CRANS_VERS_EXT': [ ':24', '26:79', '81:134', '136', '140:444', '446:'], 'tcp_CRANS_VERS_EXT': [ ':24', '26:79', '81:134', '136', '140:444', '446:'],
'udp_EXT_VERS_CRANS' : [ ], 'udp_EXT_VERS_CRANS' : [ ],
'udp_CRANS_VERS_EXT': [ ':136','140:'] } 'udp_CRANS_VERS_EXT': [ ':136','140:'] }
ports_virus = { 'tcp' : [ 135, 445 ] , 'udp' : [] } ports_virus = { 'tcp' : [ 135, 445 ] , 'udp' : [] }
# Filtrage du peer to peer # Filtrage du peer to peer
filtres_p2p = [ ('bit', 'Bittorrent'), filtres_p2p = [ ('bit', 'Bittorrent'),
('apple', 'AppleJuice'), ('apple', 'AppleJuice'),
@ -494,11 +494,11 @@ 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")
# Proxy transparent # Proxy transparent
iptables("-t mangle -A PREROUTING -s %s -j RETURN" % self.zone_serveur) iptables("-t mangle -A PREROUTING -s %s -j RETURN" % self.zone_serveur)
iptables("-t mangle -A PREROUTING -p tcp --destination-port 80 " iptables("-t mangle -A PREROUTING -p tcp --destination-port 80 "
@ -513,10 +513,10 @@ class firewall_komaz(firewall_crans) :
debit_max = p2p.debit_max debit_max = p2p.debit_max
eth_ext = self.eth_ext eth_ext = self.eth_ext
eth_int = self.eth_int eth_int = self.eth_int
# On ne va pas plus loin si il ne s'agit pas de bittorrent # On ne va pas plus loin si il ne s'agit pas de bittorrent
iptables("-t mangle -A POSTROUTING -m mark ! --mark %s -j ACCEPT" % mark) iptables("-t mangle -A POSTROUTING -m mark ! --mark %s -j ACCEPT" % mark)
# On marque les paquets bittorrent uniquement # On marque les paquets bittorrent uniquement
iptables("-t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark") iptables("-t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark")
iptables("-t mangle -A PREROUTING -p tcp -m mark ! --mark 0x0 -j ACCEPT") iptables("-t mangle -A PREROUTING -p tcp -m mark ! --mark 0x0 -j ACCEPT")
@ -524,16 +524,16 @@ class firewall_komaz(firewall_crans) :
"-j MARK --set-mark %s" % mark) "-j MARK --set-mark %s" % mark)
iptables("-t mangle -A PREROUTING -p tcp -m mark --mark %s " iptables("-t mangle -A PREROUTING -p tcp -m mark --mark %s "
"-j CONNMARK --save-mark" % mark) "-j CONNMARK --save-mark" % mark)
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:
@ -568,7 +568,7 @@ class firewall_komaz(firewall_crans) :
"htb rate %(debit_adh)s ceil %(debit_adh)s" % locals()) "htb rate %(debit_adh)s ceil %(debit_adh)s" % locals())
tc("qdisc add dev %(interface)s parent 1:9998 " tc("qdisc add dev %(interface)s parent 1:9998 "
"handle 9999: sfq perturb 10" % locals()) "handle 9999: 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()
@ -581,7 +581,7 @@ class firewall_komaz(firewall_crans) :
"htb rate %(debit_adh)s ceil %(debit_max)s" % locals()) "htb rate %(debit_adh)s ceil %(debit_max)s" % locals())
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()
@ -660,7 +660,7 @@ class firewall_komaz(firewall_crans) :
# 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 = []
warn = '' warn = ''
@ -671,7 +671,7 @@ class firewall_komaz(firewall_crans) :
debit_max = p2p.debit_max debit_max = p2p.debit_max
eth_ext = self.eth_ext eth_ext = self.eth_ext
eth_int = self.eth_int eth_int = self.eth_int
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)
@ -732,13 +732,13 @@ class firewall_komaz(firewall_crans) :
for class_id in scheduled_del: for class_id in scheduled_del:
# TODO: supprimer les classes qui sont vraiment vides # TODO: supprimer les classes qui sont vraiment vides
pass pass
if warn: if warn:
print WARNING print WARNING
sys.stdout.write(warn) sys.stdout.write(warn)
else: else:
print OK print OK
self.exception_catcher(procedure) self.exception_catcher(procedure)
def post_start_hook(self) : def post_start_hook(self) :
@ -798,22 +798,22 @@ class firewall_komaz(firewall_crans) :
self.anim.cycle() self.anim.cycle()
self.anim.reinit() self.anim.reinit()
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')
ip_vers = ('65.19.154.90', '208.72.168.52', '66.109.25.121', '193.37.152.88', '89.149.202.101') ip_vers = ('65.19.154.90', '208.72.168.52', '66.109.25.121', '193.37.152.88', '89.149.202.101')
for ip in ip_vers: for ip in ip_vers:
iptables('-t nat -A TEST_VIRUS_FLOOD -s %s -j LOG_VIRUS' % ip) iptables('-t nat -A TEST_VIRUS_FLOOD -s %s -j LOG_VIRUS' % ip)
iptables('-t nat -A TEST_VIRUS_FLOOD -d %s -j LOG_VIRUS' % ip) iptables('-t nat -A TEST_VIRUS_FLOOD -d %s -j LOG_VIRUS' % ip)
for proto, ports in self.ports_virus.items() : for proto, ports in self.ports_virus.items() :
for port in ports : for port in ports :
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')
@ -825,13 +825,13 @@ class firewall_komaz(firewall_crans) :
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
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)
@ -856,7 +856,7 @@ class firewall_komaz(firewall_crans) :
#self.anim.reinit() #self.anim.reinit()
#print OK #print OK
def __serveurs_vers_ext(self,machine): prout __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
@ -876,43 +876,43 @@ class firewall_komaz(firewall_crans) :
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(),
'udp' : machine.portUDPin() } 'udp' : machine.portUDPin() }
for proto in [ 'tcp', 'udp' ] : for proto in [ 'tcp', 'udp' ] :
for port in ports[proto]: for port in ports[proto]:
iptables("-I EXT_VERS_SERVEURS -d %s -p %s --dport %s -j ACCEPT"\ iptables("-I EXT_VERS_SERVEURS -d %s -p %s --dport %s -j ACCEPT"\
%(ip,proto,port)) %(ip,proto,port))
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(),
'udp' : machine.portUDPout() } 'udp' : machine.portUDPout() }
for proto in [ 'tcp', 'udp' ] : for proto in [ 'tcp', 'udp' ] :
for port in ports[proto]: for port in ports[proto]:
iptables("-I CRANS_VERS_EXT -s %s -p %s --dport %s -j ACCEPT" \ iptables("-I CRANS_VERS_EXT -s %s -p %s --dport %s -j ACCEPT" \
%(ip,proto,port)) %(ip,proto,port))
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(),
'udp' : machine.portUDPin() } 'udp' : machine.portUDPin() }
for proto in [ 'tcp', 'udp' ] : for proto in [ 'tcp', 'udp' ] :
for port in ports[proto]: for port in ports[proto]:
iptables("-I EXT_VERS_CRANS -d %s -p %s --dport %s -j ACCEPT" \ iptables("-I EXT_VERS_CRANS -d %s -p %s --dport %s -j ACCEPT" \
%(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')
@ -920,9 +920,9 @@ class firewall_komaz(firewall_crans) :
# 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=%s' % ann_scol) search = db.search('ablacklist=*&paiement=%s' % ann_scol)
self.anim = anim("\tBlackliste adhérents+clubs", len(search['adherent']+search['club'])) self.anim = anim("\tBlackliste adhérents+clubs", len(search['adherent']+search['club']))
@ -935,7 +935,7 @@ class firewall_komaz(firewall_crans) :
break break
self.anim.reinit() self.anim.reinit()
print OK print OK
# Recherche sur le champ mblacklist # Recherche sur le champ mblacklist
search = db.search('mblacklist=*&paiement=%s' % ann_scol) search = db.search('mblacklist=*&paiement=%s' % ann_scol)
self.anim = anim("\tBlackliste machines", len(search['machine'])) self.anim = anim("\tBlackliste machines", len(search['machine']))
@ -964,7 +964,7 @@ class firewall_komaz(firewall_crans) :
# On ne filtre que ce qui passe sur l'interface externe # On ne filtre que ce qui passe sur l'interface externe
iptables('-A FILTRE_P2P -i %s -o %s -j RETURN' % (self.eth_int, self.eth_int) ) iptables('-A FILTRE_P2P -i %s -o %s -j RETURN' % (self.eth_int, self.eth_int) )
for filtre in self.filtres_p2p : for filtre in self.filtres_p2p :
iptables('-A FILTRE_P2P -m ipp2p --%s -j LOG --log-prefix "IPP2P=%s "' % (filtre[0], iptables('-A FILTRE_P2P -m ipp2p --%s -j LOG --log-prefix "IPP2P=%s "' % (filtre[0],
@ -972,10 +972,10 @@ class firewall_komaz(firewall_crans) :
#iptables('-A FILTRE_P2P -m ipp2p --%s -j REJECT --reject-with icmp-admin-prohibited' % filtre[0]) #iptables('-A FILTRE_P2P -m ipp2p --%s -j REJECT --reject-with icmp-admin-prohibited' % filtre[0])
iptables('-A FILTRE_P2P -m ipp2p --%s -j RETURN' % filtre[0]) iptables('-A FILTRE_P2P -m ipp2p --%s -j RETURN' % filtre[0])
self.anim.cycle() self.anim.cycle()
self.anim.reinit() self.anim.reinit()
print OK print OK
def serveurs_maj(self) : def serveurs_maj(self) :
self.exception_catcher(self.serveurs_vers_ext) self.exception_catcher(self.serveurs_vers_ext)
@ -993,9 +993,9 @@ class firewall_zamok(firewall_crans) :
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)
""" """
# interfaces physiques # interfaces physiques
eth_pub = "crans" eth_pub = "crans"
eth_adm = "crans.2" eth_adm = "crans.2"
@ -1004,7 +1004,7 @@ class firewall_zamok(firewall_crans) :
self.anim = anim('\tOutput vers VLAN adm', len(self.adm_users)) self.anim = anim('\tOutput vers VLAN adm', len(self.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 self.adm_users : for user in self.adm_users :
self.anim.cycle() self.anim.cycle()
try: try:
@ -1016,14 +1016,14 @@ class firewall_zamok(firewall_crans) :
iptables("-A SERV_OUT_ADM -p tcp --dport ldap -j ACCEPT") iptables("-A SERV_OUT_ADM -p tcp --dport ldap -j ACCEPT")
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 nfs.adm.crans.org -m owner ! --uid-owner 0 -j REJECT --reject-with icmp-net-prohibited") iptables("-A SERV_OUT_ADM -d nfs.adm.crans.org -m owner ! --uid-owner 0 -j REJECT --reject-with icmp-net-prohibited")
iptables("-A SERV_OUT_ADM -d nfs.adm.crans.org -j ACCEPT") iptables("-A SERV_OUT_ADM -d nfs.adm.crans.org -j ACCEPT")
# Rien d'autre ne passe # Rien d'autre ne passe
iptables("-A SERV_OUT_ADM -j REJECT --reject-with icmp-net-prohibited") iptables("-A SERV_OUT_ADM -j REJECT --reject-with icmp-net-prohibited")
self.anim.reinit() self.anim.reinit()
print OK print OK
@ -1031,11 +1031,11 @@ class firewall_zamok(firewall_crans) :
self.anim = anim('\tStructure de la table nat') self.anim = anim('\tStructure de la table nat')
iptables('-t nat -N TEST_MAC-IP') iptables('-t nat -N TEST_MAC-IP')
iptables('-t filter -N SERV_OUT_ADM') iptables('-t filter -N SERV_OUT_ADM')
iptables("-t nat -P PREROUTING ACCEPT") iptables("-t nat -P PREROUTING ACCEPT")
iptables("-t nat -A PREROUTING -i lo -j ACCEPT") iptables("-t nat -A PREROUTING -i lo -j ACCEPT")
iptables("-t nat -A PREROUTING -d 224.0.0.0/4 -j DROP") iptables("-t nat -A PREROUTING -d 224.0.0.0/4 -j DROP")
for net in NETs['fil'] + NETs['vlan-adm'] + NETs['wifi'] : for net in NETs['fil'] + NETs['vlan-adm'] + NETs['wifi'] :
iptables("-t nat -A PREROUTING -s %s -j TEST_MAC-IP" % net) iptables("-t nat -A PREROUTING -s %s -j TEST_MAC-IP" % net)
iptables("-t filter -A OUTPUT -o lo -j ACCEPT") iptables("-t filter -A OUTPUT -o lo -j ACCEPT")
@ -1075,7 +1075,7 @@ class firewall_rouge(firewall_crans) :
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)
""" """
# interfaces physiques # interfaces physiques
@ -1085,11 +1085,11 @@ class firewall_rouge(firewall_crans) :
def nat_table(self) : def nat_table(self) :
self.anim = anim('\tStructure de la table nat') self.anim = anim('\tStructure de la table nat')
iptables('-t nat -N TEST_MAC-IP') iptables('-t nat -N TEST_MAC-IP')
iptables("-t nat -P PREROUTING ACCEPT") iptables("-t nat -P PREROUTING ACCEPT")
iptables("-t nat -A PREROUTING -i lo -j ACCEPT") iptables("-t nat -A PREROUTING -i lo -j ACCEPT")
iptables("-t nat -A PREROUTING -d 224.0.0.0/4 -j DROP") iptables("-t nat -A PREROUTING -d 224.0.0.0/4 -j DROP")
for net in NETs['fil'] + NETs['vlan-adm'] + NETs['wifi'] : for net in NETs['fil'] + NETs['vlan-adm'] + NETs['wifi'] :
iptables("-t nat -A PREROUTING -s %s -j TEST_MAC-IP" % net) iptables("-t nat -A PREROUTING -s %s -j TEST_MAC-IP" % net)
@ -1117,9 +1117,9 @@ class firewall_vert(firewall_crans) :
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)
""" """
# interfaces physiques # interfaces physiques
eth_crans = "crans" eth_crans = "crans"
@ -1155,7 +1155,7 @@ class firewall_sila(firewall_rouge):
"-m mac --mac-source %s " % mac_komaz + "-m mac --mac-source %s " % mac_komaz +
"-j MARK --set-mark %s" % conf_fw.mark['proxy']) "-j MARK --set-mark %s" % conf_fw.mark['proxy'])
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'])
def nat_table(self): def nat_table(self):
firewall_rouge.nat_table(self) firewall_rouge.nat_table(self)
# Pour le proxy transparent # Pour le proxy transparent
@ -1173,7 +1173,7 @@ if __name__ == '__main__' :
def __usage(txt=None) : def __usage(txt=None) :
if txt!=None : cprint(txt,'gras') if txt!=None : cprint(txt,'gras')
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.
@ -1184,14 +1184,14 @@ Les cha
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)
# Bons arguments ? # Bons arguments ?
if len(sys.argv) == 1 : if len(sys.argv) == 1 :
__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)