come posso limitare la larghezza di banda per utente?


32

Riassumendo: ho un server dedicato con alcuni amici che gestiscono un client torrent con web gui. Ogni utente esegue un client con il proprio nome utente sul server, quindi i download vanno nella sua directory utente e solo loro hanno accesso ai propri file, ecc.

Come posso monitorare e limitare la larghezza di banda al mese per utente?

Pensavo che forse ci fosse un modo di usare iptables. E monitorando la larghezza di banda utilizzata da tutti i processi dell'utente X. E se hanno usato più della loro larghezza di banda mensile consentita di Y GB, ricevono un messaggio che dice che e la rete viene bloccata per il loro client torrent o il client viene ucciso completamente. Ho anche pensato a calamari, ma visto che sarebbe usare più client torrent questo potrebbe usare molte risorse del server ...

Sto usando Debian Lenny.

Non sono sicuro di come farlo ...

questo sarebbe possibile? Sono grato anche per soluzioni solo parziali a questo ...


Potremmo sapere con quale sistema operativo stai utilizzando.
Sam Cogan,

debian. Aggiunto in una modifica.
loco41211,

solo curioso, stai usando TorrentFlux?
cop1152,

è una delle cose che sto provando. Al momento stiamo cercando qualcosa da utilizzare per un seedbox con limitazione dello spazio su disco (per cui abbiamo una soluzione) e limitazione della larghezza di banda su cui siamo bloccati .... e alcuni dei miei amici usano circa 1 TB al mese mentre altri solo pochi Mb. Vorrei davvero limitare questo per utente allo stesso modo.
loco41211

Risposte:


13

È possibile utilizzare il comando di modellazione del traffico 'tc'.

Dai a ciascuno dei tuoi amici una porta diversa da usare per BitTorrent. Contrassegnare i pacchetti TCP con iptables per ciascuna porta.

iptables -t mangle -A FORWARD -p tcp --sport 6881 -j MARK --set-mark 100
iptables -t mangle -A FORWARD -p tcp --dport 6881 -j MARK --set-mark 100

Quindi utilizzare il comando tc per impostare la larghezza di banda e la velocità massime per ciascun utente.

Alla fine del mese è possibile eliminare e aggiungere i comandi 'tc' per ripristinare i conteggi.

È possibile monitorare l'utilizzo per ciascun utente:

tc filter show dev ethX

Se stai usando il Debian install shorewall, è davvero facile eseguire il shaping del traffico senza fare confusione con iptables. Devi solo modificare tcdevices, tcclasses e tcrules nella directory / etc / shorewall. Maggiori informazioni qui: http://www.shorewall.net/traffic_shaping.htm

Come ha suggerito l'altra persona, contrassegnare i pacchetti in base al nome utente è probabilmente meglio che per porta, in questo modo le porte possono essere modificate senza aggiornare iptables.


potresti fare un esempio sull'impostazione di un limite? Dire 100 GB in entrata e in uscita insieme?
loco41211,

torrent può (e in realtà lo è) utilizzare altre porte, quindi l'esempio non risolve davvero il problema.
cstamas,

che rimuove queste due opzioni come soluzione ...
loco41211

cstamas: è possibile impostare una porta o più porte quando si utilizza un client bittorrent. vedi questo: dessent.net/btfaq/#ports
chris.moos

13

È possibile provare a utilizzare l' --quotaopzione in iptables, che consente di impostare un limite di trasferimento in byte. Dato che stai eseguendo più client torrent, ognuno con un nome utente diverso, puoi combinarlo con l' --uid-owneropzione, come suggerito da Katriel.

In questo modo è possibile applicare un limite di trasferimento per periodo di tempo (giorno / settimana / mese / ecc.) Senza dover limitare la velocità di download degli utenti.

Per rendere persistenti i contatori di pacchetti, è necessario salvarli periodicamente (ad esempio tramite un processo cron), in modo da poterli ripristinare nel caso in cui sia necessario riavviare il server o svuotare le regole del firewall.


sembra che funzionerebbe. Quindi, con l'aiuto di iptables, posso contrassegnare tutto il traffico che entra e esce per un determinato utente. E posso limitarlo per un periodo di tempo prestabilito. Non riesco ancora a capire come sarà l'intero set up. Quindi è il comando esatto che potrei usare per contrassegnare il traffico in entrata e in uscita: "iptables -t mangle -A OUTPUT -p tcp -m proprietario --uid-owner someuser -j MARK --set-mark 100"? O come lo farei? Quale sarebbe, ad esempio, il comando per contrassegnare il nome utente bob con ID 56 con un limite mensile di 100 GB? Immagino che un cron job mensile ripristinerebbe il contatore del traffico?
loco41211

12

Solo per aggiungere la domanda sopra.

È possibile utilizzare iptables con la corrispondenza dell'utente per colorare i pacchetti in questo modo:

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner someuser -j MARK --set-mark 100

E poi usa 'tc' per limitare in base all'utente.


Potresti fare un esempio su come utilizzare tc per impostare un limite di dire 100 GB per nome utente blablaX? E un esempio del codice da utilizzare per ripristinare il limite dopo un mese? Grazie
loco41211

Ciò limiterà l'utente su base permanente e non su una quota temporizzata
katriel

8

A seconda della quantità di traffico mensile che si desidera consentire a ciascun utente al mese, è possibile impostare di conseguenza un limite di larghezza di banda, utilizzando alcuni degli strumenti suggeriti dagli altri utenti.

