Wie kann ich die Bandbreite pro Benutzer begrenzen?

32

Zusammenfassend: Ich habe einen dedizierten Server mit ein paar Freunden, die einen Torrent-Client mit Web-GUI ausführen. Jeder Benutzer führt einen Client unter seinem Benutzernamen auf dem Server aus, sodass die Downloads in seinem Benutzerverzeichnis erfolgen und nur er Zugriff auf seine eigenen Dateien usw. hat.

Wie kann ich die monatliche Bandbreite pro Benutzer überwachen und begrenzen?

Ich dachte, es müsste einen Weg geben, iptables zu benutzen. Durch Überwachen der von allen Prozessen von Benutzer X verwendeten Bandbreite. Wenn sie mehr als die monatlich zulässige Bandbreite von Y GB verwendet haben, erhalten sie die Meldung, dass das Netzwerk für ihren Torrent-Client blockiert wird oder der Client vollständig beendet wird. Ich habe auch über Squid nachgedacht, aber da es mehrere Torrent-Clients verwenden würde, könnte dies eine Menge Serverressourcen verbrauchen ...

Ich benutze Debian Lenny.

Ich bin mir nicht sicher, wie ich das machen soll ...

Wäre das überhaupt möglich? Ich bin dankbar für auch nur Teillösungen dafür ...

loco41211
quelle
Wir könnten mit wissen, welches Betriebssystem Sie verwenden.
Sam Cogan
debian. In einer Bearbeitung hinzugefügt.
loco41211
Nur neugierig, verwenden Sie TorrentFlux?
Cop1152
Das ist eines der Dinge, die ich versuche. Im Moment suchen wir nach Möglichkeiten für eine Seedbox mit Speicherplatzbeschränkung (für die wir eine Lösung haben) und Bandbreitenbeschränkung, an der wir festhalten ... und einige meiner Freunde verwenden ungefähr 1 TB pro Monat, während andere nur ein paar mbs. Würde das wirklich gerne pro User gleich einschränken.
loco41211

Antworten:

13

Sie können den Befehl 'tc' zur Verkehrssteuerung verwenden.

Geben Sie jedem Ihrer Freunde einen anderen Port für BitTorrent. Markieren Sie die TCP-Pakete mit iptables für jeden 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

Verwenden Sie dann den Befehl tc, um die maximale Bandbreite und Rate für jeden Benutzer festzulegen.

Am Monatsende können Sie die 'tc'-Befehle löschen und hinzufügen, um die Zähler zurückzusetzen.

Sie können die Nutzung für jeden Benutzer folgendermaßen überwachen:

tc filter show dev ethX

Wenn Sie Debian Install Shorewall verwenden, ist es wirklich einfach, Traffic Shaping durchzuführen, ohne sich mit iptables herumzuschlagen. Sie bearbeiten nur tcdevices, tcclasses und tcrules im Verzeichnis / etc / shorewall. Weitere Informationen finden Sie hier: http://www.shorewall.net/traffic_shaping.htm

Wie die andere Person angedeutet hat, ist es wahrscheinlich besser, Pakete nach Benutzernamen zu kennzeichnen als nach Port. Auf diese Weise können die Ports geändert werden, ohne iptables zu aktualisieren.

chris.moos
quelle
Könnten Sie ein Beispiel für die Festlegung eines Grenzwerts geben? Sagen 100 GB eingehende und ausgehende zusammen?
loco41211
Torrent kann (und ist) auch andere Ports verwenden, so dass das Beispiel das Problem nicht wirklich löst.
Cstamas
Das entfernt diese beiden Optionen als Lösung ...
loco41211
cstamas: Sie können einen oder mehrere Ports festlegen, wenn Sie einen Bittorrent-Client verwenden. siehe dies: dessent.net/btfaq/#ports
chris.moos
13

