diff --git a/gestion/config/config.py b/gestion/config/config.py index c5fcabaf..d657a376 100644 --- a/gestion/config/config.py +++ b/gestion/config/config.py @@ -142,54 +142,80 @@ demenagement_delai = 8 # 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 # à 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' ], - 'adherents' : _filaire_adh, - 'bornes' : [ '138.231.148.0/24' ], - 'adm' : [ '10.231.136.0/24' ], - 'wifi-adh' : [ '138.231.144.0/24', '138.231.145.0/24', '138.231.146.0/24', - '138.231.147.0/24', '138.231.149.0/24', '138.231.150.0/24', '138.231.151.0/24' ], - 'fil' : [ '138.231.136.0/21' ], - 'gratuit': [ '10.42.0.0/16' ], - 'wifi': [ '138.231.144.0/21' ], - 'accueil': ['10.51.0.0/16' ], - 'isolement': ['10.52.0.0/16' ], - 'personnel-ens': ['10.2.9.0/24' ], - 'evenementiel': ['10.231.137.0/24'], - 'ens' : ['138.231.135.0/24'], - 'all' : [ '138.231.136.0/21', '138.231.144.0/21' ], +# NETs_primaires contient une bijection entre des types de machines +# et les plages d'ip qui vont bien. NETs_secondaires contient des +# clefs qui cassent la bijectivité, mais qui peuvent servir. +# NETs est l'union des deux +NETs_primaires = { + 'serveurs' : ['138.231.136.0/24'], + 'adherents' : ['138.231.137.0/24', '138.231.138.0/23', '138.231.140.0/22'], + 'wifi-adh' : ['138.231.144.0/22', '138.231.149.0/24', '138.231.150.0/23'], + 'bornes' : ['138.231.148.0/24'], + 'adm' : ['10.231.136.0/24'], + 'personnel-ens' : ['10.2.9.0/24'], + 'gratuit' : ['10.42.0.0/16'], + 'accueil' : ['10.51.0.0/16'], + 'isolement' : ['10.52.0.0/16'], + 'evenementiel' : ['10.231.137.0/24'], '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+$' } # Classes de rid # Merci d'essayer de les faire correspondre avec les réseaux # ci-dessus... -rid = { - # Rid pour les machines fixes - 'adherents' : (256, 2047), - # 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), +# De même que pout NETs, primaires c'est pour la bijectivité, et secondaires +# pour les trucs pratiques +rid_primaires = { # 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_machines_speciales = { # freebox.crans.org @@ -211,12 +237,15 @@ prefix = { 'subnet' : [ '2a01:240:fe3d::/48' ], 'adherents' : [ '2a01:240:fe3d:4::/64' ], 'fil' : [ '2a01:240:fe3d:4::/64' ], 'adm' : [ '2a01:240:fe3d:c804::/64' ], + 'adm-v6' : [ '2a01:240:fe3d:c804::/64' ], 'wifi' : [ '2a01:240:fe3d:c04::/64' ], 'fil-v6' : [ '2a01:240:fe3d:4::/64' ], 'wifi-v6' : [ '2a01:240:fe3d:c04::/64' ], 'personnel-ens' : [ '2a01:240:fe3d:4::/64' ], 'sixxs2' : [ '2a01:240:fe00:68::/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 diff --git a/gestion/gen_confs/firewall6.py b/gestion/gen_confs/firewall6.py index 72209762..8f5e5e23 100755 --- a/gestion/gen_confs/firewall6.py +++ b/gestion/gen_confs/firewall6.py @@ -62,10 +62,10 @@ def ports(dev_ip6, dev_list): ''' Ouvre les ports ''' for machine in machines : for type_machine in ['fil', 'fil-v6', 'wifi', 'wifi-v6', 'serveurs']: - if int(machine.rid()) in range(rid[type_machine][0], - rid[type_machine][1]): - for dev in dev_list: - ports_io(ip6tables, machine, type_machine, dev_ip6, dev) + for plage in rid[type_machine]: + if int(machine.rid()) in range(plage[0], plage[1]): + for dev in dev_list: + ports_io(ip6tables, machine, type_machine, dev_ip6, dev) #Protection contre les attaques brute-force # XXX FIXIT !!! diff --git a/gestion/gen_confs/generate.py b/gestion/gen_confs/generate.py index 38cd857f..9daad0dd 100755 --- a/gestion/gen_confs/generate.py +++ b/gestion/gen_confs/generate.py @@ -290,6 +290,9 @@ class sable(base_reconfigure): class routeur(base_reconfigure): pass +class eap(base_reconfigure): + pass + class gordon(base_reconfigure) : pass diff --git a/gestion/ipt.py b/gestion/ipt.py index ae2f19f3..709c7569 100644 --- a/gestion/ipt.py +++ b/gestion/ipt.py @@ -24,10 +24,10 @@ import os, re, syslog, cPickle, socket from ldap_crans import crans_ldap, hostname 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 iptools import AddrInNet -from ridtools import Rid +from ridtools import Rid, find_rid_plage import subprocess import netaddr @@ -57,7 +57,8 @@ Filter_policy_template = """ """ 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' ] @@ -163,11 +164,12 @@ ACCEPT' % (dev, proto, ip, port)) vers et à partir de la machine considérée ''' ident = int(machine.id()) ip = "" - for type_m in rid.keys(): - if ident in range(rid[type_m][0], rid[type_m][1]): - ip = ipv6_addr(machine.mac(), type_m) - mac=machine.mac() - break + for type_m, plages in rid_primaires.iteritems(): + for plage in plages: + if ident in range(plage[0], plage[1]): + ip = ipv6_addr(machine.mac(), type_m) + mac=machine.mac() + break if ip: 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') net = "" for r in rids: - for type_m in rid.keys(): - if int(r) in range(rid[type_m][0], rid[type_m][1]): - net = type_m - if net == "": + net, _ = find_rid_plage(r) + if net == "Inconnu": raise RidError("Il n'y a pas de réseau associé au rid %i" % m) if '-v6' in net and ip_proto == 4: raise MismatchRidIpProto(r, ip_proto, net) @@ -810,9 +810,10 @@ def macips(ipt, machines, types_machines): for machine in machines: for type_m in types_machines: - if int(machine.rid()) in range(rid[type_m][0], rid[type_m][1]): - ipt.macip(machine.mac(), type_m) - break + for plage in rid[type_m]: + if int(machine.rid()) in range(plage[0], plage[1]): + ipt.macip(machine.mac(), type_m) + break for type_m in types_machines: if not type_m in tab.keys(): diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index ffab4db6..0554e85c 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -3340,12 +3340,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) def netv6(self): """Retourne le réseau IPv6 Cr@ns associé à la machine""" - for ty, (start, end) in config.rid.iteritems(): - if start <= int(self.rid()) <= end: - nettype = ty - break - else: - raise ValueError('Impossible d\'identifier le type de machine.') + nettype, _ = ridtools.find_rid_plage(int(self.rid())) if nettype != 'special': return netaddr.IPNetwork(config.prefix[nettype][0]) diff --git a/gestion/ridtools.py b/gestion/ridtools.py index bfa0ce4a..d08a2b94 100644 --- a/gestion/ridtools.py +++ b/gestion/ridtools.py @@ -58,11 +58,8 @@ class Rid(object): """Peuple les champs de l'instance par rapport au rid""" self.rid = rid - for tp, (start, end) in config.rid.iteritems(): - if start <= rid <= end: - self.type = tp - break - else: + self.type = find_rid_plage(int(rid)) + if self.type == 'Inconnu': 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 @@ -149,3 +146,17 @@ class Rid(object): def __int__(self): 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) diff --git a/gestion/whos.py b/gestion/whos.py index 60b7b5ba..dee1cc4a 100755 --- a/gestion/whos.py +++ b/gestion/whos.py @@ -62,6 +62,7 @@ from affich_tools import * from config import rid import user_tests import subprocess, commands +import ridtools limit_aff_details = 1 limit_aff_machines = 15 @@ -351,7 +352,7 @@ def list_machines(machines) : return tableau(data, 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']) def list_spec(machines) : @@ -925,10 +926,7 @@ def __bases_machines(m) : """ Retourne [ type de la machines, blacklist ] """ #Type t = 'inconnu' - for tp, (start, end) in rid.iteritems(): - if start <= int(m.rid()) <= end: - t = tp - break + t, _ = ridtools.find_rid_plage(int(m.rid())) if isinstance(m, BorneWifi): t = "borne"