Как я могу ограничить пропускную способность для каждого пользователя?

32

Подводя итог: у меня есть выделенный сервер с несколькими друзьями, использующими торрент-клиент с веб-интерфейсом. Каждый пользователь запускает клиент под своим именем пользователя на сервере, поэтому загрузки идут в его пользовательском каталоге, и только они имеют доступ к своим собственным файлам и т. Д.

Как я могу отслеживать и ограничивать пропускную способность в месяц для каждого пользователя?

Я думал, что должен быть способ использовать iptables возможно. И, следя за пропускной способностью, используемой всеми процессами пользователя X. И если они использовали больше, чем их месячная разрешенная пропускная способность Y ГБ, они получают сообщение о том, что для их торрент-клиента блокируется сеть, или клиент полностью убивается. Я также думал о Squid, но, учитывая, что он будет использовать несколько торрент-клиентов, это может использовать много ресурсов сервера ...

Я использую Debian Lenny.

Я не уверен, как это сделать ...

будет ли это вообще возможно? Я благодарен даже за частичные решения этого ...

loco41211
источник
Мы могли бы знать, какую ОС вы используете.
Сэм Коган
Debian. Добавлено в редактировании.
loco41211
просто любопытно, вы используете TorrentFlux?
cop1152
это одна из вещей, которые я пытаюсь. В настоящее время мы рассматриваем все, что можно использовать для семенного ящика с ограничением дискового пространства (для которого у нас есть решение) и ограничением пропускной способности, на котором мы застряли .... и некоторые из моих друзей используют около 1 ТБ в месяц, в то время как другие всего несколько мбс. Очень хотел бы ограничить это для каждого пользователя одинаково.
loco41211

Ответы:

13

Вы можете использовать команду '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 для установки shorewall, это действительно упрощает формирование трафика, не мешая iptables. Вы просто редактируете tcdevices, tcclasses и tcrules в каталоге / etc / shorewall. Более подробная информация здесь: http://www.shorewall.net/traffic_shaping.htm

Как предположил другой человек, маркировка пакетов по имени пользователя, вероятно, лучше, чем по порту, поэтому порты можно менять без обновления iptables.

chris.moos
источник
Не могли бы вы привести пример установки лимита? Скажите 100GB входящие и исходящие вместе?
loco41211
torrent может (и фактически использует) другие порты, поэтому пример не решает проблему.
cstamas
который удаляет эти два варианта как решение ...
loco41211
cstamas: вы можете установить один или несколько портов при использовании bittorrent-клиента. Посмотрите это: dessent.net/btfaq/#ports
chris.moos
13

Вы можете попробовать использовать --quotaопцию в iptables, которая позволяет вам установить лимит передачи в байтах. Поскольку вы используете несколько торрент-клиентов, каждый из которых имеет свое имя пользователя, вы можете комбинировать это с --uid-ownerопцией, как предложил katriel.

Таким образом, вы можете принудительно установить лимит передачи для периода времени (день / неделя / месяц / и т. Д.) Без ограничения скорости загрузки ваших пользователей.

Чтобы счетчики пакетов были постоянными, вам необходимо периодически их сохранять (например, с помощью задания cron), чтобы вы могли восстановить их в случае, если вам потребуется перезагрузить сервер или сбросить правила брандмауэра.

alemartini
источник
Похоже, это будет работать. Таким образом, с помощью iptables я могу пометить весь трафик, который приходит и уходит для заданного пользователя. И я могу ограничить его на определенный период времени. Я до сих пор не могу понять, как все это будет. Итак, является ли точная команда, которую я мог бы использовать для маркировки входящего и исходящего трафика: «iptables -t mangle -A ВЫХОД -p tcp -m владелец --uid-owner someuser -j MARK --set-mark 100»? Или как бы я это сделал? Что, например, будет команда пометить имя пользователя Боб с идентификатором 56 с месячным лимитом 100 ГБ? Я предполагаю, что ежемесячная работа cron обнулит счетчик трафика?
loco41211
12

Просто чтобы добавить на вышеупомянутый вопрос.

