Comment puis-je limiter la bande passante par utilisateur?

32

Pour résumer: j'ai un serveur dédié avec quelques amis qui exécutent un client torrent avec interface graphique. Chaque utilisateur exécute un client sous son nom d'utilisateur sur le serveur. Les téléchargements sont donc placés dans son répertoire utilisateur. Seuls les utilisateurs ont accès à leurs propres fichiers, etc.

Comment puis-je surveiller et limiter la bande passante par mois, par utilisateur?

Je pensais qu'il devait y avoir un moyen d'utiliser iptables peut-être. Et en surveillant la bande passante utilisée par tous les processus de l'utilisateur X. S'ils ont utilisé plus de leur bande passante mensuelle autorisée de Y Go, ils reçoivent un message l'informant que la mise en réseau est bloquée pour leur client torrent ou que le client est complètement tué. J'ai aussi pensé au calmar, mais vu qu'il utiliserait plusieurs clients torrent, cela pourrait utiliser beaucoup de ressources serveur ...

J'utilise Debian Lenny.

Je ne sais pas comment faire ça ...

cela serait-il possible? Je suis reconnaissant pour les solutions, même partielles, à cette ...

loco41211
la source
Nous pourrions faire avec savoir quel système d'exploitation que vous utilisez.
Sam Cogan
debian. Ajouté dans une édition.
loco41211
Juste curieux, utilisez-vous TorrentFlux?
Cop1152
c'est une des choses que j'essaye. Pour le moment, nous envisageons tout ce qui pourrait être utilisé pour un seedbox avec une limitation de l'espace disque (pour laquelle nous avons une solution) et une limitation de la bande passante sur laquelle nous sommes bloqués .... et certains de mes amis utilisent environ 1 To par mois tandis que d'autres seulement quelques Mbs. Voudrais vraiment limiter cela par utilisateur également.
loco41211

Réponses:

13

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

Donnez à chacun de vos amis un port différent à utiliser pour BitTorrent. Marquez les paquets TCP 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 bande passante et le débit maximum pour chaque utilisateur.

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

Vous pouvez surveiller l'utilisation pour chaque utilisateur en:

tc filter show dev ethX

Si vous utilisez shorewall pour l’installation de Debian, il est très facile de mettre en forme le trafic sans jouer avec iptables. Vous venez de modifier tcdevices, tcclasses et tcrules dans le répertoire / etc / shorewall. Plus d'informations ici: http://www.shorewall.net/traffic_shaping.htm

Comme l’a suggéré l’autre personne, il est probablement préférable de marquer les paquets par nom d’utilisateur que par port, ce qui permet de modifier les ports sans mettre à jour iptables.

chris.moos
la source
pourriez-vous donner un exemple sur la fixation d'une limite? Dites 100 Go entrants et sortants ensemble?
loco41211
torrent peut (et est en fait) utiliser d'autres ports, ainsi l'exemple ne résout pas vraiment le problème.
Cstamas
qui supprime ces deux options comme une solution ...
loco41211
cstamas: vous pouvez définir un ou plusieurs ports lorsque vous utilisez un client BitTorrent. voir ceci: dessent.net/btfaq/#ports
chris.moos
13

Vous pouvez essayer d'utiliser l' --quotaoption dans iptables, qui vous permet de définir une limite de transfert en octets. Comme vous exécutez plusieurs clients torrent, chacun sous un nom d'utilisateur différent, vous pouvez combiner cela avec l' --uid-owneroption, comme suggéré par katriel.

De cette manière, vous pouvez imposer une limite de transfert par période (jour / semaine / mois / etc.) sans avoir à limiter la vitesse de téléchargement de vos utilisateurs.

Pour rendre les compteurs de paquets persistants, vous devez les enregistrer régulièrement (par exemple, via un travail cron), afin de pouvoir les restaurer au cas où vous auriez besoin de redémarrer le serveur ou de vider les règles du pare-feu.

Alemartini
la source
cela semble que cela fonctionnerait. Donc, avec l’aide d’iptables, je peux marquer tout le trafic entrant et sortant pour un utilisateur donné. Et je peux le limiter pour une période donnée. Je n'arrive toujours pas à comprendre comment l'ensemble sera mis en place. La commande exacte que je pourrais utiliser pour marquer le trafic entrant et sortant est donc la suivante: "iptables -t mangle -A SORTIE -p tcp -m propriétaire --uid-propriétaire someuser -j MARK --set-mark 100"? Ou comment pourrais-je le faire? Par exemple, que serait la commande pour marquer le nom d'utilisateur bob avec l'id 56 avec une limite mensuelle de 100 Go? Je suppose qu'un travail mensuel mensuel réinitialiserait le compteur de trafic?
loco41211
12

Juste pour ajouter à la question ci-dessus.

