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


32

Підводячи підсумок: у мене є виділений сервер з кількома друзями, який працює за торент-клієнтом із веб-gui. Кожен користувач працює на сервері під своїм іменем користувача, тому завантаження відбувається в користувальницькому режимі, і лише вони мають доступ до власних файлів тощо.

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

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

Я використовую debian lenny.

Я не впевнений, як це зробити ...

це було б можливо взагалі? Я вдячний навіть за часткові рішення цього питання ...


Ми могли б знати, яку ОС ви використовуєте.
Сем Коган

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

Як запропонувала інша особа, маркування пакетів за іменем користувача, ймовірно, краще, ніж через порт, таким чином порти можна змінювати без оновлення iptables.


ви можете навести приклад встановлення ліміту? Скажіть 100 Гб вхідних та вихідних разом?
loco41211

торрент може (і насправді є) використовувати інші порти, тому приклад насправді не вирішує проблему.
cstamas

що видаляє ці два варіанти як рішення ...
loco41211

cstamas: ви можете встановити один порт або декілька портів, використовуючи клієнт Bittorrent. дивіться це: dessent.net/btfaq/#ports
chris.moos

13

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

Таким чином, ви можете застосувати ліміт передачі за часовий період (день / тиждень / місяць / тощо), не обмежуючи швидкість завантаження користувачів.

Для того щоб зробити лічильники пакетів стійкими, вам доведеться періодично зберігати їх (наприклад, через роботу cron), щоб ви могли відновити їх у випадку, якщо вам потрібно перезавантажити сервер або очистити правила брандмауера.


це звучить як би це працювало. Тож за допомогою iptables я можу позначити весь трафік, що надходить і виходить для заданого користувача. І я можу обмежити це на встановлений часовий період. Я досі не можу розібратися, як буде створена вся програма. Тож точну команду, яку я міг би використати для позначення вхідного та вихідного трафіку: "iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner someuser -j MARK --set-mark 100"? Або як би я це зробив? Що, наприклад, командою було б позначити ім'я bob ідентифікатором 56 з місячним лімітом 100 Гб? Я здогадуюсь, що щомісячна робота в Cron може скинути лічильник трафіку?
loco41211

12

Просто додати до вищезазначеного питання.

Ви можете використовувати iptables зі збігом користувачів, щоб пофарбувати такі пакети:

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

А потім використовуйте "tc" для обмеження на основі кожного користувача.


Чи можете ви навести приклад того, як за допомогою tc встановити ліміт, наприклад, 100 Гб для імені користувача blablaX? І приклад коду, який слід використовувати для скидання ліміту через один місяць? Дякую
loco41211

Це обмежить користувача на постійній основі, а не на
часовій

8

Залежно від того, скільки щомісячного трафіку ви хочете дозволити кожному користувачу на місяць, ви можете встановити обмеження пропускної здатності відповідно, використовуючи деякі інструменти, запропоновані іншими користувачами.

Наприклад, скажімо, що ви хочете встановити максимальний ліміт завантаження в 250 Гб / місяць . Тепер, якщо поділити це на кількість годин у місяці (~ 730), а потім на 3600, ви отримаєте максимальну швидкість завантаження, яка в цьому прикладі склала б 100 Кб / с .

Тоді, якщо ви встановите максимальну швидкість DL в 100 Кб / с, ви автоматично будете застосовувати обмеження на завантаження в 250 ГБ / місяць (якщо, звичайно, якщо ваш формувач трафіку працює належним чином). Якщо ваші користувачі не можуть завантажувати швидше, ніж 100 КБ / с, вони не зможуть завантажувати більше 250 ГБ на місяць.

Щоб обмежити швидкість завантаження, ви можете скористатись tcчи іншими інструментами, які були згадані. Якщо ви не хочете мати справу безпосередньо tc, ви можете використовувати cbq.init , який налаштувати досить просто. Цей сценарій був присутній у Debian Etch як shaperпакет, але він, здається, був видалений після цього. У будь-якому випадку, це просто простий скрипт, який ви можете завантажити з SourceForge.

Звичайно, такий підхід може бути не корисним у вашому випадку (наприклад, якщо ви хотіли, щоб ваші користувачі могли завантажувати з максимальною доступною швидкістю, але все-таки застосовувати ваш обмежений обмеження, моя пропозиція не спрацює).


Основна причина, коли ми використовуємо насіннєвий ящик, а не просто торрент на наших ПК, тому що це набагато швидше, тому, на жаль, це не вирішує проблему ... Спасибі все одно
loco41211

7

Я знаю, що це стара публікація, але навіть я сьогодні натрапив на неї, шукаючи відповіді, і я врешті-решт зібрав разом щось, що ідеально працює для мене. У мене є 25Mbs низхідній лінії зв'язку та 2,5Mbs висхідній лінії зв'язку, і є 4 людини та 5 серверів, які діляться цим посиланням. із серверами пропускна здатність висхідної лінії зв'язку є критичною, але низхідна лінія корисна для чотирьох людей, тому ніхто не зависає.

Я запускаю 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, щоб вони відповідали тому, кого ви хочете обмежити


3

Для повноти існує демон, що називається демоном простору користувача trickle. Він може бути використаний для обмеження пропускної здатності одного процесу. Використання дуже просте: fe, щоб обмежити пропускну здатність, яка trickle -d 10 aptitude install wesnothвикористовується атрибутом, ви можете написати: Однак, оскільки він працює за допомогою LD_PRELOAD, користувач з доступом до оболонки може бути легко перекритий.


Ніхто з користувачів, окрім мене, не має доступу до оболонки. Також під обмеженням пропускної здатності я маю на увазі місяць або встановлений проміжок часу. Це було б можливо?
loco41211

1
Ні, струмка обмежує швидкість, як на секунду.
liori

2

Погляньте на патч ядра useripacct (це насправді має досить довгу історію ). У документах для старої версії, як видається, передбачено також виконання квот, а також моніторинг, а також можна надати власні сценарії політики.

Зважаючи на те, що авторам Useripacct довелося вдатися до патчу ядра, щоб отримати потрібну поведінку, мабуть, є більш простий метод, доступний за замовчуванням. Єдиними альтернативами можуть бути обмеження пропускної здатності (на кшталт tc або трюк), як це запропоновано більшістю інших відповідей тут (але насправді не те, що ви шукаєте), або створення VM для кожного користувача (з використанням легкої віртуалізації ОС через щось на кшталт OpenVZ ) та облік трафіку на одну машину (що досить легко оцінюється чимось на кшталт vnstat ). Це, здається, є надмірним (хоча раптом у вас є маса візків для адміністрування замість однієї системи).


це трохи надмірно, як це зцілить серверні ресурси .. але дякую за ідею!
loco41211
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.