[config, firewall4, ipt, deconnexion] Bridage pour les décos pour upload

This commit is contained in:
Valentin Samir 2013-04-13 22:20:21 +02:00
parent c03e0187b3
commit 90764dba42
6 changed files with 50 additions and 19 deletions

View file

@ -278,11 +278,12 @@ file_pickle = { 4 : '/tmp/ipt_pickle',
6 : '/tmp/ip6t_pickle' 6 : '/tmp/ip6t_pickle'
} }
blacklist_sanctions = ['upload', 'warez', 'p2p', 'autodisc_p2p','autodisc_virus','virus','autodisc_upload', 'bloq'] blacklist_sanctions = ['upload', 'warez', 'p2p', 'autodisc_p2p','autodisc_virus','virus', 'bloq']
if bl_carte_et_definitif: if bl_carte_et_definitif:
blacklist_sanctions.append('carte_etudiant') blacklist_sanctions.append('carte_etudiant')
blacklist_sanctions_soft = ['autodisc_virus','ipv6_ra','mail_invalide','virus', blacklist_sanctions_soft = ['autodisc_virus','ipv6_ra','mail_invalide','virus',
'upload', 'warez', 'p2p', 'autodisc_p2p', 'autodisc_upload', 'bloq','carte_etudiant','chambre_invalide'] 'upload', 'warez', 'p2p', 'autodisc_p2p', 'bloq','carte_etudiant','chambre_invalide']
blacklist_bridage_upload = ['autodisc_upload']
adm_users = [ 'root', 'identd', 'daemon', 'postfix', 'freerad', 'amavis', adm_users = [ 'root', 'identd', 'daemon', 'postfix', 'freerad', 'amavis',
'nut', 'respbats', 'list', 'sqlgrey', 'ntpd', 'lp' ] 'nut', 'respbats', 'list', 'sqlgrey', 'ntpd', 'lp' ]

View file

@ -24,8 +24,8 @@ logiciels envoyant une très grande quantité de petites données
(vidéo-conférence par exemple). Il peut y avoir d'autres raisons. (vidéo-conférence par exemple). Il peut y avoir d'autres raisons.
Si cela continuait, et que tu dépassais la limite acceptable des 4096 Si cela continuait, et que tu dépassais la limite acceptable des 3789
Mo sur 24 heures, tu serais automatiquement déconnecté du réseau pour Mo sur 24 heures, ton débit serais automatiquement fortement limité pour
une durée de 24 heures. Il t'appartient donc de surveiller cela de une durée de 24 heures. Il t'appartient donc de surveiller cela de
plus près et de faire en sorte que tes machines n'uploadent pas de plus près et de faire en sorte que tes machines n'uploadent pas de
manière excessive à l'avenir. manière excessive à l'avenir.
@ -50,15 +50,13 @@ Content-Type: text/plain; charset="utf-8"
Bonjour %(proprio)s, Bonjour %(proprio)s,
Tu as temporairement été déconnecté du réseau en raison de l'envoi trop Ton débit à été temporairement limité en raison de l'envoi trop
important de données vers l'extérieur (%(upload)s Mo en 24h). important de données vers l'extérieur (%(upload)s Mo en 24h).
Tu as toujours accès au web ainsi qu'à tes mails crans mais tous les Si cela devait se renouveler trop souvent, tu serais déconnecté
autres services te sont suspendus. Si cela devait se renouveler trop complètement pour une durée plus importante.
souvent, tu serais déconnecté complètement pour une durée plus Il t'appartient donc de surveiller cela de plus près et de faire en sorte que
importante. Il t'appartient donc de surveiller cela de plus près et de ta machine n'uploade plus de manière excessive à l'avenir.
faire en sorte que ta machine n'uploade plus de manière excessive à
l'avenir.
Pour plus d'informations, tu peux consulter la page : Pour plus d'informations, tu peux consulter la page :
http://wiki.crans.org/VieCrans/DéconnexionPourUpload http://wiki.crans.org/VieCrans/DéconnexionPourUpload