Vous pouvez utiliser iptables avec une correspondance d'utilisateur pour colorer les paquets de la manière suivante:

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

Et utilisez ensuite 'tc' pour limiter l'utilisateur par utilisateur.

Katriel
la source
Pourriez-vous donner un exemple d'utilisation de tc pour définir une limite de 100 Go pour le nom d'utilisateur blablaX? Et un exemple du code qui devrait être utilisé pour réinitialiser la limite après un mois? Merci
loco41211
Cela limitera l'utilisateur sur une base permanente, et non sur un quota chronométré
katriel
8

En fonction du trafic mensuel que vous souhaitez autoriser pour chaque utilisateur, 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, supposons que vous souhaitiez définir une limite de téléchargement maximale de 250 Go / mois . Maintenant, si vous divisez cela par le nombre d'heures d'un mois (~ 730), puis par 3 600, vous obtiendrez le débit de téléchargement maximal, qui dans cet exemple serait d'environ 100 Ko / s .

Ensuite, si vous définissez un débit DL maximal de 100 Ko / s, vous appliquerez automatiquement votre limite de téléchargement de 250 Go / mois (en supposant bien sûr que votre gestionnaire de trafic fonctionne correctement). Si vos utilisateurs ne peuvent pas télécharger plus rapidement que 100 Ko / s, ils ne pourront pas télécharger plus de 250 Go / mois.

Afin de limiter le taux de téléchargement, vous pouvez utiliser tccertains des 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 Etch en tant que shaperpaquet, mais il semble avoir été supprimé par la suite. Quoi qu'il en soit, ce n'est qu'un simple script que vous pouvez télécharger depuis SourceForge.

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

Mfriedman
la source
La principale raison pour laquelle nous utilisons une boîte à semences au lieu de torrents sur nos ordinateurs, car il est beaucoup plus rapide, donc malheureusement, cela ne résout pas le problème ... Merci quand même
loco41211
7

Je sais que c’est un vieil article, mais même si j’ai trébuché dessus à la recherche de réponses aujourd’hui, j’ai finalement rassemblé quelque chose qui fonctionne parfaitement pour moi. J'ai une liaison descendante de 25Mbs et une liaison montante de 2,5Mbs et il y a 4 personnes et 5 serveurs partageant ce lien. Avec les serveurs, la bande passante est critique, mais la liaison descendante est utile avec 4 personnes, donc personne ne le cache.

J'exécute centos 6.3 en tant que routeur, mais ces commandes devraient fonctionner sur n'importe quel linux. eth0 est ma liaison montante avec le fournisseur eth1 est mon réseau local via un commutateur à 24 ports et un point d'accès wifi Je limite les téléchargements à 5 des 25 Mbps (environ 500 Ko / s). Je limite les téléchargements à 200 Ko / s (environ 25 Ko / s).

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 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

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 à ceux que vous souhaitez limiter

BrierMay
la source
3

Pour être complet, il existe un démon d’espace utilisateur appelé trickle. Il peut être utilisé pour limiter la bande passante d'un processus unique. L'utilisation est très simple: par exemple, pour limiter la bande passante utilisée par aptitude, vous pouvez écrire ceci: trickle -d 10 aptitude install wesnothCependant, comme cela fonctionne avec LD_PRELOAD, il pourrait être facilement remplacé par un utilisateur ayant un accès shell.

liori
la source
À part moi-même, aucun des utilisateurs n'a accès au shell. De plus, avec limite de bande passante, je veux dire par mois ou une période de temps définie. Cela serait-il possible?
loco41211
1
Non, le ruissellement limite la vitesse en secondes.
liori
2

Jetez un coup d’œil au patch du noyau useripacct (il a en fait une longue histoire ). Dans la documentation de l'ancienne version, il semble également prévoir l'application de quotas ainsi que la surveillance. Il est également possible de fournir vos propres scripts de stratégie.

Étant donné que les créateurs d’utilisateurs devaient recourir à un correctif du noyau pour obtenir le comportement souhaité, il semble peu probable qu’une méthode plus simple soit disponible par défaut. Les seules alternatives semblent être la limitation de bande passante (par exemple, tc ou ruissellement) comme suggéré par la plupart des autres réponses ici (mais pas réellement ce que vous recherchez), ou la création d'une machine virtuelle pour chaque utilisateur (avec la virtualisation de système d'exploitation légère). par quelque chose comme OpenVZ ) et le trafic de comptabilité par machine virtuelle (ce qui est assez facile à évaluer par quelque chose comme vnstat ). Cela semble toutefois exagéré (vous avez soudainement un groupe de machines virtuelles à administrer au lieu d’un système).

timday
la source
c'est un peu excessif car cela épuiserait les ressources du serveur .. mais merci pour l'idée!
loco41211