Frage Wie kann ich die Bandbreite pro Benutzer begrenzen?


Zusammenfassen: Ich habe einen dedizierten Server mit ein paar Freunden, die einen Torrent-Client mit Web GUI laufen lassen. Jeder Benutzer führt einen Client unter seinem Benutzernamen auf dem Server aus, so dass Downloads in sein Benutzerverzeichnis gehen, und nur diese haben Zugriff auf ihre eigenen Dateien usw.

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

Ich dachte, dass es einen Weg geben muss, vielleicht mit iptables. Und wenn Sie die Bandbreite überwachen, die von allen Prozessen von Benutzer X verwendet wird. Und wenn sie mehr als ihre monatlich erlaubte Bandbreite von Y GB verwendet haben, erhalten sie eine Nachricht, dass das Netzwerk für ihren Torrent-Client blockiert wird oder der Client vollständig getötet 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 sogar nur Teillösungen zu diesem ...


32
2017-08-09 20:56


Ursprung


Wir könnten wissen, welches Betriebssystem Sie verwenden. - Sam Cogan
Debian. Hinzugefügt in einer Bearbeitung. - loco41211
nur neugierig, verwenden Sie TorrentFlux? - cop1152
Es ist eines der Dinge, die ich versuche. Im Moment suchen wir nach etwas, das möglicherweise für eine Seedbox mit Speicherplatzbegrenzung (für die wir eine Lösung haben) und einer Bandbreitenbegrenzung, auf der wir stecken, verwendet wird, und einige meiner Freunde verwenden ungefähr 1 TB pro Monat während andere nur ein paar Mbs. Möchte das wirklich pro Benutzer gleich begrenzen. - loco41211


Antworten:


Sie könnten den 'tc' Traffic Shaping Befehl 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 Ende des Monats können Sie die 'tc' Befehle löschen und hinzufügen, um die Zähler zurückzusetzen.

Sie können die Verwendung für jeden Benutzer überwachen durch:

tc filter show dev ethX

Wenn Sie mit Debian Shorewall installieren, ist es sehr einfach Traffic Shapes ohne Iptables zu erstellen. Sie bearbeiten nur tcdevices, tcclasses und tcrules im Verzeichnis / etc / shorewall. Mehr Infos hier: http://www.shorewall.net/traffic_shaping.htm

Wie die andere Person vorgeschlagen hat, ist das Markieren von Paketen nach Benutzername wahrscheinlich besser als nach Port. Auf diese Weise können die Ports geändert werden, ohne iptables zu aktualisieren.


13
2017-08-09 21:30



Könnten Sie ein Beispiel für die Festlegung eines Grenzwerts geben? Sprich 100GB ein- und ausgehend zusammen? - loco41211
torrent kann (und ist tatsächlich) andere Ports benutzen, 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 Port oder mehrere Ports setzen, wenn Sie einen Bittorrent-Client verwenden. Sieh dir das an: dessent.net/btfaq/#ports - chris.moos


Sie könnten versuchen, die --quota Option in iptables, mit der Sie ein Übertragungslimit in Bytes festlegen können. Da Sie mehrere Torrent - Clients ausführen, die jeweils unter einem anderen Benutzernamen stehen, können Sie dies mit dem --uid-owner Option, wie Katriel vorgeschlagen.

Auf diese Weise können Sie ein Überweisungslimit pro Zeitraum (Tag / Woche / Monat / etc) erzwingen, ohne die Download-Geschwindigkeit Ihrer Nutzer einschränken zu müssen.

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


13
2017-08-10 12:21



das klingt, als würde es funktionieren. Mit Hilfe von iptables kann ich also den gesamten eingehenden Verkehr für einen bestimmten Benutzer markieren. Und ich kann es für eine bestimmte Zeit begrenzen. Ich kann immer noch nicht herausfinden, wie das Ganze aussehen wird. Also 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 Besitzer --uid-Besitzer someuser -j MARK --set-mark 100"? Oder wie würde ich es tun? Was wäre zum Beispiel der Befehl, den Benutzernamen bob mit der ID 56 mit einem monatlichen Limit von 100 GB zu markieren? Ich denke, ein monatlicher Cron Job würde den Traffic Counter zurücksetzen. - loco41211


Nur um die obige Frage hinzuzufügen.

Sie könnten iptables mit Benutzerabgleich verwenden, um die Pakete wie folgt einzufä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.


12
2017-08-09 21:39



Könnten Sie ein Beispiel geben, wie Sie mit tc ein Limit von etwa 100GB für den Benutzernamen blablaX setzen können? Und ein Beispiel für den Code, der verwendet werden sollte, um das Limit nach einem Monat zurückzusetzen? Vielen Dank - loco41211
Dadurch wird der Benutzer dauerhaft und nicht auf ein zeitgesteuertes Kontingent beschränkt - katriel


Abhängig davon, wie viel monatlicher Datenverkehr Sie für jeden Benutzer pro Monat zulassen möchten, können Sie eine Bandbreitenbeschränkung entsprechend festlegen, indem Sie einige der Tools verwenden, die von den anderen Benutzern vorgeschlagen wurden.