Sie können versuchen, die --quotaOption in iptables zu verwenden, mit der Sie ein Übertragungslimit in Byte festlegen können. Da Sie mehrere Torrent-Clients --uid-ownerausführen , die jeweils unter einem anderen Benutzernamen ausgeführt werden, können Sie dies mit der Option kombinieren , wie von katriel vorgeschlagen.

Auf diese Weise können Sie ein Übertragungslimit pro Zeitraum (Tag / Woche / Monat / usw.) erzwingen, ohne die Download-Geschwindigkeit Ihrer Benutzer begrenzen zu müssen.

Um die Paketzähler dauerhaft zu machen, müssen Sie sie regelmäßig speichern (z. B. durch einen Cron-Job), damit Sie sie wiederherstellen können, falls Sie den Server neu starten oder die Firewall-Regeln leeren müssen.

alemartini
quelle
das klingt wie es funktionieren würde. So kann ich mit Hilfe von iptables den gesamten ein- und ausgehenden Datenverkehr für einen festgelegten Benutzer markieren. Und ich kann es für einen festgelegten Zeitraum begrenzen. Ich kann immer noch nicht herausfinden, wie das Ganze aussehen wird. So ist der genaue Befehl, den ich verwenden könnte, um den eingehenden und ausgehenden Verkehr zu markieren: "iptables -t mangle -A OUTPUT -p tcp -m Eigentümer --uid-Eigentümer someuser -j MARK --set-mark 100"? Oder wie würde ich das machen? Was wäre zum Beispiel der Befehl, den Benutzernamen bob mit der ID 56 mit einem monatlichen Limit von 100 GB zu markieren? Ich vermute, ein monatlicher Cron-Job würde den Verkehrszähler zurücksetzen.
loco41211
12

Nur um die obige Frage zu ergänzen.

Sie könnten iptables mit User Matching verwenden, um die Pakete wie folgt zu färben:

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

Verwenden Sie dann 'tc', um die Anzahl pro Benutzer zu begrenzen.

katriel
quelle
Könnten Sie ein Beispiel geben, wie Sie mit tc ein Limit von beispielsweise 100 GB für den Benutzernamen blablaX festlegen können? Und ein Beispiel für den Code, mit dem das Limit nach einem Monat zurückgesetzt werden soll? Vielen Dank
loco41211
Dies schränkt den Benutzer dauerhaft und nicht zeitlich begrenzt ein
katriel 10.08.09
8

Abhängig davon, wie viel monatlichen Datenverkehr Sie für jeden Benutzer pro Monat zulassen möchten, können Sie ein entsprechendes Bandbreitenlimit festlegen, indem Sie einige der von den anderen Benutzern vorgeschlagenen Tools verwenden.

Angenommen, Sie möchten ein maximales Download-Limit von 250 GB / Monat festlegen . Wenn Sie dies durch die Anzahl der Stunden pro Monat (~ 730) und dann durch 3600 dividieren, erhalten Sie die maximale Download-Rate, die in diesem Beispiel bei rund 100 KB / s liegt .

Wenn Sie dann eine maximale DL-Rate von 100 KB / s festlegen, erzwingen Sie automatisch Ihr Download-Limit von 250 GB / Monat (vorausgesetzt natürlich, dass Ihr Traffic Shaper ordnungsgemäß funktioniert). Wenn Ihre Benutzer nicht schneller als 100 KB / s herunterladen können, können sie nicht mehr als 250 GB / Monat herunterladen.

Um die Downloadrate zu begrenzen, können Sie tceinige der anderen erwähnten Tools verwenden. Wenn Sie nicht direkt damit umgehen möchten tc, können Sie cbq.init verwenden , das ziemlich einfach einzurichten ist. Dieses Skript war in Debian Etch als shaperPaket vorhanden, scheint aber danach entfernt worden zu sein. Wie auch immer, es ist nur ein einfaches Skript, das Sie von SourceForge herunterladen können.