View file

@ -11,7 +11,7 @@ exempt = [ ['138.231.136.0/21', '138.231.0.0/16'],
soft = 300 soft = 300
#: limite hard #: limite hard
hard = 4096 hard = 3789
#: envoyer des mails à disconnect@ en cas de dépassement soft ? #: envoyer des mails à disconnect@ en cas de dépassement soft ?
disconnect_mail_soft = False disconnect_mail_soft = False

View file

@ -7,7 +7,7 @@ import sys
sys.path.append('/usr/scripts/gestion') sys.path.append('/usr/scripts/gestion')
sys.path.append('/usr/scripts/lc_ldap') sys.path.append('/usr/scripts/lc_ldap')
from config import NETs, blacklist_sanctions, blacklist_sanctions_soft, mac_komaz, mac_titanic, adm_users, accueil_route from config import NETs, blacklist_sanctions, blacklist_sanctions_soft, blacklist_bridage_upload, mac_komaz, mac_titanic, adm_users, accueil_route
import pwd import pwd
import config.firewall import config.firewall
@ -223,7 +223,6 @@ class firewall_base(object) :
} }
self.ipset['blacklist']={ self.ipset['blacklist']={
'soft' : Ipset("BLACKLIST-SOFT","ipmap","--from 138.231.136.0 --to 138.231.151.255"),
'hard' : Ipset("BLACKLIST-HARD","ipmap","--from 138.231.136.0 --to 138.231.151.255"), 'hard' : Ipset("BLACKLIST-HARD","ipmap","--from 138.231.136.0 --to 138.231.151.255"),
} }
@ -472,6 +471,11 @@ class firewall_komaz(firewall_base_routeur):
'allow' : Ipset("RESEAUX-NON-ROUTABLE-ALLOW","nethash"), 'allow' : Ipset("RESEAUX-NON-ROUTABLE-ALLOW","nethash"),
} }
self.ipset['blacklist'].update({
'soft' : Ipset("BLACKLIST-SOFT","ipmap","--from 138.231.136.0 --to 138.231.151.255"),
'upload' : Ipset("BLACKLIST-UPLOAD","ipmap","--from 138.231.136.0 --to 138.231.151.255"),
})
def blacklist_maj(self, ips): def blacklist_maj(self, ips):
self.blacklist_hard_maj(ips) self.blacklist_hard_maj(ips)
self.blacklist_soft_maj(ips) self.blacklist_soft_maj(ips)
@ -673,12 +677,19 @@ class firewall_komaz(firewall_base_routeur):
for ip in ip_list: for ip in ip_list:
machine = conn.search("ipHostNumber=%s" % ip) machine = conn.search("ipHostNumber=%s" % ip)
# Est-ce qu'il y a des blacklists soft parmis les blacklists de la machine # Est-ce qu'il y a des blacklists soft parmis les blacklists de la machine
if machine and set([bl.value['type'] for bl in machine[0].blacklist_actif() ]).intersection(blacklist_sanctions_soft): if machine:
if set([bl.value['type'] for bl in machine[0].blacklist_actif() ]).intersection(blacklist_sanctions_soft):
try: self.ipset['blacklist']['soft'].add(ip) try: self.ipset['blacklist']['soft'].add(ip)
except IpsetError: pass except IpsetError: pass
if machine and set([bl.value['type'] for bl in machine[0].blacklist_actif() ]).intersection(blacklist_bridage_upload):
try: self.ipset['blacklist']['upload'].add(ip)
except IpsetError: pass
else: else:
try: self.ipset['blacklist']['soft'].delete(ip) try: self.ipset['blacklist']['soft'].delete(ip)
except IpsetError: pass except IpsetError: pass
try: self.ipset['blacklist']['upload'].delete(ip)
except IpsetError: pass
def blacklist_soft(self, table=None, fill_ipset=False, apply=False): def blacklist_soft(self, table=None, fill_ipset=False, apply=False):
"""Redirige les gens blacklisté vers le portail captif""" """Redirige les gens blacklisté vers le portail captif"""
@ -696,7 +707,17 @@ class firewall_komaz(firewall_base_routeur):
for ip in ips for ip in ips
) )
bl_upload_ips = set(
str(ip) for ips in
[
machine['ipHostNumber'] for machine in self.blacklisted_machines()
if set([bl.value['type'] for bl in machine.blacklist_actif() ]).intersection(blacklist_bridage_upload)
]
for ip in ips
)
self.ipset['blacklist']['soft'].restore(bl_soft_ips) self.ipset['blacklist']['soft'].restore(bl_soft_ips)
self.ipset['blacklist']['upload'].restore(bl_upload_ips)
print OK print OK
if table == 'mangle': if table == 'mangle':
@ -830,6 +851,9 @@ class firewall_komaz(firewall_base_routeur):
for net in NETs['personnel-ens']: for net in NETs['personnel-ens']:
self.add(table, chain, '-o %s -d %s -j CLASSIFY --set-class 1:3' % (dev['app'], net)) self.add(table, chain, '-o %s -d %s -j CLASSIFY --set-class 1:3' % (dev['app'], net))
self.add(table, chain, '-o %s -s %s -j CLASSIFY --set-class 1:2' % (dev['out'], net)) self.add(table, chain, '-o %s -s %s -j CLASSIFY --set-class 1:2' % (dev['out'], net))
# Classification pour les blacklists upload
self.add(table, chain, '-o %s -m set --match-set %s src -j CLASSIFY --set-class 1:11' % (dev['out'], self.ipset['blacklist']['upload']))
print OK print OK
if run_tc: if run_tc:
@ -851,6 +875,13 @@ class firewall_komaz(firewall_base_routeur):
tc('qdisc add dev %s parent 1:10 ' tc('qdisc add dev %s parent 1:10 '
'handle 10: sfq perturb 10' % dev[int_key]) 'handle 10: sfq perturb 10' % dev[int_key])
#Classe des decos upload
tc('class add dev %s parent 1:2 classid 1:11 '
'htb rate 40kbps ceil 40kbps prio 1' % dev['out'])
tc('qdisc add dev %s parent 1:11 '
'handle 11: sfq perturb 10' % dev['out'])
for int_key in ['app']: for int_key in ['app']:
try: try:
tc('qdisc del dev %s root' % dev[int_key]) tc('qdisc del dev %s root' % dev[int_key])

