[global/rid] J'ai essayé de mettre en place une bijection realm <-> NETs <-> rid

* Les rid sont maintenant des listes de tuples.
 * Il faut utiliser crans_utils.find_rid_plage, et crans_utils.find_ipv4_plage
 qui renvoient le realm d'un rid/d'une ipv4, et la plage associée (un tuple ou
 un slash ipv4).
 * Pour les anciens scripts, j'ai mis find_rid_plage dans ridtools, il faut l'utiliser
 également à la place des boucles for tp, (begin, end) in config.rid.iteritems()...
 * J'ai essayé de faire attention à tout ce que ça aurait pu casser, mais ce n'est
 pas garanti
This commit is contained in:
Pierre-Elliott Bécue 2013-05-30 01:11:36 +02:00
parent e2a4cfe72a
commit a442fd6b22
7 changed files with 108 additions and 71 deletions

View file

@ -142,54 +142,80 @@ demenagement_delai = 8
# faire en sorte qu'ils prennent effet immédiatement ; c'est important pour # faire en sorte qu'ils prennent effet immédiatement ; c'est important pour
# komaz car c'est la route par défaut mais aussi pour zamok et sable # komaz car c'est la route par défaut mais aussi pour zamok et sable
# à cause de leur firewall et de leur patte wifi. # à cause de leur firewall et de leur patte wifi.
_filaire_adh = [ '138.231.137.0/24', '138.231.138.0/24', '138.231.139.0/24','138.231.140.0/22' ]
NETs = { 'serveurs' : [ '138.231.136.0/24' ], # NETs_primaires contient une bijection entre des types de machines
'adherents' : _filaire_adh, # et les plages d'ip qui vont bien. NETs_secondaires contient des
'bornes' : [ '138.231.148.0/24' ], # clefs qui cassent la bijectivité, mais qui peuvent servir.
'adm' : [ '10.231.136.0/24' ], # NETs est l'union des deux
'wifi-adh' : [ '138.231.144.0/24', '138.231.145.0/24', '138.231.146.0/24', NETs_primaires = {
'138.231.147.0/24', '138.231.149.0/24', '138.231.150.0/24', '138.231.151.0/24' ], 'serveurs' : ['138.231.136.0/24'],
'fil' : [ '138.231.136.0/21' ], 'adherents' : ['138.231.137.0/24', '138.231.138.0/23', '138.231.140.0/22'],
'gratuit': [ '10.42.0.0/16' ], 'wifi-adh' : ['138.231.144.0/22', '138.231.149.0/24', '138.231.150.0/23'],
'wifi': [ '138.231.144.0/21' ], 'bornes' : ['138.231.148.0/24'],
'accueil': ['10.51.0.0/16' ], 'adm' : ['10.231.136.0/24'],
'isolement': ['10.52.0.0/16' ], 'personnel-ens' : ['10.2.9.0/24'],
'personnel-ens': ['10.2.9.0/24' ], 'gratuit' : ['10.42.0.0/16'],
'evenementiel': ['10.231.137.0/24'], 'accueil' : ['10.51.0.0/16'],
'ens' : ['138.231.135.0/24'], 'isolement' : ['10.52.0.0/16'],
'all' : [ '138.231.136.0/21', '138.231.144.0/21' ], 'evenementiel' : ['10.231.137.0/24'],
'multicast' : ['239.0.0.0/8'], 'multicast' : ['239.0.0.0/8'],
'ens' : ['138.231.135.0/24'],
} }
NETs_secondaires = {
'all' : ['138.231.136.0/21', '138.231.144.0/21'],
'wifi': ['138.231.144.0/21'],
'fil' : ['138.231.136.0/21'],
}
NETs = {}
NETs.update(NETs_primaires)
NETs.update(NETs_secondaires)
NETs_regexp = { 'all' : '^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$' } NETs_regexp = { 'all' : '^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$' }
# Classes de rid # Classes de rid
# Merci d'essayer de les faire correspondre avec les réseaux # Merci d'essayer de les faire correspondre avec les réseaux
# ci-dessus... # ci-dessus...
rid = { # De même que pout NETs, primaires c'est pour la bijectivité, et secondaires
# Rid pour les machines fixes # pour les trucs pratiques
'adherents' : (256, 2047), rid_primaires = {
# Rid pour les machines filaire ipv4
'fil' : (0, 2047),
# Rid pour les machines wifi
'wifi' : (2048, 4095),
# Rid pour les machines du vlan adm
'adm' : (51200, 53247),
# Rid pour les machines des personnels ens
'personnel-ens' : (55296, 55551),
# Mid pour les machines du vlan gratuit
'gratuit' : (53248, 55295),
# Rid pour machines spéciales
'special' : (4096, 6143),
# Rid pour les filaires v6-only
'fil-v6' : (16384, 24575),
# Rid pour les wifi v6-only
'wifi-v6' : (24576, 32767),
# Rid pour les serveurs # Rid pour les serveurs
'serveurs' : (0, 255), 'serveurs' : [(0, 255),],
# Rid pour les machines fixes
'adherents' : [(256, 2047),],
# Rid pour les machines wifi
'wifi-adh' : [(2048, 3071), (3328, 4095),],
# Rid pour les bornes
'bornes' : [(3072, 3327),],
# Rid pour machines spéciales
'special' : [(4096, 6143),],
# Rid pour les serveurs v6-only
'serveurs-v6' : [(8192, 10240),],
# Rid pour les filaires v6-only
'fil-v6' : [(16384, 24575),],
# Rid pour les wifi v6-only
'wifi-v6' : [(24576, 32767),],
# Rid pour les machines du vlan adm
'adm-v6' : [(50176, 51199),],
# Rid pour les machines du vlan adm
'adm' : [(51200, 53247),],
# Mid pour les machines du vlan gratuit
'gratuit' : [(53248, 55295),],
# Rid pour les machines des personnels ens
'personnel-ens' : [(55296, 55551),],
} }
rid_secondaires = {
# Rid pour les machines filaire ipv4
'fil' : [(0, 2047),],
'wifi' : [(2048, 4095),],
}
rid = {}
rid.update(rid_primaires)
rid.update(rid_secondaires)
# rid pour les machines spéciales (classe 'special' ci-dessus) # rid pour les machines spéciales (classe 'special' ci-dessus)
rid_machines_speciales = { rid_machines_speciales = {
# freebox.crans.org # freebox.crans.org
@ -211,12 +237,15 @@ prefix = { 'subnet' : [ '2a01:240:fe3d::/48' ],
'adherents' : [ '2a01:240:fe3d:4::/64' ], 'adherents' : [ '2a01:240:fe3d:4::/64' ],
'fil' : [ '2a01:240:fe3d:4::/64' ], 'fil' : [ '2a01:240:fe3d:4::/64' ],
'adm' : [ '2a01:240:fe3d:c804::/64' ], 'adm' : [ '2a01:240:fe3d:c804::/64' ],
'adm-v6' : [ '2a01:240:fe3d:c804::/64' ],
'wifi' : [ '2a01:240:fe3d:c04::/64' ], 'wifi' : [ '2a01:240:fe3d:c04::/64' ],
'fil-v6' : [ '2a01:240:fe3d:4::/64' ], 'fil-v6' : [ '2a01:240:fe3d:4::/64' ],
'wifi-v6' : [ '2a01:240:fe3d:c04::/64' ], 'wifi-v6' : [ '2a01:240:fe3d:c04::/64' ],
'personnel-ens' : [ '2a01:240:fe3d:4::/64' ], 'personnel-ens' : [ '2a01:240:fe3d:4::/64' ],
'sixxs2' : [ '2a01:240:fe00:68::/64' ], 'sixxs2' : [ '2a01:240:fe00:68::/64' ],
'evenementiel' : [ '2a01:240:fe3d:d2::/64' ], 'evenementiel' : [ '2a01:240:fe3d:d2::/64' ],
'bornes' : [ '2a01:240:fe3d:c04::/64' ],
'wifi-adh' : [ '2a01:240:fe3d:c04::/64' ],
} }
# Domaines dans lesquels les machines sont placées suivant leur type # Domaines dans lesquels les machines sont placées suivant leur type

View file

@ -62,10 +62,10 @@ def ports(dev_ip6, dev_list):
''' Ouvre les ports ''' ''' Ouvre les ports '''
for machine in machines : for machine in machines :
for type_machine in ['fil', 'fil-v6', 'wifi', 'wifi-v6', 'serveurs']: for type_machine in ['fil', 'fil-v6', 'wifi', 'wifi-v6', 'serveurs']:
if int(machine.rid()) in range(rid[type_machine][0], for plage in rid[type_machine]:
rid[type_machine][1]): if int(machine.rid()) in range(plage[0], plage[1]):
for dev in dev_list: for dev in dev_list:
ports_io(ip6tables, machine, type_machine, dev_ip6, dev) ports_io(ip6tables, machine, type_machine, dev_ip6, dev)
#Protection contre les attaques brute-force #Protection contre les attaques brute-force
# XXX FIXIT !!! # XXX FIXIT !!!

View file

@ -290,6 +290,9 @@ class sable(base_reconfigure):
class routeur(base_reconfigure): class routeur(base_reconfigure):
pass pass
class eap(base_reconfigure):
pass
class gordon(base_reconfigure) : class gordon(base_reconfigure) :
pass pass

View file

@ -24,10 +24,10 @@ import os, re, syslog, cPickle, socket
from ldap_crans import crans_ldap, hostname from ldap_crans import crans_ldap, hostname
from commands import getstatusoutput from commands import getstatusoutput
from config import NETs, role, prefix, rid, output_file, filter_policy from config import NETs, role, prefix, rid, output_file, filter_policy, rid_primaires
from config import blacklist_sanctions, blacklist_sanctions_soft, blacklist_bridage_upload, file_pickle, ann_scol, periode_transitoire from config import blacklist_sanctions, blacklist_sanctions_soft, blacklist_bridage_upload, file_pickle, ann_scol, periode_transitoire
from iptools import AddrInNet from iptools import AddrInNet
from ridtools import Rid from ridtools import Rid, find_rid_plage
import subprocess import subprocess
import netaddr import netaddr
@ -57,7 +57,8 @@ Filter_policy_template = """
""" """
dprefix = { 'adherents': 'adherents', 'fil' : 'fil', 'fil-v6' : 'fil', 'adm' : 'adm', 'wifi' : 'wifi', dprefix = { 'adherents': 'adherents', 'fil' : 'fil', 'fil-v6' : 'fil', 'adm' : 'adm', 'wifi' : 'wifi',
'wifi-v6' : 'wifi','personnel-ens':'personnel-ens', 'serveurs':'serveurs' } 'wifi-v6' : 'wifi','personnel-ens':'personnel-ens', 'serveurs':'serveurs', 'wifi-adh':'wifi',
'bornes' : 'wifi', 'adm-v6':'adm', 'serveurs-v6':'serveurs'}
default_chains = [ 'PREROUTING', 'INPUT', 'FORWARD', 'OUTPUT', 'POSTROUTING' ] default_chains = [ 'PREROUTING', 'INPUT', 'FORWARD', 'OUTPUT', 'POSTROUTING' ]
@ -163,11 +164,12 @@ ACCEPT' % (dev, proto, ip, port))
vers et à partir de la machine considérée ''' vers et à partir de la machine considérée '''
ident = int(machine.id()) ident = int(machine.id())
ip = "" ip = ""
for type_m in rid.keys(): for type_m, plages in rid_primaires.iteritems():
if ident in range(rid[type_m][0], rid[type_m][1]): for plage in plages:
ip = ipv6_addr(machine.mac(), type_m) if ident in range(plage[0], plage[1]):
mac=machine.mac() ip = ipv6_addr(machine.mac(), type_m)
break mac=machine.mac()
break
if ip: if ip:
self.filter.blacklist_src('-m mac --mac-source %s -j REJECT --reject-with icmp6-port-unreachable' % mac) self.filter.blacklist_src('-m mac --mac-source %s -j REJECT --reject-with icmp6-port-unreachable' % mac)
@ -194,10 +196,8 @@ class Update(object):
dev_ext = iface6('sixxs2') dev_ext = iface6('sixxs2')
net = "" net = ""
for r in rids: for r in rids:
for type_m in rid.keys(): net, _ = find_rid_plage(r)
if int(r) in range(rid[type_m][0], rid[type_m][1]): if net == "Inconnu":
net = type_m
if net == "":
raise RidError("Il n'y a pas de réseau associé au rid %i" % m) raise RidError("Il n'y a pas de réseau associé au rid %i" % m)
if '-v6' in net and ip_proto == 4: if '-v6' in net and ip_proto == 4:
raise MismatchRidIpProto(r, ip_proto, net) raise MismatchRidIpProto(r, ip_proto, net)
@ -810,9 +810,10 @@ def macips(ipt, machines, types_machines):
for machine in machines: for machine in machines:
for type_m in types_machines: for type_m in types_machines:
if int(machine.rid()) in range(rid[type_m][0], rid[type_m][1]): for plage in rid[type_m]:
ipt.macip(machine.mac(), type_m) if int(machine.rid()) in range(plage[0], plage[1]):
break ipt.macip(machine.mac(), type_m)
break
for type_m in types_machines: for type_m in types_machines:
if not type_m in tab.keys(): if not type_m in tab.keys():

View file

@ -3340,12 +3340,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
def netv6(self): def netv6(self):
"""Retourne le réseau IPv6 Cr@ns associé à la machine""" """Retourne le réseau IPv6 Cr@ns associé à la machine"""
for ty, (start, end) in config.rid.iteritems(): nettype, _ = ridtools.find_rid_plage(int(self.rid()))
if start <= int(self.rid()) <= end:
nettype = ty
break
else:
raise ValueError('Impossible d\'identifier le type de machine.')
if nettype != 'special': if nettype != 'special':
return netaddr.IPNetwork(config.prefix[nettype][0]) return netaddr.IPNetwork(config.prefix[nettype][0])

View file

@ -58,11 +58,8 @@ class Rid(object):
"""Peuple les champs de l'instance par rapport au rid""" """Peuple les champs de l'instance par rapport au rid"""
self.rid = rid self.rid = rid
for tp, (start, end) in config.rid.iteritems(): self.type = find_rid_plage(int(rid))
if start <= rid <= end: if self.type == 'Inconnu':
self.type = tp
break
else:
raise ValueError("rid inconnu : %d" % rid) raise ValueError("rid inconnu : %d" % rid)
self.ipv4_dispo = (rid & (1 << 15)) == 0 and self.type != 'special' or self.rid in config.rid_machines_speciales self.ipv4_dispo = (rid & (1 << 15)) == 0 and self.type != 'special' or self.rid in config.rid_machines_speciales
@ -149,3 +146,17 @@ class Rid(object):
def __int__(self): def __int__(self):
return self.rid return self.rid
def find_rid_plage(rid):
"""Trouve la plage du rid fourni"""
for (tp, plages) in config.rid_primaires.iteritems():
if isinstance(plages, list):
for begin, end in plages:
if begin <= rid <= end:
return tp, (begin, end)
else:
(begin, end) = plages
if begin <= rid <= end:
return tp, (begin, end)
else:
return "Inconnu", (0, 0)

View file

@ -62,6 +62,7 @@ from affich_tools import *
from config import rid from config import rid
import user_tests import user_tests
import subprocess, commands import subprocess, commands
import ridtools
limit_aff_details = 1 limit_aff_details = 1
limit_aff_machines = 15 limit_aff_machines = 15
@ -351,7 +352,7 @@ def list_machines(machines) :
return tableau(data, return tableau(data,
titre = [u'mid', u'rid', u'Type', u'Nom de machine', u'Adresse IP', u'Adresse MAC', u'Limitation'], titre = [u'mid', u'rid', u'Type', u'Nom de machine', u'Adresse IP', u'Adresse MAC', u'Limitation'],
largeur = [5, 5, 4, '*', larg, 17, 10], largeur = [5, 5, 9, '*', larg, 17, 10],
alignement = ['d', 'd', 'c', 'c', 'c', 'c', 'c']) alignement = ['d', 'd', 'c', 'c', 'c', 'c', 'c'])
def list_spec(machines) : def list_spec(machines) :
@ -925,10 +926,7 @@ def __bases_machines(m) :
""" Retourne [ type de la machines, blacklist ] """ """ Retourne [ type de la machines, blacklist ] """
#Type #Type
t = 'inconnu' t = 'inconnu'
for tp, (start, end) in rid.iteritems(): t, _ = ridtools.find_rid_plage(int(m.rid()))
if start <= int(m.rid()) <= end:
t = tp
break
if isinstance(m, BorneWifi): if isinstance(m, BorneWifi):
t = "borne" t = "borne"