Natürlich ist dieser Ansatz in Ihrem Fall möglicherweise nicht hilfreich (wenn Sie beispielsweise möchten, dass Ihre Benutzer mit der maximal verfügbaren Geschwindigkeit herunterladen und trotzdem Ihr monatliches Limit durchsetzen können, funktioniert mein Vorschlag nicht).

mfriedman
quelle
Der Hauptgrund, warum wir stattdessen nur Torrents auf unseren PCs verwenden, weil diese viel schneller sind, so dass dies das Problem leider nicht löst ...
Trotzdem vielen
7

Ich weiß, dass dies ein alter Post ist, aber selbst ich bin heute auf der Suche nach Antworten darauf gestoßen und habe irgendwann etwas zusammengesetzt, das perfekt für mich funktioniert. Ich habe einen Downlink mit 25 MBit / s und einen Uplink mit 2,5 MBit / s und es gibt 4 Personen und 5 Server, die diesen Link gemeinsam nutzen. Bei Servern ist die Uplink-Bandbreite von entscheidender Bedeutung, bei 4 Personen ist der Downlink jedoch nützlich, sodass niemand alles in den Griff bekommt.

Ich verwende Centos 6.3 als Router, aber diese Befehle sollten unter jedem Linux funktionieren. eth0 ist mein Uplink zum Provider eth1 ist meine LAN-Verbindung über einen 24-Port-Switch und einen WLAN-Zugangspunkt

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

Um die Anzahl der Benutzer zu begrenzen, verwenden Sie 2 iptables-Zeilen pro Benutzer

um Uploads zu begrenzen:

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

um Downloads zu begrenzen

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

Ändern Sie einfach Ihre IP-Adresse und die eth-Ports so, dass sie dem entsprechen, den Sie einschränken möchten

BrierMay
quelle
3

Der Vollständigkeit halber gibt es einen Userspace-Daemon namens trickle. Es kann verwendet werden, um die Bandbreite eines einzelnen Prozesses zu begrenzen. Die Verwendung ist sehr einfach: trickle -d 10 aptitude install wesnothUm beispielsweise die von aptitude verwendete Bandbreite zu begrenzen, können Sie schreiben: Da es jedoch mit LD_PRELOAD funktioniert, kann es leicht von einem Benutzer mit Shell-Zugriff überschrieben werden.

Liori
quelle
Keiner der Benutzer außer mir hat Shell-Zugriff. Mit Bandbreitenbeschränkung meine ich auch pro Monat oder einen festgelegten Zeitraum. ist das möglich?
loco41211
1
Nein, Rinnsal begrenzt die Geschwindigkeit wie pro Sekunde.
Liori
2

Schauen Sie sich den useripacct- Kernel- Patch an (dieser hat tatsächlich eine ziemlich lange Geschichte ). In den Dokumenten für die alte Version wird anscheinend auch die Kontingentdurchsetzung sowie die Überwachung bereitgestellt. Außerdem können Sie Ihre eigenen Richtlinienskripts bereitstellen.

Da die Useripacct-Ersteller auf einen Kernel-Patch zurückgreifen mussten, um das gewünschte Verhalten zu erzielen, ist es unwahrscheinlich, dass standardmäßig eine einfachere Methode verfügbar ist. Die einzige Alternative scheint eine Bandbreitenbeschränkung (durch Tc oder Trickle) zu sein, wie in den meisten anderen Antworten hier vorgeschlagen (aber nicht genau das, wonach Sie suchen), oder die Erstellung einer VM für jeden Benutzer (unter Verwendung einer schlanken Betriebssystemvirtualisierung) von so etwas wie OpenVZ ) und Accounting-Verkehr pro VM (was von so etwas wie vnstat ziemlich einfach beurteilt wird ). Das scheint allerdings übertrieben zu sein (plötzlich müssen Sie statt eines Systems eine Reihe von VMs verwalten).

timday
quelle
Es ist ein bisschen übertrieben, da es die Serverressourcen belasten würde. Aber danke für die Idee!
loco41211