View file

@ -25,13 +25,14 @@ 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
from config import blacklist_sanctions, blacklist_sanctions_soft, 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
import subprocess import subprocess
import netaddr import netaddr
blacklist_sanctions.extend(blacklist_sanctions_soft) blacklist_sanctions.extend(blacklist_sanctions_soft)
blacklist_sanctions.extend(blacklist_bridage_upload)
Mangle_policy = """ Mangle_policy = """
*mangle *mangle

View file

@ -312,7 +312,7 @@ for elupload, eltype, elid in uploadeurs:
mail.sendmail(upload.expediteur, upload.expediteur, corps) mail.sendmail(upload.expediteur, upload.expediteur, corps)
# On supprime les vieux avertisements # On supprime les vieux avertisements
curseur.execute("DELETE FROM avertis_upload_hard WHERE date < timestamp 'now' - interval '1 day'") curseur.execute("DELETE FROM avertis_upload_hard WHERE date < timestamp 'now' - interval '85200 seconds'") # 23h et 40min pour prolonger les blacklists toujours au dessus de la limite
curseur.execute("DELETE FROM avertis_upload_soft WHERE date < timestamp 'now' - interval '1 day'") curseur.execute("DELETE FROM avertis_upload_soft WHERE date < timestamp 'now' - interval '1 day'")
################################################################################ ################################################################################