Подводя итог: у меня есть выделенный сервер с несколькими друзьями, которые запускают торрент-клиент с веб-интерфейсом. Каждый пользователь запускает клиента под своим именем пользователя на сервере, поэтому загрузки идут в их каталог пользователя, и только они имеют доступ к своим файлам и т. Д.
Как я могу отслеживать и ограничивать пропускную способность в месяц для каждого пользователя?
Я думал, что должен быть способ использовать iptables. И путем мониторинга пропускной способности, используемой всеми процессами пользователя X. И если они использовали больше, чем их разрешенная ежемесячная пропускная способность Y ГБ, они получают сообщение о том, что и сеть блокируется для их торрент-клиента, или клиент полностью убит. Я также думал о squid, но, поскольку он будет использовать несколько торрент-клиентов, это может потребовать много ресурсов сервера ...
Я использую debian lenny.
Я не знаю, как это сделать ...
возможно ли это вообще? Я благодарен даже за частичное решение этого ...
Вы можете попробовать использовать --quota
опция в iptables, которая позволяет вам установить лимит передачи в байтах. Поскольку вы используете несколько торрент-клиентов, каждый под другим именем пользователя, вы можете комбинировать это с --uid-owner
вариант, как предложила Катриэль.
Таким образом, вы можете установить лимит передачи за период времени (день / неделя / месяц и т. Д.), Не ограничивая скорость загрузки ваших пользователей.
Чтобы сделать счетчики пакетов постоянными, вам нужно будет периодически сохранять их (например, с помощью задания cron), чтобы вы могли восстанавливать их в случае, если вам нужно перезагрузить сервер или сбросить правила брандмауэра.
Вы можете использовать команду формирования трафика tc.
Дайте каждому из ваших друзей другой порт для использования BitTorrent. Отметьте пакеты TCP с помощью iptables для каждого порта.
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
Затем используйте команду tc, чтобы установить максимальную пропускную способность и скорость для каждого пользователя.
В конце месяца вы можете удалить и добавить команды «tc» для сброса счетчиков.
Вы можете отслеживать использование каждого пользователя следующим образом:
tc filter show dev ethX
Если вы используете Debian install shorewall, это действительно упрощает формирование трафика, не вмешиваясь в iptables. Вы просто редактируете tcdevices, tcclasses и tcrules в каталоге / etc / shorewall. Больше информации здесь: http://www.shorewall.net/traffic_shaping.htm
Как предположил другой человек, маркировка пакетов по имени пользователя, вероятно, лучше, чем по порту, таким образом порты могут быть изменены без обновления iptables.
Просто чтобы добавить к вышеупомянутому вопросу.
Вы можете использовать iptables с пользовательским соответствием, чтобы раскрасить пакеты следующим образом:
iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner someuser -j MARK --set-mark 100
А затем используйте "tc" для ограничения на пользователя.
В зависимости от того, сколько ежемесячного трафика вы хотите разрешить каждому пользователю в месяц, вы можете установить соответствующий предел пропускной способности, используя некоторые инструменты, предложенные другими пользователями.
Например, предположим, что вы хотите установить максимальный лимит загрузки в 250 ГБ / месяц. Теперь, если вы разделите это на количество часов в месяце (~ 730), а затем на 3600, вы получите максимальную скорость загрузки, которая в этом примере будет 100 КБ / с.
Затем, если вы установите максимальную скорость DL 100 КБ / с, вы автоматически установите ограничение на загрузку 250 ГБ в месяц (при условии, конечно, что ваш формирователь трафика работает правильно). Если ваши пользователи не могут загружать быстрее 100 КБ / с, они не смогут загружать более 250 ГБ в месяц.
Чтобы ограничить скорость загрузки, вы можете использовать tc
или некоторые другие упомянутые инструменты. Если вы не хотите напрямую заниматься tc
, вы могли бы использовать cbq.init, который довольно просто настроить. Этот сценарий присутствовал в Debian Etch как shaper
пакет, но, похоже, после этого он был удален. В любом случае, это простой скрипт, который вы можете скачать с SourceForge.
Конечно, этот подход может быть бесполезен в вашем случае (например, если вы хотите, чтобы ваши пользователи могли загружать файлы с максимальной доступной скоростью, но при этом соблюдать ваш ежемесячный лимит, мое предложение не сработает).
Я знаю, что это старый пост, но даже я наткнулся на него в поисках ответов сегодня, и в конце концов я собрал воедино то, что идеально мне подходит. У меня есть нисходящий канал 25 Мбит / с и восходящий канал 2,5 Мбит / с, и есть 4 человека и 5 серверов, разделяющих эту ссылку. с серверами пропускная способность восходящего канала критична, но нисходящий канал полезен с 4 людьми, поэтому никто не возьмется за все.
Я использую centos 6.3 в качестве маршрутизатора, но эти команды должны работать на любом Linux. eth0 - мой аплинк к провайдеру. eth1 - моя локальная сеть через 24-портовый коммутатор и точку доступа Wi-Fi. Я ограничиваю загрузку до 5 из 25 Мбит / с (примерно 500 КБ / сек). Я ограничиваю загрузку до 200 Кбит (примерно 25 КБ / сек).
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
затем, чтобы ограничить пользователей, вы используете 2 строки iptables для каждого пользователя
чтобы ограничить загрузку:
iptables -t mangle -A POSTROUTING -o eth0 -p tcp -s 192.168.0.100 -j CLASSIFY --set-class 1:11
ограничить скачивание
iptables -t mangle -A POSTROUTING -o eth1 -p tcp -d 192.168.0.100 -j CLASSIFY --set-class 2:11
просто измените свой IP-адрес и порты eth в соответствии с тем, кого вы хотите ограничить
Для полноты картины существует демон пользовательского пространства, называемый trickle
. Его можно использовать для ограничения пропускной способности одного процесса. Использование очень простое: например, чтобы ограничить полосу пропускания, используемую aptitude, вы можете написать: trickle -d 10 aptitude install wesnoth
Однако, поскольку он работает с использованием LD_PRELOAD, его может легко переопределить пользователь с доступом к оболочке.
Взгляните на useripacct ядро патч (на самом деле это довольно длинный история). в документы для старой версии Похоже, что он также обеспечивает соблюдение квот, а также мониторинг, и также можно предоставить свои собственные сценарии политики.
Учитывая, что создателям useripacct пришлось прибегнуть к патчу ядра, чтобы получить желаемое поведение, маловероятно, что по умолчанию доступен более простой метод. Единственными альтернативами может быть ограничение пропускной способности (что-то вроде tc или trickle), как предлагается в большинстве других ответов здесь (но на самом деле не то, что вы ищете), или создание виртуальной машины для каждого пользователя (с использованием облегченной виртуализации ОС чем-то вроде OpenVZ) и учет трафика на виртуальную машину (что довольно легко оценить с помощью чего-то вроде vnstat). Хотя это кажется излишним (внезапно у вас есть куча виртуальных машин для администрирования вместо одной системы).