jak mogę ograniczyć przepustowość na użytkownika?

32

Podsumowując: Mam dedykowany serwer z kilkoma przyjaciółmi obsługującymi klienta torrent z webowym GUI. Każdy użytkownik uruchamia klienta pod swoją nazwą użytkownika na serwerze, więc pobieranie odbywa się w jego katalogu użytkownika i tylko on ma dostęp do własnych plików itp.

Jak mogę monitorować i ograniczać przepustowość miesięcznie dla poszczególnych użytkowników?

Myślałem, że może być sposób na użycie iptables. I poprzez monitorowanie przepustowości używanej przez wszystkie procesy użytkownika X. A jeśli wykorzystali więcej niż ich miesięczna dozwolona przepustowość Y GB, otrzymywali komunikat informujący, że sieć zostaje zablokowana dla klienta torrent lub klient zostaje całkowicie zabity. Myślałem również o kałamarnicy, ale ponieważ używałbym wielu klientów torrentowych, mogłoby to zużywać wiele zasobów serwerowych ...

Używam Debian Lenny.

Nie jestem pewien jak to zrobić ...

czy byłoby to w ogóle możliwe? Jestem wdzięczny za choćby częściowe rozwiązania tego ...

loco41211
źródło
Moglibyśmy wiedzieć, jakiego systemu operacyjnego używasz.
Sam Cogan,
debian. Dodano w edycji.
loco41211,
tylko ciekawy, czy używasz TorrentFlux?
cop1152,
to jedna z rzeczy, których próbuję. W tej chwili szukamy czegokolwiek, co mogłoby być wykorzystane do seedboxa z ograniczeniem miejsca na dysku (dla którego mamy rozwiązanie) i ograniczeniem przepustowości, na którym utknęliśmy ... i niektórzy z moich znajomych używają około 1 TB miesięcznie, podczas gdy inni tylko kilka Mbs. Naprawdę chciałbym ograniczyć to na użytkownika równo.
loco41211,

Odpowiedzi:

13

Możesz użyć polecenia kształtowania ruchu „tc”.

Daj każdemu ze znajomych inny port do użycia dla BitTorrenta. Oznacz pakiety TCP za pomocą iptables dla każdego portu.

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

Następnie użyj polecenia tc, aby ustawić maksymalną przepustowość i szybkość dla każdego użytkownika.

Pod koniec miesiąca możesz usunąć i dodać polecenia „tc”, aby zresetować liczniki.

Możesz monitorować użycie dla każdego użytkownika poprzez:

tc filter show dev ethX

Jeśli korzystasz z instalacji brzegowej Debiana, bardzo łatwo jest kształtować ruch bez bałagania w iptables. Po prostu edytujesz tcdevices, tcclasses i tcrules w katalogu / etc / shorewall. Więcej informacji tutaj: http://www.shorewall.net/traffic_shaping.htm

Jak sugeruje druga osoba, oznaczanie pakietów według nazwy użytkownika jest prawdopodobnie lepsze niż według portu, w ten sposób porty można zmieniać bez aktualizacji iptables.

chris.moos
źródło
czy możesz podać przykład ustawienia limitu? Powiedz 100 GB przychodzących i wychodzących razem?
loco41211,
torrent może (i faktycznie jest) używać innych portów, więc przykład nie rozwiązuje problemu.
cstamas
który usuwa te dwie opcje jako rozwiązanie ...
loco41211,
cstamas: możesz ustawić jeden port lub wiele portów podczas korzystania z klienta bittorrent. patrz: dessent.net/btfaq/#ports
chris.moos
13

Możesz spróbować użyć --quotaopcji w iptables, która pozwala ustawić limit transferu w bajtach. Ponieważ używasz wielu klientów torrent, każdy pod inną nazwą użytkownika, możesz połączyć to z --uid-owneropcją, jak sugerowała Katriel.

W ten sposób możesz egzekwować limit transferu w określonym przedziale czasowym (dzień / tydzień / miesiąc / itd.) Bez konieczności ograniczania prędkości pobierania użytkowników.

Aby utrwalić liczniki pakietów, należy je okresowo zapisywać (na przykład przez zadanie cron), aby można je było przywrócić na wypadek konieczności ponownego uruchomienia serwera lub opróżnienia reguł zapory.

alemartini
źródło
brzmi jak by to działało. Tak więc za pomocą iptables mogę oznaczyć cały ruch przychodzący i wychodzący dla ustawionego użytkownika. I mogę to ograniczyć na określony czas. Nadal nie mogę zrozumieć, jak będzie wyglądała cała konfiguracja. Więc jakie jest dokładne polecenie, którego mógłbym użyć do oznaczenia ruchu przychodzącego i wychodzącego: „iptables -t mangle -A WYJŚCIE -p tcp -m właściciel --uid-owner jakiś użytkownik -j ZNAK - set-mark 100”? Lub jak mam to zrobić? Jakie byłoby na przykład polecenie oznaczenia nazwy użytkownika bob identyfikatorem 56 z miesięcznym limitem 100 GB? Wydaje mi się, że comiesięczne zadanie CRON zresetuje licznik ruchu?
loco41211,
12

Aby dodać powyższe pytanie.

Możesz użyć iptables z dopasowaniem użytkownika do pokolorowania pakietów w następujący sposób:

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

A następnie użyj „tc”, aby ograniczyć liczbę użytkowników.

