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

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

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

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

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

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

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

8 ответов

Вы можете использовать команду '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.

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

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

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

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

Вы можете использовать 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-адрес и эти порты, чтобы соответствовать, кого вы хотите ограничить

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

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

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

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

Во-первых, наOUTPUTс использованиемownermatch, чтобы назначить метку соединения:

      iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 0x1/0x1

Во-вторых, ужеPREROUTINGотбросьте все, что имеет эту отметку и превышает установленную пропускную способность:

      iptables -t mangle -A PREROUTING -m connmark --mark 0x1/0x1 -m hashlimit --hashlimit-name merlin --hashlimit-above 1mb/second --hashlimit-burst 10mb -j DROP

hashlimitпри таком использовании без типа учитывается только общий трафик, поэтому общая входящая пропускная способность uid 1000 будет ограничена 1 МБ/с, но другие пользователи не будут ограничены.

Другие вопросы по тегам