From d8e716f22ba0989d8d5e1ccfad9fdb47ab0a3ead Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Mon, 25 Feb 2013 01:47:14 +0100 Subject: [PATCH] =?UTF-8?q?[config.py,=20firewall6.py,=20ipt.py]=20On=20pa?= =?UTF-8?q?sse=20la=20policy=20de=20FORWARD=20en=20ipv6=20=C3=A0=20accept,?= =?UTF-8?q?=20pour=20mise=20=C3=A0=20jour=20des=20blacklistes,=20on=20ne?= =?UTF-8?q?=20r=C3=A9appliques=20que=20les=20chaines=20concern=C3=A9es.=20?= =?UTF-8?q?Possibilit=C3=A9=20de=20recharger=20les=20blacklistes=20en=20li?= =?UTF-8?q?gne=20de=20commande.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gestion/config.py | 2 +- gestion/gen_confs/firewall6.py | 11 ++++++- gestion/ipt.py | 55 +++++++++++++++++++++++++++++----- 3 files changed, 59 insertions(+), 9 deletions(-) diff --git a/gestion/config.py b/gestion/config.py index 73f230e5..501615c3 100644 --- a/gestion/config.py +++ b/gestion/config.py @@ -656,7 +656,7 @@ vlans = { } filter_policy = { 'komaz' : { 'policy_input' : 'ACCEPT', - 'policy_forward' : 'DROP', + 'policy_forward' : 'ACCEPT', 'policy_output' : 'ACCEPT' }, 'zamok' : { 'policy_input' : 'ACCEPT', diff --git a/gestion/gen_confs/firewall6.py b/gestion/gen_confs/firewall6.py index 4eca2ece..9accffe7 100755 --- a/gestion/gen_confs/firewall6.py +++ b/gestion/gen_confs/firewall6.py @@ -304,7 +304,7 @@ def stop(): # On les applique apply_rules(6) - disable_forwarding(6) + #disable_forwarding(6) return 0 @@ -318,6 +318,13 @@ def restart(): return 0 + +def blacklist_main(): + fw6 = Update() + fw6.blacklist(6) + + return 0 + if __name__ == '__main__': if len(sys.argv) != 2: aide() @@ -325,6 +332,8 @@ if __name__ == '__main__': if sys.argv[1] in [ 'start', 'stop', 'restart' ]: eval(sys.argv[1])() + elif sys.argv[1] == 'blacklist': + blacklist_main() else: aide() sys.exit(-1) diff --git a/gestion/ipt.py b/gestion/ipt.py index 4a5a9260..a7f16b3f 100644 --- a/gestion/ipt.py +++ b/gestion/ipt.py @@ -240,11 +240,33 @@ REJECT --reject-with icmp6-port-unreachable') ''' Permet de regénérer les diverses blacklistes ''' #TODO vérifier que la fonctionn est _vraiement_ ipv4 aware check_ip_proto(ip_proto) + + # On supprime les anciennes règles si elles existent. + try: + os.remove(output_file[ip_proto]) + except: + pass + + # On initialise un pare-feu vide + ip6tables = Ip6tables() + blacklist(ip6tables) + + # On écrit les données dans un fichier + write_rules(ip6tables) + + #On vide les chaines des BLACKLIST_* + flush_chain(ip_proto, ['BLACKLIST_DST', 'BLACKLIST_SRC']) + # On les applique en concervant les chaines existantes + apply_rules(ip_proto, no_flush=True) + + + #### BACKWARD compatibilité ipt_p = open_pickle(ip_proto) blacklist(ipt_p) - # On écrit et applique les règles - write_rules(ipt_p) - apply_rules(ip_proto) + # On écrit et applique les règles <-- plus la peine de restorer tout, on ne traite que les chaines BLACKLIST_* ci dessus. + # On pickel toujours pour la compatibilité avec les autres fonctions de la classe Update + #write_rules(ipt_p) + #apply_rules(ip_proto) os.remove(file_pickle[ip_proto]) @@ -582,7 +604,24 @@ def ip_attribut(attribute, cl, ip_proto = 4): else: print "Error" + " host=%s.crans.org" % name -def apply_rules(ip_proto = 4): +def flush_chain(ip_proto = 4, chain_list = []): + check_ip_proto(ip_proto) + f = open(output_file[ip_proto], 'r') + if ip_proto == 4: + cmd = '/sbin/iptables' + elif ip_proto == 6: + cmd = '/sbin/ip6tables' + + for chain in chain_list: + run = [cmd, '-F', chain] + try: + p1 = subprocess.Popen(run, stdin=f, stdout=subprocess.PIPE) + except OSError: + syslog.syslog(syslog.LOG_ERR,"La chaine %s n'existe pas" % chain) + print "La chaine %s n'existe pas" % chain + stdout, stderr = p1.communicate() + +def apply_rules(ip_proto = 4, no_flush=False): ''' Applique les règles fournies dans le fichier passé en arguement ''' check_ip_proto(ip_proto) f = open(output_file[ip_proto], 'r') @@ -590,6 +629,8 @@ def apply_rules(ip_proto = 4): cmd = '/sbin/iptables-restore' elif ip_proto == 6: cmd = '/sbin/ip6tables-restore' + if no_flush: + cmd = [cmd, '--noflush'] try: p1 = subprocess.Popen(cmd, stdin=f, stdout=subprocess.PIPE) except OSError: @@ -668,7 +709,7 @@ def write_rules(ipt): for ichain in filter(not_private, dir(ipt.__getattribute__(itables))): if ichain.upper() not in default_chains: - if hasattr(ipt.__getattribute__(itables).__getattribute__(ichain),'items'): + if hasattr(ipt.__getattribute__(itables).__getattribute__(ichain),'items') and ipt.__getattribute__(itables).__getattribute__(ichain).items: output[itables] += ":%s - [0:0]\n" % ichain.upper() # On ajoute maintenant les règles @@ -746,10 +787,10 @@ def mac_ip(ipt, machines, types_machines): '''Réalise une correspondance MAC-IP pour un réseau considéré On vérifie d'abord que la MAC est connue et ensuite on n'accepte que les adresses en eui64''' - + tab = {'serveurs' : 'fil' } macips(ipt, machines, types_machines) for type_m in types_machines: - if not '-v6' in type_m: + if not '-v6' in type_m and not type_m in tab.keys(): dev = iface6(type_m) ipt.filter.input('-i %s -s %s -j %s' % (dev, prefix[type_m][0], 'MAC' + type_m.upper()))