katriel
źródło
Czy możesz podać przykład użycia tc do ustawienia limitu powiedzmy 100 GB dla nazwy użytkownika blablaX? A przykład kodu, który powinien zostać użyty do zresetowania limitu po miesiącu? Dziękuję
loco41211,
To ograniczy użytkownika na stałe, a nie na czas
katriel
8

W zależności od tego, ile miesięcznego ruchu chcesz dopuścić dla każdego użytkownika na miesiąc, możesz odpowiednio ustawić limit przepustowości, korzystając z niektórych narzędzi zasugerowanych przez innych użytkowników.

Załóżmy na przykład, że chcesz ustawić maksymalny limit pobierania wynoszący 250 GB / miesiąc . Teraz, jeśli podzielisz to przez liczbę godzin w miesiącu (~ 730), a następnie przez 3600, uzyskasz maksymalną prędkość pobierania, która w tym przykładzie wyniesie 100 KB / s .

Następnie, jeśli ustawisz maksymalną szybkość DL na 100 KB / s, automatycznie egzekwujesz limit pobierania 250 GB / miesiąc (zakładając oczywiście, że twój moduł do kształtowania ruchu działa poprawnie). Jeśli użytkownicy nie mogą pobierać szybciej niż 100 KB / s, nie będą mogli pobrać więcej niż 250 GB / miesiąc.

Aby ograniczyć szybkość pobierania, możesz użyć tcjednego z wymienionych narzędzi. Jeśli nie chcesz zajmować się bezpośrednio tc, możesz użyć cbq.init , który jest dość prosty w konfiguracji. Ten skrypt był obecny w shaperpakiecie Debian Etch , ale wydaje się, że został później usunięty. W każdym razie jest to prosty skrypt, który można pobrać z SourceForge.

Oczywiście to podejście może nie być przydatne w twoim przypadku (na przykład, jeśli chciałbyś, aby użytkownicy mogli pobierać z maksymalną dostępną prędkością, ale nadal egzekwować twój miesięczny limit, moja sugestia nie zadziałałaby).

mfriedman
źródło
Główny powód, dla którego używamy seedboxa zamiast po prostu torrentów na naszych komputerach, ponieważ jest on znacznie szybszy, więc niestety to nie rozwiązuje problemu ... W każdym razie dzięki
loco41211
7

wiem, że to jest stary post, ale nawet ja natknąłem się na niego, szukając dziś odpowiedzi i ostatecznie poskładałem coś, co działa idealnie dla mnie. Mam łącze wysyłające 25 Mb i łącze wysyłające 2,5 Mb, a 4 osoby i 5 serwerów dzielą się tym linkiem. z serwerami przepustowość łącza zwrotnego jest krytyczna, ale łącze zstępujące jest przydatne dla 4 osób, więc nikt tego nie zepsuje.

Używam centos 6.3 jako routera, ale te polecenia powinny działać na każdym systemie Linux. eth0 to moje łącze do dostawcy eth1 to moja sieć LAN za pomocą przełącznika 24-portowego i punktu dostępu Wi-Fi Ograniczam pobieranie do 5 z 25 Mb / s (około 500 KB / s) Ograniczam przesyłanie do 200 KB / s (około 25 KB / 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

następnie, aby ograniczyć użytkowników, używasz 2 linii iptables na użytkownika

aby ograniczyć przesyłanie:

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

ograniczyć pobieranie

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

wystarczy zmienić adres IP i porty eth, aby dopasować, kogo chcesz ograniczyć

BrierMay
źródło
3

Dla kompletności istnieje demon przestrzeni użytkownika o nazwie trickle. Można go użyć do ograniczenia przepustowości pojedynczego procesu. Użycie jest bardzo proste: np. W celu ograniczenia przepustowości używanej przez aptitude, możesz napisać: trickle -d 10 aptitude install wesnothPonieważ jednak działa przy użyciu LD_PRELOAD, może być łatwo zastąpiony przez użytkownika z dostępem do powłoki.

liori
źródło
Żaden z użytkowników oprócz mnie nie ma dostępu do powłoki. Ponadto, z ograniczeniem przepustowości mam na myśli miesięcznie lub określony okres czasu. Czy będzie to możliwe?
loco41211,
1
Nie, strumyk ogranicza prędkość jak na sekundę.
liori
2

Spójrz na useripacct jądra plastra (to faktycznie ma dość długą historię ). W dokumentacji dla starej wersji wydaje się, że zapewnia ona także egzekwowanie limitów, a także monitorowanie, a także możliwe jest dostarczenie własnych skryptów zasad.

Biorąc pod uwagę, że twórcy useripacct musieli skorzystać z poprawki jądra, aby uzyskać pożądane zachowanie, wydaje się mało prawdopodobne, aby domyślnie dostępna była prostsza metoda. Jedyną alternatywą wydaje się być ograniczenie przepustowości (przez coś takiego jak tc lub trickle), jak sugeruje większość innych odpowiedzi tutaj (ale tak naprawdę nie to, czego szukasz), lub utworzenie maszyny wirtualnej dla każdego użytkownika (przy użyciu lekkiej wirtualizacji systemu operacyjnego) przez coś takiego jak OpenVZ ) i rozliczanie ruchu na maszynę wirtualną (co jest dość łatwe do oszacowania przez coś takiego jak vnstat ). Wygląda to na przesadę (nagle masz kilka maszyn wirtualnych do administrowania zamiast jednego systemu).

czas
źródło
to trochę przesada, ponieważ spowodowałoby to wyczerpanie zasobów serwera .. ale dziękuję za pomysł!
loco41211,