web-dev-qa-db-fra.com

Comment puis-je limiter la bande passante par utilisateur?

Pour résumer: j'ai un serveur dédié avec quelques amis qui exécutent un client torrent avec une interface graphique Web. Chaque utilisateur exécute un client sous son nom d'utilisateur sur le serveur, les téléchargements entrent dans leur utilisateur, et seulement ils ont accès à leurs propres fichiers, etc.

Comment puis-je surveiller et limiter la bande passante par mois sur une base d'utilisateur?

Je pensais qu'il doit y avoir un moyen d'utiliser des iptables peut-être. Et en surveillant la bande passante utilisée par tous les processus de l'utilisateur X. Et s'ils ont utilisé davantage leur bande passante mensuelle autorisée de y GB, ils reçoivent un message indiquant que et la mise en réseau est bloquée pour leur client torrent, ou le client est complètement tué. J'ai également pensé à Squid, mais voyant qu'il utiliserait plusieurs clients torrent, cela pourrait utiliser beaucoup de ressources de serveur ...

J'utilise Debian Lenny.

Je ne sais pas comment faire ça ...

cela serait-il possible du tout? Je suis reconnaissant de même que des solutions partielles à cette ...

32
loco41211

Vous pouvez essayer d'utiliser le --quota option dans iptables, ce qui vous permet de définir une limite de transfert en octets. Puisque vous exécutez plusieurs clients torrent, chacun sous un nom d'utilisateur différent, vous pouvez combiner cela avec le --uid-owner option, comme suggéré Katriel.

De cette façon, vous pouvez appliquer une limite de transfert par période (jour/semaine/mois/etc.) sans avoir à limiter la vitesse de téléchargement de votre utilisateur.

Afin de rendre les compteurs de paquets persistants, vous devez les sauvegarder périodiquement (par exemple, via un travail cron), de sorte que vous puissiez les restaurer au cas où vous devez redémarrer le serveur ou affleurer les règles de pare-feu.

13
alemartini

Vous pouvez utiliser la commande de mise en forme de trafic 'TC'.

Donnez à chacun de vos amis un autre port à utiliser pour BitTorrent. Marquez le TCP paquets avec iptables pour chaque port.

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

Utilisez ensuite la commande TC pour définir la largeur de bande maximale et le débit pour chaque utilisateur.

À la fin du mois, vous pouvez supprimer et ajouter les commandes 'TC' pour réinitialiser les comptes.

Vous pouvez surveiller l'utilisation de chaque utilisateur par:

tc filter show dev ethX

Si vous utilisez Debian Install Shorewall, il est vraiment facile de faire de la formation de trafic sans gâcher avec des iptables. Vous venez de modifier les TCDevices, TCCLasses et TCLules dans le répertoire/etc/shorewall. Plus d'infos ici: http://www.shorewall.net/traffic_shaping.htm

Comme l'a suggéré l'autre personne, marquer des paquets par nom d'utilisateur est probablement meilleur que par le port, ainsi que les ports peuvent être modifiés sans mettre à jour les IPTables.

13
chris.moos

Juste pour ajouter sur la question ci-dessus.

Vous pouvez utiliser des iptables avec l'utilisateur correspondant à la couleur des paquets comme:

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

Puis utilisez "TC" pour limiter à une base d'utilisateur.

12
katriel

En fonction de la manière dont le trafic mensuel vous souhaitez autoriser chaque utilisateur par mois, vous pouvez définir une limite de bande passante en conséquence, en utilisant certains des outils suggérés par les autres utilisateurs.

Par exemple, disons que vous souhaitez définir une limite de téléchargement maximale de 250 gb/mois . Maintenant, si vous divisez que par le nombre d'heures d'heures d'un mois (~ 730), puis de 3600, vous obtiendrez le taux de téléchargement maximum, lequel dans cet exemple serait Arount 100 Ko/s .

Ensuite, si vous définissez un maximum DL = taux de 100 Kb/s, vous feriez appliquer automatiquement votre limite de téléchargement de 250 Go/mois (en supposant bien sûr que votre chaperette fonctionne correctement). Si vos utilisateurs ne peuvent pas télécharger plus rapidement que 100 kb/s, ils ne seront pas en mesure de télécharger plus de 250 Go/mois.

Afin de limiter le taux de téléchargement que vous pouvez utiliser tc ou certains des autres outils mentionnés. Si vous ne voulez pas traiter directement avec tc, vous pouvez utiliser cbq.init , qui est assez simple à configurer. Ce script était présent dans Debian Heatch en tant que package shaper, mais il semble avoir été supprimé après cela. Quoi qu'il en soit, c'est juste un script simple que vous pouvez télécharger à partir de Sourceforge.

Bien sûr, cette approche pourrait ne pas être utile dans votre cas (par exemple, si vous souhaitiez que vos utilisateurs puissent télécharger à la vitesse maximale disponible, mais également en appliquant votre limite MONTLY, ma suggestion ne fonctionnerait pas).

8
mfriedman

je sais que c'est un vieux post mais même je suis tombé sur elle à la recherche de réponses aujourd'hui et je finis par faire ensemble quelque chose qui fonctionne parfaitement pour moi. J'ai une liaison montante de liaison descendante et 2,5mb et il y a 4 personnes et 5 serveurs partageant ce lien. Avec les serveurs Bandlink Bandwith est critique, mais la liaison descendante est utile avec 4 personnes, donc personne ne le faisait tout.

Je cours Centos 6.3 en tant que routeur, mais ces commandes devraient fonctionner sur n'importe quel Linux. Eth0 est mon liaison montante vers le fournisseur Eth1 est mon réseau local via 24 interrupteurs de port et point d'accès WiFi I Limitez les téléchargements sur 5 des 25 mbs (environ 500 kb/sec), je limite les téléchargements sur 200kbit (environ 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

puis pour limiter les utilisateurs que vous utilisez 2 lignes iptables par utilisateur

pour limiter les téléchargements:

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

pour limiter les téléchargements

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

il suffit de changer votre adresse IP et vos ports Eth pour correspondre à qui vous souhaitez limiter

7
BrierMay

Pour complétude, il y a un démon d'espace d'utilisateur appelé trickle. Il peut être utilisé pour limiter la bande passante d'un seul processus. L'utilisation est très simple: f.e. Pour limiter la bande passante utilisée par aptitude, vous pouvez écrire: trickle -d 10 aptitude install wesnoth Toutefois, car il fonctionne à l'aide de LD_PRELOAD, il pourrait être facilement remplacé par un utilisateur avec accès à Shell.

3
liori

Jetez un coup d'œil à la seripaccct noyau patch (cela a en réalité une longue historique ). Dans la Docs pour l'ancienne version Il semble également fournir une application des quotas ainsi que sur la surveillance, et il est également possible de fournir vos propres scripts de stratégie.

Étant donné que les créateurs de useripacct ont dû recourir à un patch de noyau pour obtenir le comportement souhaité, il semble peu probable qu'il existe une méthode plus simple disponible par défaut. Les seules alternatives sembleraient être limitatives de la bande passante (par quelque chose comme tc ou filet) comme suggéré par la plupart des autres réponses ici (mais pas en fait ce que vous recherchez), ou créez un VM = Pour chaque utilisateur (à l'aide de la virtualisation du système d'exploitation légère par quelque chose comme - OpenVz ) et le trafic comptable par VM (qui est assez facile évalué par quelque chose comme vnstat ). Cela semble être trop succulent (tout à coup, vous avez un tas de VMS à administrer au lieu d'un système).

2
timday