Premier Training & Business Partner Red Hat

Apache mod_bw (modulo per la limitazione di banda)

Mirco Massone
Ti piacerebbe diventare anche tu uno di noi e
pubblicare i tuoi articoli nel blog degli RHCE italiani?

APACHE2 MOD-BW (modulo apache per limitazione di banda) – Mirco Massone

Questo modulo non è un componente presente nella suite apache2, anche se ad esso si appoggia perfettamente per quasi tutti i contesti più diffusi.

Questo documento non è altro che una sommaria traduzione del documento di pubblicazione dell’autore, cui vanno tutti i riconoscimenti. Ad esso corredo alcuni esempi pratici di attivazione e configurazione del modulo in ambito LAN aziendale, ma generalizzabili in ogni contesto. Si lascia all’utente la libertà di testare come meglio convenga la propria configurazione prima di metterla in produzione.

http://svn.apache.org/repos/asf/httpd/sandbox/mod_bw/mod_bw.txt

COSA FA MOD-BW:

Il “modulo” è in grado di distribuire piuttosto bene la banda disponibile rispetto alla richiesta contemporanea di una certa risorsa esposta dal vostro web server da parte di più clients.

Una recente novità (importante) sul modulo consiste nella possibilità che offre di limitare la banda disponibile allo “User Agent” che ne faccia richiesta, in sostanza rispetto alla tipologia di browser del client chiamante.

Esso trova quindi una sua utilità nell’ambito di presunti attacchi DOS o DDOS, ove si conoscano le sorgenti attaccanti.

Il “modulo”, una volta reso disponibile al web server (nello specifico Apache2), può essere utilizzato indifferentemente dentro un singolo VH (Virtual Host), che è il caso che prenderemo in esame in questo documento, perché il più diffuso, oppure all’interno della più generale configurazione di Apache.

In un contesto Apache che espone diversi VH in modalità Host-Name Based (tipicamente un web server con più siti esposti), in cui la configurazione è customizzata dentro il file di configurazione del singolo vh, il modulo mod_bw si presta molto bene.

INSTALLAZIONE MODULO MOD-BW:

in Ubuntu: “sudo apt-get install libapache2-mod-bw”

L’installazione di mod_bw è subordinata alla distribuzione Linux in uso sul server.

Da adesso in avanti farò riferimento alla distribuzione Ubuntu Server 12.04 LTS, ma per ciascuna “distribuzione” le path ed i files coinvolti potrebbero essere leggermente diverse, nonché le modalità di attivazione e configurazione del modulo stesso.

Invito il friutore di questa guida a fare riferimento alla documentazione relativa alla propria “distribuzione Linux”.

Per l’installazione del modulo si faccia sempre riferimento al sistema di pacchettizzazione del S.O.

Una volta installato nel sistema (in Ubuntu server 12.04 LTS il pacchetto si chiama: libapache2- mod-bw), il modulo va configurato perché divenga immediatamente efficace.

Come quasi tutti i moduli apache2, è possibile integrarne le direttive di utilizzo all’interno del singolo vh in un web server (basato su Apache2) configurato in modalità “name virtual host based”.

Tali modifiche tuttavia possono venir apportate in linea di principio senza difficoltà all’unico file di configurazione di apache, che su Ubuntu Server è allocato nella path “/etc/apache2/apache2.conf”, tuttavia, così facendo, le direttive del modulo saranno vigenti per tutti i “virtual host” ospitati sul server web.

ATTIVAZIONE MODULO MOD-BW:

sudo apache2ctl -M” verifica se il modulo è stato attivato; se il modulo appare nella lista in output allora è già stato attivato al termine dell’installazione, diversamente potremo attivarlo semplicemente adoperando il seguente comando da dentro la path: /etc/apache2/mods-available”: “sudo a2enmod bw”.

COME USARLO: integrandone le direttive all’interno del vh da proteggere.

Ipotesi: sito www.my-site.com stressato da uno spider molto insistente, di cui si conosca l’ip e/o la regolar expression dello User Agent:

  1. Si edita il file di config del proprio sito, presumibilmente il vh dentro la path: /etc/apache2/sites-available/nome_vh.
  2. Si introduce la sezione dedicata al modulo con le direttive atte a rallentare lo spider, simili a queste:

