Ipfw розподіл швидкості internet (частина 1)

Минули часи, коли Інтернет був дуже дорогий і строго лімітованим. Зараз завдання стали іншими і на зміну обмежень кількості трафіку прийшла пора обмежувати швидкість каналу.

Напевно, всім знайома ситуація, коли будь-якої хитрий користувач в локалке "забивав" весь канал скачуванням торрентів або особливо тяжких файлів в декілька потоків. Ось і вирішив я стримати апетити таких несвідомих товаришів, розподіливши ширину Internet каналу "по справедливості", щоб ніхто нікому не заважав. У цьому нам допоможуть канали (pipe) фіктивною мережі DUMMYNET. Система, як і раніше, FreeBSD - звикайте до хорошого.

Втім, "справедливість" може бути різною, як в житті (усі рівні, але дехто рівніший). Досить передмов, для початку давайте визначимося що ж таке DUMMYNET.

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

Стало легше? Думаю немає, тому почнемо з самого початку.

Трохи теорії. Що таке pipe (канали) і queue (черги).

Уявити собі канали (pipe) в DUMMYNET найпростіше схематично:

Тут я зобразив два канали (pipe) - перший для вхідного трафіку зі швидкістю 3Mbit / s і другий для вихідного - 512Kbit / s, кожен з яких містить по дві черги (queue) з певними параметрами: ваговим коефіцієнтом (weight - від 1 до 100 ), відповідному пріоритету черзі і довжини черги (queue) в Q пакетів.

У правилах цю конструкцію можна описати таким чином:

ipfw pipe 1 config bw 3Mbit / s
ipfw pipe 2 config bw 512Kbit / s
ipfw queue 1 config pipe 1 weight 70 queue 20
ipfw queue 2 config pipe 1 weight 30 queue 20
ipfw queue 3 config pipe 2 weight 70 queue 20
ipfw queue 4 config pipe 2 weight 30 queue 20

Довжина черги в прикладах дорівнює 20 пакетам - queue 20. просто показати де це використовується і як виглядає. Чесно кажучи з цим параметром глибоко не розбирався, тому про розрахунки розмірів черг нічого сказати не можу, можете порозбирали самі і написати додаток до статті. В реальних задачах я цей параметр не використовував, тому що стільки тонка настройка мені без потреби.

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

Що нам дають ваги черг? Можна організувати пріоретізаціі трафіку, видаючи велику смугу каналу окремим протоколам або користувачам, або "душити" пропорційно певні IP. Тут ключове слово пропорційно, бо ніхто не зможе захопити канал цілком (коли всі користувачі мають однакові ваги - приклад такого налаштування я покажу в наступній статті).

Якщо ж необхідно виділити певний канал, із заданими параметрами, то тут необхідно створити окремий pipe під потрібне завдання з заданими параметрами. Вважаю, з теорією побудови каналів для розподілу швидкості Internet трохи розібралися. Можна приступати до вирішення поставленого на початку статті завдання - справедливого розподілу Internet каналу між усіма користувачами мережі.

Якщо вважаєте статтю корисною,
не лінуйтеся ставити лайки і ділитися з друзями.