Ad esempio, supponiamo che tu voglia impostare un limite massimo di download di 250 GB / mese . Ora, se lo dividi per il numero di ore in un mese (~ 730) e quindi per 3600, otterrai la massima velocità di download, che in questo esempio sarebbe di circa 100 KB / s .

Quindi, se imposti una velocità DL massima di 100 KB / s, imposti automaticamente il limite di download di 250 GB / mese (presupponendo ovviamente che lo shaper del traffico funzioni correttamente). Se i tuoi utenti non riescono a scaricare più velocemente di 100 KB / s, non potranno scaricare più di 250 GB / mese.

Al fine di limitare la velocità di download è possibile utilizzare tco alcuni degli altri strumenti che sono stati menzionati. Se non vuoi trattare direttamente tc, puoi usare cbq.init , che è abbastanza semplice da configurare. Questo script era presente in Debian Etch come shaperpacchetto, ma sembra che sia stato rimosso dopo. Ad ogni modo, è solo un semplice script che puoi scaricare da SourceForge.

Naturalmente questo approccio potrebbe non essere utile nel tuo caso (ad esempio, se volessi che i tuoi utenti potessero scaricare alla massima velocità disponibile ma imponessi comunque il tuo limite mensile, il mio suggerimento non funzionerebbe).


Il motivo principale per cui utilizziamo un seedbox invece solo torrent sui nostri pc perché è molto più veloce, quindi purtroppo questo non risolve il problema ... Grazie comunque
loco41211

7

so che questo è un vecchio post, ma anche io mi sono imbattuto in esso alla ricerca di risposte oggi e alla fine ho messo insieme qualcosa che funziona perfettamente per me. Ho un downlink da 25 Mb e uplink da 2,5 Mb e ci sono 4 persone e 5 server che condividono questo link. con i server uplink bandwith è fondamentale, ma downlink è utile con 4 persone, quindi nessuno ha paura di tutto.

Sto usando centos 6.3 come router, ma questi comandi dovrebbero funzionare su qualsiasi Linux. eth0 è il mio collegamento verso il provider eth1 è la mia lan tramite switch a 24 porte e punto di accesso wifi Limito i download a 5 dei 25 Mb (circa 500 KB / sec) Limito i caricamenti a 200 KB (circa 25 KB / sec)

tc qdisc add dev eth0 root handle 1:0 htb default 99
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 200Kbit ceil 200Kbit prio 2
tc qdisc add dev eth0 parent 1:11 handle 10: sfq perturb 10

tc qdisc add dev eth1 root handle 2:0 htb default 99
tc class add dev eth1 parent 2:0 classid 2:1 htb rate 100Mbit ceil 100Mbit
tc class add dev eth1 parent 2:1 classid 2:11 htb rate 5Mbit ceil 5Mbit prio 2
tc qdisc add dev eth1 parent 2:11 handle 20: sfq perturb 10

quindi per limitare gli utenti usi 2 linee iptables per utente

per limitare i caricamenti:

iptables -t mangle -A POSTROUTING -o eth0 -p tcp -s 192.168.0.100 -j CLASSIFY --set-class 1:11

per limitare i download

iptables -t mangle -A POSTROUTING -o eth1 -p tcp -d 192.168.0.100 -j CLASSIFY --set-class 2:11

basta cambiare l'indirizzo IP e le porte eth in modo che corrispondano a chi si desidera limitare


3

Per completezza, esiste un demone spazio utente chiamato trickle. Può essere utilizzato per limitare la larghezza di banda di un singolo processo. L'utilizzo è molto semplice: per limitare la larghezza di banda utilizzata da aptitude, è possibile scrivere: trickle -d 10 aptitude install wesnothTuttavia, poiché funziona utilizzando LD_PRELOAD, potrebbe essere facilmente sovrascritto da un utente con accesso alla shell.


Nessuno degli utenti oltre a me ha accesso alla shell. Inoltre, con la limitazione della larghezza di banda intendo al mese o un periodo di tempo prestabilito. Sarebbe possibile?
loco41211,

1
No, il limite di velocità limita la velocità al secondo.
liori,

2

Dai un'occhiata alla patch del kernel useripacct (questa in realtà ha una storia piuttosto lunga ). Nei documenti per la vecchia versione sembra fornire anche l'applicazione delle quote e il monitoraggio, ed è anche possibile fornire i propri script delle politiche.

Dato che i creatori di useripacct hanno dovuto ricorrere a una patch del kernel per ottenere il comportamento desiderato, sembra improbabile che ci sia un metodo più semplice disponibile per impostazione predefinita. Le uniche alternative sembrerebbero essere la limitazione della larghezza di banda (di qualcosa come tc o trickle) come suggerito dalla maggior parte delle altre risposte qui (ma in realtà non quello che stai cercando), o la creazione di una macchina virtuale per ogni utente (utilizzando la virtualizzazione del sistema operativo leggera da qualcosa come OpenVZ ) e il traffico di contabilità per VM (che è abbastanza facilmente valutato da qualcosa come vnstat ). Sembra però eccessivo (improvvisamente hai un sacco di VM da amministrare invece di un sistema).


è un po 'eccessivo in quanto esaurirebbe le risorse del server .. ma grazie per l'idea!
loco41211
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.