BandwidthModule On abilita il modulo

ForceBandWidthModule On forza il modulo a recepire ogni richiesta (ovvero ogni richiesta passa dal modulo, che ne processa il contenuto rispetto alle direttive imposte al modulo stesso)

BandWidth ip_attaccante 1024 l’ip in oggetto viene limitato nel traffico da/verso il sito alla banda di 1Kb/sec.

Ricaricare la configurazione in apache2 col comando: “sudo /etc/init.d/apache2 reload” Questo modulo è in grado di limitare l’uso della larghezza di banda su ogni host virtuale o directory esposta. Le direttive di htaccess non sono ancora supportate.

DIRETTIVE PER IL MODULO:

BandWidthModule [On|Off] – Abilita/disabilita il modulo. In maniera predefinita in quasi tutte le distribuzioni il modulo è disabilitato, di conseguenza, di default, esso non sarebbe in grado di limitare alcun che.

ForceBandWidthModule [On|Off] – Se “On” il modulo esamina ogni richiesta sul traffico http. Per impostazione predefinita , il modulo esamina ogni richiesta . Se si attiva, ogni richiesta verrà elaborata dal modulo.

BandWidth [From] [bytes/s] – Limita la banda secondo la sintassi. Richiede 2 parametri. Il primo è l’origine della connessione, che può essere un ip, una classe di ip, un host-name, un dominio o parte di esso, una network-mask o tutto assieme.

Es. (192.168.0.0/24 or 192.168.0.0/255.255.255.0) Il secondo parametro indica la banda totale resa disponibile a ciascun chiamante identificato nella prima direttiva [From].

Se il valore di banda è posto a 0, non vi è limite di banda sul traffico. Nell’esempio che segue abbiamo impostato 1 Kb max di download dall’host “A” in finestra di sopra, max libertà di download all’host in finestra sotto, host “B”:

Con le seguenti direttive:

BandwidthModule On

ForceBandWidthModule On

BandWidth 10.10.1.103 1024

ecco cosa succede dal punto di vista dell’host A (click sull’immagine per ingrandire):

BandWidth 10.10.1.103_1k_a

e cosa succede dal punto di vista dell’host B (click sull’immagine per ingrandire):

BandWidth 10.10.1.103_1k_b

MinBandWidth [From] [bytes/s]dedica una banda minima a ciascun client secondo la sintassi.

Richiede 2 parametri.

Il primo è l’origine della connessione, che può essere un ip, una classe di ip, un host-name, un dominio o parte di esso, una network-mask o tutto assieme.

Es. (192.168.0.0/24 or 192.168.0.0/255.255.255.0).

Il secondo parametro indica la banda minima resa disponibile a ciascun chiamante identificato nella prima direttiva [From].

Se il valore di banda è posto a 0, non vi è limite di banda sul traffico.

Cosa significa esattamente? Se si dispone di un totale di banda ammontante a 100 kbytes, e si imposta MinBandWidth a 50 kbytes, la banda disponibile per ogni client sarà di 50 kbytes di velocità totale per il download.

Se la direttiva è posta a 0, si prevede di utilizzare il minimo di default (256 byte/s). Parametrizzando al valore di -1 ogni client avrà una banda disponibile corrispondente al valore della direttiva “BandWidth”.

Nell’esempio che segue abbiamo impostato per il primo host (A) un limite al download di 6Kb, per il secondo host (B) un limite inferiore, intorno ai 2Kb.

Con le seguenti direttive:

BandWidthModule On

ForceBandWidthModule On

BandWidth 10.10.24.167 6000

BandWidth 10.10.1.103 2000

I risultati sono i seguenti:

Punto di vista dell’host A (click sull’immagine per ingrandire):

bw_all_host_a_6k_host_b_2k_a

Punto di vista dell’host B (click sull’immagine per ingrandire):

bw_all_host_a_6k_host_b_2k_b

Eccovi un altro esempio di applicazione di direttive del mod-bw:

BandWidth all 102400 Imposta un limite di banda a 100Kb per ogni client

MinBandWidth all 50000 Imposta un minimo di banda a 50 Kb per ogni client.

Nelle righe sopra abbiamo impostato un max di banda disponibile per il primo client che si connette al server corrispondente a circa 100 Kb. Se altri clients si collegano al server la banda verrà “splittata” di conseguenza, garantendo tuttavia un minimo di banda di 50 Kb/client fino al raggiungimento dell’ammontare complessivo della banda disponibile.

Qui di seguito si offre a tutti la stessa banda disponibile di 50 Kb:

BandWidth all 50000

MinBandWidth all -1

Altro esempio:

Se si desidera limitare tutti i client che usano certi browser, è possibile farlo come segue:

BandWidth u: [User-Agent] [byte/s]

User agent è un’espressione regolare che corrisponde alla stringa inviata dal browser.

Facciamo un altro esempio, questa volta contemplando anche il “metodo” della request del client:

BandWidth “u:(*).^Mozilla/5 ” 10240

BandWidth “u:wget” 102400

La prima riga verifica il matching con il browser Mozilla.

La seconda riga limita al metodo “wget” la banda a 100 Kb per tutti i clients Mozilla.

La direttiva: LargeFileLimit [Type] [Minimum Size] [bytes/s] – Limita la banda per files specifici.

“Type” rappresenta l’estensione di un file, si può usare anche il carattere “*”, per definire “tutti” i files.

È possibile utilizzare .tgz per associare alla direttiva solo i file tar compressi, “.avi” per far corrispondere i file video o, come detto, “*” per soddisfare la condizione: “tutti”. “Minimum Size” è la dimensione (in Kb) del file da abbinare. In questo modo è possibile abbinare eventuali file video di grossa dimensione, che fagocitano molta banda, limitandone il download.

L’ultimo parametro è la velocità consentita.

Facciamo un esempio:

LargeFileLimit .avi 500000 10240

Con questa direttiva limitiamo il download di files con estensione “.avi” più grandi di 500Kb, consentendo ai clients che ne fanno richiesta un download al max di 10Kb/s. Qui di seguito un esempio dell’impiego della direttiva di limitazione della banda in base alla natura del file da scaricare (un file mp4 di circa 29 Mb).

Con le seguenti direttive:

BandWidthModule On

ForceBandWidthModule On

LargeFileLimit .mp4 1024 5120

Punto di vista dell’host A (click sull’immagine per ingrandire):

LargeFileLimit .mp4_1024_5120_a

Punto di vista dell’host B (click sull’immagine per ingrandire):

LargeFileLimit .mp4_1024_5120_b

Si noti che la banda disponibile ai files in download è imposta a 5K per ogni file mp4 che superi la soglia del 1Mb di ingombro. Tale banda è ovviamente divisa tra i due hosts richiedenti la risorsa.

Ecco un esempio ove non si pongono limiti di download ad un host (B) e si limita la banda disponibile all’host A:

Con le seguenti direttive:

BandWidthModule On

ForceBandWidthModule On

BandWidth 10.10.24.167 0

BandWidth 10.10.1.103 512000

Punto di vista dell’host A (click sull’immagine per ingrandire):

host_a_unlimited_host_b_512kb_a

Punto di vista dell’host B (click sull’immagine per ingrandire):

host_a_unlimited_host_b_512kb_b

Un altra direttiva, che suggeriamo di non modificare, è quella sulla dimensione dei pacchetti scambiati tra server e host richiedente.

BandWidthPacket [Size] – Imposta dimesione dei pacchetti (Bytes)

Probabilmente non vi sarà mai necessario modificare questo parametro.

Il valore predefinito è 8192, che è valido per quasi tutte le velocità.

Il parametro deve essere compreso tra 1024 e 131072.

Impostare un pacchetto di dimensione più piccola del default probabilmente causerebbe una velocità massima più bassa, e il “modulo” userebbe più tempo per lo “splitting” delle informazioni in traffico”.

Se si utilizza una dimensione troppo grande del pacchetto rispetto al default, il “modulo” si autoregolerà per velocità più basse di download.

Una interessante direttiva consente di personalizzare il messaggio d’errore.

BandWidthError [Error ] – Consente l’impostazione di un messaggio d’errore personalizzato.

Questa direttiva è utile per fornire un codice di errore personalizzato.

Di default, quando il parametro apachemaxconnections” viene raggiunto, il web server emetterà un errore codificato tipo: “503 HTTP_SERVICE_UNAVAILABLE”.

Per alcune tipologie di utenza è frustrante ricevere un messaggio di errore, senza sapere perché.

Si può usare la direttiva apache2 “ErrorDocument” per giustificare il “503”, spiegando per esempio che si è sotto un pesante carico di connessioni.

Questa direttiva risolve questo inconveniente, imponendo una risposta ad un pesante numero di connessioni.

È possibile utilizzare qualsiasi codice di errore tra 300 e 599.

Si prega di notare che alcuni dei codici di errore sono già in uso, quindi prima di utilizzare qualsiasi numero, date un’occhiata a un elenco dei codici (cercare “codici di errore http” in google).

Facciamo un esempio con pagina di errore personalizzata:

ErrorDocument 510 /errors/maxconexceeded.html pagina personalizzata per l’errore 510

BandWidthError 510 “specifica dell’errore”

Ulteriore materiale per la gestione degli errori direttamente sulla pagina della direttiva “ErrorDocument” sul sito di apache2.org.

Maxconnections [From] [Max] – Imposta il numero massimo di connessioni che il client può realizzare contemporaneamente.

Richiede 2 parametri.

From” è l’origine delle connessioni, che può essere un ip, una classe di ip, un host-name, un dominio o parte di esso, una network-mask o tutto assieme.

Es. (192.168.0.0/24 or 192.168.0.0/255.255.255.0).

Il secondo parametro rappresenta il numero max di connessioni consentite al client richiedente.

Qualsiasi connessione oltre il valore “Max” , otterrà un: “503 Service Temporarily Unavailable”.

Si tratta evidentemente di un possibile disservizio agli occhi del client.

Potrebbe essere necessario disporre di un limite di larghezza di banda per le richieste provenienti da uno stesso client.

Naturalmente questo limite potrà non essere così basso.

Si può addirittura impostare “Maxconnection” a valore “illimitato”.

In questo modo si usa lo stesso spazio di memoria della direttiva “BandWidth” che conta il numero di clients collegati, risparmiando spazio in memoria. Se la direttiva “BandWidth” non conosce la stessa origine delle richieste, “MaxConnections” verrà ignorato.

Facciamo un esempio :

BandWidth all 0 ogni client ha banda illimitata

Maxconnection all 20 ogni client può realizzare al max 20 connessioni contemporanee

oppure:

BandWidth all 0 ogni client ha banda illimitata

BandWidth 192.168.0.0/24 10240 ogni client della rete dispone di circa 10Kb di banda Maxconnection all 20 ogni client può realizzare al max 20 connessioni contemporanee Maxconnection 192.168.0.0/24 5 i client della rete specificata dispongono di “sole” 5 connessioni contemporanee.

Se si desidera limitare tutti i client che usino certi browser, è possibile usare questo formalismo:

Maxconnection u: [User-Agent] [Max] User agent è un’espressione regolare che corrisponde all’informazione che il client invia al server circa il browser utilizzato per accedere alle risorse con metodi previsti.

È probabilmente più facile da spiegare con alcuni esempi:

Obiettivo: Limitare le connessioni di tutti i client utilizzanti browser Mozilla che facciano uso del metodo “WGET” a max 5 connessioni contemporanee.

Maxconnection “u:(*).^Mozilla/5” 5 Verifica matching con browser Mozilla e limita a 5 connessioni.

Maxconnection “u:Wget” 5 . Limita il metodo wget su ogni browser ad un max di 5 richieste contemporanee provenienti dalla stessa sorgente.

Ecco un esempio ove si impone un limite di download al “metodo” WGET da ogni client per la banda di 10 Kb, con le seguenti direttive, la banda disponibile verrà divisa in due tra i due hosts richiedenti la risorsa:

BandWidthModule On

ForceBandWidthModule On

BandWidth “u:Wget” 10240

Punto di vista dell’host A (click sull’immagine per ingrandire):

BandWidth_

Punto di vista dell’host B (click sull’immagine per ingrandire):

BandWidth_

Ricordiamo sempre che gran parte delle performance sul download dipendono dalla velocità di connessione di cui disponiamo.

Impossibile, quindi, ottenere maggiori velocità di quelle consentite dall’intera banda disponibile.

ESEMPI DI VARIO TIPO:

1) Obiettivo: Limitare ogni utente ad un massimo di 10Kb/s su un vhost (my-site.com):

BandWidthModule On attiva il modulo

ForceBandWidthModule On usa il modulo per processare ogni richiesta

Bandwidth all 10240 destina 10Kb/sec ad ogni connessione

MinBandWidth all -1 destina ad ogni client il valore minimo di banda descritto nella direttiva Bandwidth

ServerName www.my-site.com regole valide per il vh di nome www.my-site.com

2) Obiettivo: Limitare tutti gli utenti interni (LAN) a 1000 kb/s, con un minimo di 50kb/s sempre disponibile, e un limite nel download dei file superiori a 500KB di 50kb/s.

BandWidthModule On attiva il modulo

ForceBandWidthModule On usa il modulo per processare ogni richiesta

Bandwidth all 1024000 destina ad ogni client 1Mb/sec (1000Kb/sec)

MinBandWidth all 50000 LargeFileLimit * 512000 50000 Minimo dedicato client/sec = 50 Kb per file che superano la dimensione di 512 Kb.

ServerName www.my-site.com regole valide per il vh di nome www.my-site.com

3) Obiettivo: Limitare il download dei files con estensione “.avi” e “.mpg” a 20kb/s.

BandWidthModule On attiva il modulo

ForceBandWidthModule On usa il modulo per processare ogni richiesta

LargeFileLimit .avi 1024 20480 download dei files “.avi” che eccedono 1Kb a 20Kb/sec

LargeFileLimit .mpg 1024 20480 download dei files “.mpg” che eccedono 1Kb a 20Kb/sec

ServerName www.my-site.com regole valide per il vh di nome www.my-site.com

4) Obiettivo: filtrare l’uscita per files “mime type” (per il testo) e limitarla a 5kb/s:

BandWidthModule On attiva il modulo

AddOutputFilterByType MOD_BW text/html text/plain attiva il filtro per type mime

Bandwidth all 5000 tutti i clients con banda disponibile di 5Kb/sec

ServerName www.my-syte.com regole valide per il vh di nome www.my-site.com

COME FUNZIONA MOD-BW?

Il “modulo” fa uso di uno spazio di memoria condivisa per registrare tutte le configurazioni da attuare.

In questo spazio di memoria esso terrà anche un “conteggio” delle informazioni di runtime in uso (come connessioni correnti, bw utilizzate, tempo di esecuzione e byte inviati) . Quando si assegna un limite di bw (bandwhidht) a qualche client, il “modulo” inizia a “splittare” i dati, spezzettandoli in blocchi (direttiva “BandWidthPacket “) e invierà i dati richiesti dai clients un pacchetto per volta, introducendo un piccolo ritardo tra i blocchi.

Il ritardo è regolato in modo che venga inviato almeno 1 pacchetto/sec, evitando così fenomeni di timeout dei browser.

Se sono presenti due o più client in download sul vhost, il limite superiore di banda verrà suddiviso per “n” clients.

Quindi, se si dispone di un limite di banda di 160Kb e abbiamo due clients che effettuano download contestuali, ognuno disporrà di 80Kb.

È anche possibile impostare un pre-determinato rapporto (fisso) di download, in modo che ogni client avrà una velocità di download massima pre-fissata.

Il modulo può essere utilizzato per limitare l’accesso a dir precisate in direttiva “Directory”:

BandWidthModule On Attiva il modulo

BandWidth all 16384 Limite di banda 16Kb/sec per qualunque host

LargeFileLimit * 500000 4096 Ogni file eccedente i 500Kb avrà limite di download impostato a 4Kb

LargeFileLimit * 100000 1024 Dentro la root della pub del sito ogni file eccedente i 100Kb sarà scaricabile alla velocità di 1Kb/sec.

Riferimenti: Autore: Ivan Barrera A. ( Bruce ) HomePage: Http://Ivn.cl/apache Licenza: Rilasciato sotto la licenza Apache Software v2.0

Info about author

Mirco Massone