Commit a442fd6b authored by Pierre-Elliott Bécue's avatar Pierre-Elliott Bécue
Browse files

[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
parent e2a4cfe7
......@@ -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 = {
# 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),],
# Rid pour les machines fixes
'adherents' : (256, 2047),
# Rid pour les machines filaire ipv4
'fil' : (0, 2047),
'adherents' : [(256, 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),
'wifi-adh' : [(2048, 3071), (3328, 4095),],
# Rid pour les bornes
'bornes' : [(3072, 3327),],
# Rid pour machines spéciales
'special' : (4096, 6143),
'special' : [(4096, 6143),],
# Rid pour les serveurs v6-only
'serveurs-v6' : [(8192, 10240),],
# Rid pour les filaires v6-only
'fil-v6' : (16384, 24575),
'fil-v6' : [(16384, 24575),],
# Rid pour les wifi v6-only
'wifi-v6' : (24576, 32767),
# Rid pour les serveurs
'serveurs' : (0, 255),
'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"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment