diff --git a/gestion/classe_firewall.py b/gestion/classe_firewall.py index 15c908a8..687e32e6 100755 --- a/gestion/classe_firewall.py +++ b/gestion/classe_firewall.py @@ -61,7 +61,47 @@ class ErrorNoSuchIp(ErrorIp): pass class firewall: + """ + Structure du firewall : + table nat : + PREROUTING (policy par defaut : DROP) + 1) passage par TEST_VIRUS + 2) passage dans RESEAUX_NON_ROUTABLES_DST + 3) passage est paquets venant de l'extérieur dans RESEAUX_NON_ROUTABLES_SRC + 4) on laisse passer vers filter les paquets suivants : + source ou destination les serveurs de serveurs_crans + ce qui vient de l'extérieur + 7) passage par TEST_MAC-IP_FLOOD + 8) passage par TEST_FLOOD + + TEST_VIRUS droppe les paquets contenant des virus + 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 + TEST_MAC-IP_FLOOD envoi les bon paquets vers CRANS_VERS_EXT + CRANS_VERS_EXT + ACCEPT pour les paquets venant des machines du crans (test port-ip) + REJECT pour le reste + TEST_FLOOD log puis drop des paquests avec bonne mac-ip (donc les floods) + + table filter : + FORWARD (policy par defaut : ACCEPT) + 1) passage par BLACKLIST + 2) ce qui a pour source les serveurs de serveurs_crans est dirigé vers SERVEURS_VERS_EXT + 3) ce qui a pour destination les serveurs de serveurs_crans est dirigé EXT_VERS_SERVEURS + 4) tout ce qui vient de l'interface externe est dirigé vers EXT_VERS_CRANS + 5) ce qui a pour source les serveurs de serveurs_crans est dirigé vers EXT_VERS_CRANS + + BLACKLIST fitre des ip blacklistées (reject) + EXT_VERS_CRANS + ACCEPT pour les paquets vers les machines du crans (test port-ip) + REJECT pour le reste + EXT_VERS_SERVEURS et SERVEURS_VERS_EXT + ACCEPT pour bon mac-ip-port + REJECT pour le reste + """ zone_serveur="138.231.136.0/28" + eth_ext = "eth2" + def __init__(self): self.file_log=open("/var/log/fw.log","a") @@ -74,6 +114,62 @@ class firewall: raise IptablesError(cmd,status,output) self.file_log.write(time.time+": "+cmd) + def __base(self) : + """ Construction de PREROUTING et FORWARD""" + anim('\t Construction base firewall') + # table nat + for chaine in [ 'TEST_VIRUS' , 'EXT_VERS_SERVEURS', 'SERVEURS_VERS_EXT' , 'EXT_VERS_CRANS', 'TESTS_MAC-IP_FLOOD' , 'RESEAUX_NON_ROUTABLES_SRC', 'RESEAUX_NON_ROUTABLES_DST', 'TEST_FLOOD'] : + iptables('-t nat -N %s' % chaine) + + iptables("-t nat -P PREROUTING ACCEPT") + iptables("-t nat -A PREROUTING -j TEST_VIRUS") + iptables("-t nat -A PREROUTING -j RESEAUX_NON_ROUTABLES_DST") + iptables("-t nat -A PREROUTING -i %s -j RESEAUX_NON_ROUTABLES_SRC" % self.eth_ext ) + iptables("-t nat -A PREROUTING -d %s -j ACCEPT" % self.zone_serveur ) + iptables("-t nat -A PREROUTING -s %s -j ACCEPT" % self.zone_serveur ) + iptables("-t nat -A PREROUTING -i %s -j ACCPET" % self.eth_ext ) + iptables("-t nat -A PREROUTING -j TESTS_MAC-IP_FLOOD") + + # table filter + for chaine in [ 'BLACKLIST_OUTPUT', 'BLACKLIST_INPUT' ] : + iptables('-N %s' % chaine) + + for reseau in config.NETs['all'] : + iptables("-A FORWARD -s %s -j BLACKLIST_DST" % reseau ) + iptables("-A FORWARD -d %s -j BLACKLIST_SRC" % reseau ) + iptables("-A FORWARD -d %s -j EXT_VERS_SERVEURS" % self.zone_serveur ) + iptables("-A FORWARD -s %s -j SERVEURS_VERS_EXT" % self.zone_serveur ) + iptables("-A FORWARD -i %s -j EXT_VERS_CRANS" % self.eth_ext ) + + def log_chaines(self) : + """ Construction des chaines de log (LOG_VIRUS et LOG_FLOOD) """ + for filtre in [ 'VIRUS', 'FLOOD' ] : + # Vidage de la chaîne + iptables('-F LOG_%s' % filtre) + iptables('-t nat -A LOG_%s %s %s:' % (filtre, self.log_template, filtre.capitalize()) ) + iptables('-t nat -A LOG_%s -j DROP' % filtre ) + + def reseaux_non_routables(self) : + """ Construction de RESEAUX_NON_ROUTABLES_{DST,SRC} """ + self.anim = anim('\t Filtrage ip non routables',len(self.reseaux_non_routables)) + for reseau in self.reseaux_non_routables : + iptables("-t nat -A RESEAUX_NON_ROUTABLES_DST -d %s -j DROP" % reseau) + iptables("-t nat -A RESEAUX_NON_ROUTABLES_SRC -s %s -j DROP" % reseau) + self.anim.cycle() + self.anim.reinit() + print OK + + def test_virus(self) : + """ Construction de la chaîne TEST_VIRUS """ + iptables('-t nat -F TEST_VIRUS') + self.anim = anim('\t Filtrage virus',len(self.ports_virus)) + for port in self.ports_virus : + iptables('-t nat -A TEST_VIRUS -p tcp --dport %s -j LOG_VIRUS' % port) + self.anim.cycle() + self.anim.reinit() + print OK + + def start(self): """ Construit le firewall @@ -96,21 +192,6 @@ class firewall: iptables("iptables -t nat -F") iptables("iptables -X") - def create_defaults(self): - """ - Crée la chaîne par laquelle tous les adhérents passent par défault - Pas d'argument - """ - for proto in ["tcp","udp"]: - for i in range(len(config.port_default["%s_input" % proto])): - iptables("iptables -A DEFAULT_INPUT -p %s --dport "%proto+\ - config.port_default["%s_input" % proto][i]+\ - " -j ACCEPT") - for i in range(len(config.port_default["%s_output" % proto])): - iptables("iptables -A DEFAULT_OUTPUT -p %s --sport "%proto+\ - config.port_default["%s_output" % proto][i]+\ - " -j ACCEPT") - def add_machines(self,machine): __serveurs_vers_ext__(machine) __ext_vers_serveurs__(machine) @@ -142,6 +223,7 @@ class firewall: %(ip,i)) def __crans_vers_ext__(self,machine): + ip=machine.ip() def __ext_vers_crans__(self,machine): @@ -245,27 +327,6 @@ class firewall: iptables("iptables -t nat -A PREROUTING -i %s -p udp"%int_crans+\ " -j DROP") - def komaz(self): - """ - Crée les règles spécifiques à la machine komaz - """ - ports=komaz_ports['portTCPin'] - for i in ports.split(' '): - iptables("iptables -A INPUT -d 138.231.136.4 -p tcp --dport %s"%i+\ - " -j ACCEPT") - ports=komaz_ports['portTCPout'] - for i in ports.split(' '): - iptables("iptables -A OUTPUT -s 138.231.136.4 -p tcp --dport %s"%i+\ - " -j ACCEPT") - ports=komaz_ports['portUDPin'] - for i in ports.split(' '): - iptables("iptables -A INPUT -d 138.231.136.4 -p udp --dport %s"%i+\ - " -j ACCEPT") - ports=komaz_ports['portUDPout'] - for i in ports.split(' '): - iptables("iptables -A OUTPUT -s 138.231.136.4 -p udp --dport %s"%i+\ - " -j ACCEPT") - def blacklist(self): """ @@ -302,16 +363,6 @@ class firewall: iptables("iptables -A BLACKLIST_INPUT -j DEFAULT_INPUT") iptables("iptables -A BLACKLIST_OUTPUT -j DEFAULT_OUTPUT") - def create_forward(self): - """ - Différencie ce qui arrive et ce qui part dans la chaîne FORWARD - """ - iptables("iptables -N BLACKLIST_INPUT") - iptables("iptables -N BLACKLIST_OUTPUT") - iptables("iptables -A FORWARD -s 138.231.136.0/21 -j BLACKLIST_OUTPUT") - iptables("iptables -A FORWARD -s 138.231.136.0/22 -j BLACKLIST_OUTPUT") - iptables("iptables -A FORWARD -d 138.231.148.0/21 -j BLACKLIST_INPUT") - iptables("iptables -A FORWARD -d 138.231.148.0/22 -j BLACKLIST_INPUT") def create_adherents(self): """