[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:
parent
e2a4cfe72a
commit
a442fd6b22
7 changed files with 108 additions and 71 deletions
|
@ -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
|
||||
|
|
|
@ -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 !!!
|
||||
|
|
|
@ -290,6 +290,9 @@ class sable(base_reconfigure):
|
|||
class routeur(base_reconfigure):
|
||||
pass
|
||||
|
||||
class eap(base_reconfigure):
|
||||
pass
|
||||
|
||||
class gordon(base_reconfigure) :
|
||||
pass
|
||||
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue