From 90764dba42ebda83a036a03087b02831ed2ed2a2 Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Sat, 13 Apr 2013 22:20:21 +0200 Subject: [PATCH] =?UTF-8?q?[config,=20firewall4,=20ipt,=20deconnexion]=20B?= =?UTF-8?q?ridage=20pour=20les=20d=C3=A9cos=20pour=20upload?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gestion/config/config.py | 5 +++-- gestion/config/mails/upload.py | 16 ++++++------- gestion/config/upload.py | 2 +- gestion/gen_confs/firewall4.py | 41 +++++++++++++++++++++++++++++----- gestion/ipt.py | 3 ++- surveillance/deconnexion.py | 2 +- 6 files changed, 50 insertions(+), 19 deletions(-) diff --git a/gestion/config/config.py b/gestion/config/config.py index cc16983f..4e961130 100644 --- a/gestion/config/config.py +++ b/gestion/config/config.py @@ -278,11 +278,12 @@ file_pickle = { 4 : '/tmp/ipt_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: blacklist_sanctions.append('carte_etudiant') 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', 'nut', 'respbats', 'list', 'sqlgrey', 'ntpd', 'lp' ] diff --git a/gestion/config/mails/upload.py b/gestion/config/mails/upload.py index 3fa25f9b..069f7a47 100644 --- a/gestion/config/mails/upload.py +++ b/gestion/config/mails/upload.py @@ -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. -Si cela continuait, et que tu dépassais la limite acceptable des 4096 -Mo sur 24 heures, tu serais automatiquement déconnecté du réseau pour +Si cela continuait, et que tu dépassais la limite acceptable des 3789 +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 plus près et de faire en sorte que tes machines n'uploadent pas de manière excessive à l'avenir. @@ -50,15 +50,13 @@ Content-Type: text/plain; charset="utf-8" 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). -Tu as toujours accès au web ainsi qu'à tes mails crans mais tous les -autres services te sont suspendus. Si cela devait se renouveler trop -souvent, tu serais déconnecté complètement pour une durée plus -importante. Il t'appartient donc de surveiller cela de plus près et de -faire en sorte que ta machine n'uploade plus de manière excessive à -l'avenir. +Si cela devait se renouveler trop souvent, tu serais déconnecté +complètement pour une durée plus importante. +Il t'appartient donc de surveiller cela de plus près et de faire en sorte que +ta machine n'uploade plus de manière excessive à l'avenir. Pour plus d'informations, tu peux consulter la page : http://wiki.crans.org/VieCrans/DéconnexionPourUpload diff --git a/gestion/config/upload.py b/gestion/config/upload.py index c74a03a1..43d7d621 100644 --- a/gestion/config/upload.py +++ b/gestion/config/upload.py @@ -11,7 +11,7 @@ exempt = [ ['138.231.136.0/21', '138.231.0.0/16'], soft = 300 #: limite hard -hard = 4096 +hard = 3789 #: envoyer des mails à disconnect@ en cas de dépassement soft ? disconnect_mail_soft = False diff --git a/gestion/gen_confs/firewall4.py b/gestion/gen_confs/firewall4.py index 36e045fa..cd7ed64b 100755 --- a/gestion/gen_confs/firewall4.py +++ b/gestion/gen_confs/firewall4.py @@ -7,7 +7,7 @@ import sys sys.path.append('/usr/scripts/gestion') 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 config.firewall @@ -223,7 +223,6 @@ class firewall_base(object) : } 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"), } @@ -472,6 +471,11 @@ class firewall_komaz(firewall_base_routeur): '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): self.blacklist_hard_maj(ips) self.blacklist_soft_maj(ips) @@ -673,12 +677,19 @@ class firewall_komaz(firewall_base_routeur): for ip in ip_list: machine = conn.search("ipHostNumber=%s" % ip) # 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): - try: self.ipset['blacklist']['soft'].add(ip) - except IpsetError: pass + 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) + 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: try: self.ipset['blacklist']['soft'].delete(ip) except IpsetError: pass + try: self.ipset['blacklist']['upload'].delete(ip) + except IpsetError: pass + def blacklist_soft(self, table=None, fill_ipset=False, apply=False): """Redirige les gens blacklisté vers le portail captif""" @@ -696,7 +707,17 @@ class firewall_komaz(firewall_base_routeur): 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']['upload'].restore(bl_upload_ips) print OK if table == 'mangle': @@ -830,6 +851,9 @@ class firewall_komaz(firewall_base_routeur): 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 -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 if run_tc: @@ -851,6 +875,13 @@ class firewall_komaz(firewall_base_routeur): tc('qdisc add dev %s parent 1:10 ' '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']: try: tc('qdisc del dev %s root' % dev[int_key]) diff --git a/gestion/ipt.py b/gestion/ipt.py index a7f16b3f..9aaa495e 100644 --- a/gestion/ipt.py +++ b/gestion/ipt.py @@ -25,13 +25,14 @@ 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 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 ridtools import Rid import subprocess import netaddr blacklist_sanctions.extend(blacklist_sanctions_soft) +blacklist_sanctions.extend(blacklist_bridage_upload) Mangle_policy = """ *mangle diff --git a/surveillance/deconnexion.py b/surveillance/deconnexion.py index e28f4fd8..b010e38b 100755 --- a/surveillance/deconnexion.py +++ b/surveillance/deconnexion.py @@ -312,7 +312,7 @@ for elupload, eltype, elid in uploadeurs: mail.sendmail(upload.expediteur, upload.expediteur, corps) # 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'") ################################################################################