[config.py, firewall6.py, ipt.py] On passe la policy de FORWARD en ipv6 à accept, pour mise à jour des blacklistes, on ne réappliques que les chaines concernées. Possibilité de recharger les blacklistes en ligne de commande.

This commit is contained in:
Valentin Samir 2013-02-25 01:47:14 +01:00
parent 559583654b
commit d8e716f22b
3 changed files with 59 additions and 9 deletions

View file

@ -656,7 +656,7 @@ vlans = {
} }
filter_policy = { 'komaz' : { 'policy_input' : 'ACCEPT', filter_policy = { 'komaz' : { 'policy_input' : 'ACCEPT',
'policy_forward' : 'DROP', 'policy_forward' : 'ACCEPT',
'policy_output' : 'ACCEPT' 'policy_output' : 'ACCEPT'
}, },
'zamok' : { 'policy_input' : 'ACCEPT', 'zamok' : { 'policy_input' : 'ACCEPT',

View file

@ -304,7 +304,7 @@ def stop():
# On les applique # On les applique
apply_rules(6) apply_rules(6)
disable_forwarding(6) #disable_forwarding(6)
return 0 return 0
@ -318,6 +318,13 @@ def restart():
return 0 return 0
def blacklist_main():
fw6 = Update()
fw6.blacklist(6)
return 0
if __name__ == '__main__': if __name__ == '__main__':
if len(sys.argv) != 2: if len(sys.argv) != 2:
aide() aide()
@ -325,6 +332,8 @@ if __name__ == '__main__':
if sys.argv[1] in [ 'start', 'stop', 'restart' ]: if sys.argv[1] in [ 'start', 'stop', 'restart' ]:
eval(sys.argv[1])() eval(sys.argv[1])()
elif sys.argv[1] == 'blacklist':
blacklist_main()
else: else:
aide() aide()
sys.exit(-1) sys.exit(-1)

View file

@ -240,11 +240,33 @@ REJECT --reject-with icmp6-port-unreachable')
''' Permet de regénérer les diverses blacklistes ''' ''' Permet de regénérer les diverses blacklistes '''
#TODO vérifier que la fonctionn est _vraiement_ ipv4 aware #TODO vérifier que la fonctionn est _vraiement_ ipv4 aware
check_ip_proto(ip_proto) 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) ipt_p = open_pickle(ip_proto)
blacklist(ipt_p) blacklist(ipt_p)
# On écrit et applique les règles # On écrit et applique les règles <-- plus la peine de restorer tout, on ne traite que les chaines BLACKLIST_* ci dessus.
write_rules(ipt_p) # On pickel toujours pour la compatibilité avec les autres fonctions de la classe Update
apply_rules(ip_proto) #write_rules(ipt_p)
#apply_rules(ip_proto)
os.remove(file_pickle[ip_proto]) os.remove(file_pickle[ip_proto])
@ -582,7 +604,24 @@ def ip_attribut(attribute, cl, ip_proto = 4):
else: else:
print "Error" + " host=%s.crans.org" % name 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 ''' ''' Applique les règles fournies dans le fichier passé en arguement '''
check_ip_proto(ip_proto) check_ip_proto(ip_proto)
f = open(output_file[ip_proto], 'r') f = open(output_file[ip_proto], 'r')
@ -590,6 +629,8 @@ def apply_rules(ip_proto = 4):
cmd = '/sbin/iptables-restore' cmd = '/sbin/iptables-restore'
elif ip_proto == 6: elif ip_proto == 6:
cmd = '/sbin/ip6tables-restore' cmd = '/sbin/ip6tables-restore'
if no_flush:
cmd = [cmd, '--noflush']
try: try:
p1 = subprocess.Popen(cmd, stdin=f, stdout=subprocess.PIPE) p1 = subprocess.Popen(cmd, stdin=f, stdout=subprocess.PIPE)
except OSError: except OSError:
@ -668,7 +709,7 @@ def write_rules(ipt):
for ichain in filter(not_private, for ichain in filter(not_private,
dir(ipt.__getattribute__(itables))): dir(ipt.__getattribute__(itables))):
if ichain.upper() not in default_chains: 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() output[itables] += ":%s - [0:0]\n" % ichain.upper()
# On ajoute maintenant les règles # 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é '''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 On vérifie d'abord que la MAC est connue et ensuite on n'accepte que les
adresses en eui64''' adresses en eui64'''
tab = {'serveurs' : 'fil' }
macips(ipt, machines, types_machines) macips(ipt, machines, types_machines)
for type_m in 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) dev = iface6(type_m)
ipt.filter.input('-i %s -s %s -j %s' % (dev, prefix[type_m][0], ipt.filter.input('-i %s -s %s -j %s' % (dev, prefix[type_m][0],
'MAC' + type_m.upper())) 'MAC' + type_m.upper()))