Angenommen, Sie möchten ein maximales Download-Limit von 250 GB / Monat. Wenn Sie diese Zahl durch die Anzahl der Stunden in einem Monat (~ 730) und dann durch 3600 teilen, erhalten Sie die maximale Download-Rate, die in diesem Beispiel ungefähr erreicht würde 100 KB / s.

Wenn Sie dann eine maximale DL-Rate von 100 KB / s festlegen, wird automatisch das Downloadlimit von 250 GB / Monat (unter der Voraussetzung, dass der Traffic Shaper ordnungsgemäß funktioniert) automatisch erzwungen. Wenn Ihre Benutzer nicht schneller als 100 KB / s herunterladen können, können sie nicht mehr als 250 GB / Monat herunterladen.

Um die Download-Rate zu begrenzen, die Sie verwenden könnten tc oder einige der anderen Tools, die erwähnt wurden. Wenn Sie nicht direkt damit umgehen wollen tc, Du könntest benutzen cbq.init, das ist ziemlich einfach einzurichten. Dieses Skript war in Debian Etch als das shaper Paket, aber es scheint 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 nicht nützlich (wenn Sie beispielsweise möchten, dass Ihre Benutzer mit der maximal verfügbaren Geschwindigkeit herunterladen und trotzdem Ihr monatliches Limit durchsetzen, würde mein Vorschlag nicht funktionieren).


8
2017-08-10 01:21



Der Hauptgrund, warum wir eine Seedbox statt Torrents auf unseren PCs verwenden, weil es viel schneller ist, so löst dies leider nicht das Problem ... Danke trotzdem - loco41211


Ich weiß, dass dies ein alter Post ist, aber selbst ich bin darauf gestoßen, dass ich heute nach Antworten suchte, und habe schließlich etwas zusammengefügt, das perfekt für mich funktioniert. Ich habe einen 25 MB Downlink und 2,5 MB Uplink und es gibt 4 Personen und 5 Server, die diesen Link teilen. mit Servern Uplink-Bandbreite ist kritisch, aber Downlink ist nützlich mit 4 Personen, so dass niemand alles verschlingt.

Ich benutze Centos 6.3 als Router, aber diese Befehle sollten auf jedem Linux funktionieren. eth0 ist mein Uplink zum Provider eth1 ist mein LAN über 24 Port Switch und Wifi Access Point Ich beschränke Downloads auf 5 der 25 MB (ca. 500 KB / Sek.) Ich beschränke Uploads auf 200Kbit (ca. 25KB / 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

Um Benutzer zu begrenzen, benutzen Sie 2 iptables Zeilen pro Benutzer

um Uploads zu beschränken:

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

Ändere einfach deine IP-Adresse und deine eth-Ports, um zu sehen, wen du einschränken möchtest


7
2018-01-16 09:09





Der Vollständigkeit halber wird ein Userspace-Daemon genannt trickle. Es kann verwendet werden, um die Bandbreite eines einzelnen Prozesses zu begrenzen. Die Verwendung ist sehr einfach: z.B. Um die von aptitude verwendete Bandbreite zu begrenzen, könnten Sie schreiben: trickle -d 10 aptitude install wesnoth Da es jedoch mit LD_PRELOAD funktioniert, könnte es leicht von einem Benutzer mit Shell-Zugriff überschrieben werden.


3
2017-08-09 21:46



Keiner der Benutzer außer mir hat Shell-Zugriff. Auch mit Bandbreitenbegrenzung meine ich pro Monat oder einen festgelegten Zeitraum. ist das möglich? - loco41211
Nein, Rinnsal begrenzt die Geschwindigkeit wie in einer Sekunde. - liori


Sieh dir das an Benutzeraktion Kernel patch (Das hat eigentlich eine ziemlich lange Zeit Geschichte). In dem Dokumente für die alte Version Es scheint auch eine Kontingent-Erzwingung sowie Überwachung zu bieten, und es ist auch möglich, eigene Policy-Skripte zur Verfügung zu stellen.

Da die useripacct-Ersteller auf ein Kernel-Patch zurückgreifen mussten, um das gewünschte Verhalten zu erhalten, scheint es unwahrscheinlich, dass eine einfachere Methode standardmäßig verfügbar ist. Die einzige Alternative scheint bandbreitenbegrenzend zu sein (durch etwas wie tc oder trickle), wie es von den meisten anderen Antworten hier vorgeschlagen wird (aber nicht das, wonach Sie suchen), oder eine VM für jeden Benutzer zu erstellen (mit leichter Betriebssystemvirtualisierung) durch etwas wie OpenVZ) und Accounting - Traffic pro VM (was ziemlich einfach durch etwas wie bewertet wird vnstat). Das scheint jedoch übertrieben zu sein (plötzlich müssen Sie eine Menge VMs verwalten, anstatt eines Systems).


2
2017-08-09 22:18



es ist ein bisschen übertrieben, da es die Server-Ressourcen entlasten würde. Aber danke für die Idee! - loco41211