Вы можете использовать iptables с сопоставлением пользователей, чтобы раскрасить пакеты следующим образом:

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

А затем используйте «tc» для ограничения для каждого пользователя.

katriel
источник
Не могли бы вы привести пример того, как использовать tc для установки предела, скажем, 100 ГБ для имени пользователя blablaX? А пример кода, который следует использовать для сброса лимита через месяц? Спасибо
loco41211
Это ограничит пользователя на постоянной основе, а не на установленной квоте
katriel
8

В зависимости от того, сколько ежемесячного трафика вы хотите разрешить для каждого пользователя в месяц, вы можете соответственно установить ограничение пропускной способности, используя некоторые инструменты, предложенные другими пользователями.

Например, допустим, вы хотите установить максимальный лимит загрузки в 250 ГБ / месяц . Теперь, если вы поделите это на количество часов в месяце (~ 730), а затем на 3600, вы получите максимальную скорость загрузки, которая в этом примере составит около 100 КБ / с .

Затем, если вы установите максимальную скорость DL 100 КБ / с, вы автоматически обеспечите ограничение загрузки 250 ГБ / месяц (при условии, конечно, что ваш формирователь трафика работает правильно). Если ваши пользователи не могут загружать быстрее, чем 100 КБ / с, они не смогут загружать более 250 ГБ / месяц.

Для того, чтобы ограничить скорость загрузки, вы можете использовать tcили некоторые другие инструменты, которые были упомянуты. Если вы не хотите иметь дело напрямую tc, вы можете использовать cbq.init , который довольно прост в настройке. Этот скрипт присутствовал в Debian Etch как shaperпакет, но, похоже, после этого он был удален. В любом случае, это простой скрипт, который вы можете скачать с SourceForge.

Конечно, этот подход может оказаться бесполезным в вашем случае (например, если вы хотите, чтобы ваши пользователи могли загружать файлы с максимально доступной скоростью, но при этом применяли свой месячный лимит, мое предложение не сработало).

mfriedman
источник
Основная причина, по которой мы используем вместо этого
семенную коробку
7

я знаю, что это старый пост, но даже я наткнулся на него, ища ответы сегодня, и в конце концов я собрал то, что идеально подходит для меня. У меня есть нисходящий канал 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-адрес и эти порты, чтобы соответствовать, кого вы хотите ограничить

BrierMay
источник
3

Для полноты, есть демон userpace под названием trickle. Его можно использовать для ограничения пропускной способности отдельного процесса. Использование очень простое: например, чтобы ограничить пропускную способность, используемую aptitude, вы можете написать: trickle -d 10 aptitude install wesnothОднако, поскольку он работает с использованием LD_PRELOAD, он может быть легко переопределен пользователем с доступом к оболочке.

liori
источник
Никто из пользователей, кроме меня, не имеет доступа к оболочке. Кроме того, с ограничением пропускной способности я имею в виду за месяц или установленный период времени. Это будет возможно?
loco41211
1
Нет, ручеек ограничивает скорость как в секунду.
Лиори
2

Посмотрите на useripacct ядра патча (это на самом деле имеет достаточно длинную историю ). В документах для старой версии, по- видимому, также предусмотрены контроль за квотами и мониторинг, а также возможно предоставление собственных сценариев политики.

Поскольку создателям useripacct пришлось прибегнуть к исправлению ядра, чтобы получить желаемое поведение, маловероятно, что по умолчанию доступен более простой метод. Единственными альтернативами может быть ограничение пропускной способности (например, tc или trickle), как предлагается в большинстве других ответов здесь (но не на самом деле то, что вы ищете), или создание виртуальной машины для каждого пользователя (с использованием упрощенной виртуализации ОС). чем-то вроде OpenVZ ) и учета трафика на виртуальную машину (что довольно просто оценивается чем-то вроде vnstat ). Хотя это кажется излишним (внезапно у вас появляется куча виртуальных машин для администрирования вместо одной системы).

timday
источник
это немного излишне, так как это истощило бы ресурсы сервера .. но спасибо за идею!
loco41211