Управління трафіком за допомогою ALTQ

ALTQ  – Це скорочення поняття альтернативного обслуговування, вельми гнучкого механізму управління мережевим трафіком, який існував в самостійному вигляді

до того, як був включений в PF на OpenBSD1 У OpenBSD ALTQ був інтегрований

Хеннингом Брауером в код PF починаючи з релізу OpenBSD 33, включаючи його конфігурацію в pfconf, оскільки мало сенс обєднати його саме з пакетним фільтром Порти PF для інших BSD систем послідували цьому прикладу, внісши ряд деяких додаткових інтеграцій ALTQ

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

доступні в обмежених кількостях Зазвичай, ресурси доступні з жорстким

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

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

Черги виділяють певну частину із смуги пропускання, а іноді і ієрархічний пріоритет У даному контексті, пріоритет є показником переваг того, яку чергу необхідно обслуговувати в найкоротші терміни Деякі черги можуть налаштовуватися в поєднанні виділення смуги пропускання і пріоритету У подальшому уточненні, ми розглянемо деякі типи черг, в яких ви зможете виділити частину пропускної здатності черги в підчерги або створити черги в чергах, які претендуватимуть на частку ресурсів батьківських черг

Після визначення черги ви інтегруєте формування трафіком в ваш набір правил, переписавши свої правила пропуску або правила відповідності для призначення

трафіку на зазначені черги

В установках ALTQ, будь-який трафік який ви явно не призначали в спецфічную чергу, ставиться в чергу за замовчуванням

У мережі налаштованої за замовчуванням, без використання черг в стилі ALTQ, стек TCP / IP і його підсистема фільтрації обробляють пакети в порядку їх надходження на інтерфейс Це те, що зазвичай називається дисципліною першим увійшов-першим вийшов (FIFO) Черги ALTQ можуть бути налаштовані на абсолютно різну поведінку, іноді привносячи вражаючий ефект Кожен з трьох алгоритмів розкладу (Планувальника) або дисципліни пропонує свої власні унікальні набори опцій Ці типи відомі як priq, cbq і hfsc

•&nbsp&nbsp&nbsp&nbsp priq – Черги засновані на пріоритетах визначаються виключно з точки зору встановлених пріоритетів у загальній смузі пропускання Для черг типу priq допускається діапазон установки Пріоріті від 0 до 15, де більше значення має більш пріоритетний режим Пакети які відповідають критеріям вищого пріоритету обслуговуються швидше ніж пакети відповідні низькому пріоритету

•&nbsp&nbsp&nbsp&nbsp cbq – Черги засновані на класах визначають постійну оренду пропускної здатності, як відсоток від загальнодоступною або в одиницях кілобіт, мегабіт або гігабіт на секунду Черги cbq можуть розділятися на черзі, яким призначається пріоритет у діапазане від 0 до 7, з тим же умовою, що високий пріоритет обслуговується в першу чергу Пакети находтся в черзі поки доступна смуга пропускання Для черг, які поділяються на черзі з пріоритетом і асигнуванням пропускної здатності, пакети відповідають критеріям більш високого пріоритету обслуговуються швидше

•&nbsp&nbsp&nbsp&nbsp hfsc  – Дисципліна hfsc використовує алгоритм Hierarchical Fair Service Curve забезпечує справедливе розподіл смуги пропускання для черг в ієрархії hfsc дозволяє створювати режим черги з гарантованим мінімальним виділенням смуги і жорсткими верхніми лімітами Ви можете асигнування смуги пропускання, яке може змінюватися з плином часу і пріоритет в діапазоні від 0 до 7

• Обидва алгоритми і відповідні установки досить складні і мають безліч параметрів, що настроюються З цієї причини, більшість практичних використань ALTQ дотримується простих типів черг Однак ті хто розуміє hfsc практично моляться ім

(Трохи сумбурно вийшло, а може так і написано спочатку, тому наведу більш простий опис типів черг яке мається на Вікіпедії:

•&nbsp&nbsp&nbsp&nbsp CBQ Class Based Queueing Черги, приєднані до інтерфейсу, створюють дерево Таким чином, у кожної черги можуть бути подальші дочірні черги У кожної черги можуть бути пріоритет і привласнена пропускна здатність Пріоритет, головним чином, управляє часом, за яке пакети будуть відіслані, в той час як інші будуть чекати своєї черги За рахунок цього регулюється пропускна здатність

•&nbsp&nbsp&nbsp&nbsp PRIQ Priority Queueing У цих черг не може бути дочірніх черг Кожній черзі привласнюється унікальний пріоритет, в межах від 0 до 15 Пакети з вищою номером мають вищий пріоритет

•&nbsp&nbsp&nbsp&nbsp HFSC Hierarchical Fair Service Curve У батьківській черги визначається сумарна пропускна здатність для всіх черг інтерфейсу Вказується загальна пропускна здатність, що надається провайдером і не залежить від швидкості мережевого інтерфейсу У дочірній черги ця директива визначає максимальну швидкість передачі інформації в бітах, яка буде оброблена чергою в будь-який момент )

Включення ALTQ для використання логіки черг у вашому наборі правил, вам можуть знадобитися додаткові кроки, що залежать від того яку операційну систему ви використовуєте

На OpenBSD, всі підтримувані дисципліни черг зібрані в ядра GENERIC і GENERICMP Для конфігурації вам необхідно тільки відредагувати ваш pfconf

На FreeBSD вам необхідно перевірити що ваше ядро ​​скомпільовано з підтримкою опцій дисциплін черг За замовчуванням, ядро ​​FreeBSD GENERIC на включає опцію

ALTQ, і ви можете помітити це переглядаючи повідомлення виведені при запуску

скрипта / etc / rcd / pf при включенні PF Відповідні опції з перерахованих нижче:

options ALTQ

options ALTQ_CBQ # Class Bases Queuing (CBQ) options ALTQ_RED # Random Early Detection (RED) options ALTQ_RIO # RED In/Out

options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC) options ALTQ_PRIQ # Priority Queuing (PRIQ)

options ALTQ_NOPCC # Required for SMP build

Опції ALTQ необхідні для включення ALTQ в ядрі На SMP системах, вам також необхідна опція ALTQ_NOPCC Залежно від типу черги який ви плануєте використовувати, вам необхідно включити по меншій мере один з типів ALTQ_CBQ, ALTQ_PRIQ, або ALTQ_HFSC Нарешті, ви можете включити технологію ухилення від перевантаження (congestion-avoidance techniques) Random Early Detection (RED) і RED In / Out спільно з опціями ALTQ_RED і ALTQ_RIO, відповідно Зверніться до хендбуку FreeBSD для отримання інформації про компіляції та установки власного ядра з даними опціями

ALTQ був інтегрований у реалізацію PF NETBSD 40 і підтримується в NetBSD 40 і пізніших релізах Ядро NetBSD GENERIC використовується за умовчанням не включає підтримки опцій повязаних з ALTQ Однак, файл конфігурації GENERIC поставляється з усіма відповідними варіантами необхідних опцій, закоментувавши для простоти включення Нижче наведені основні параметри ядра:

options ALTQ # Manipulate network interfaces output queues options ALTQ_CBQ # Class-Based Queueing

options ALTQ_HFSC # Hierarchical Fair Service Curve options ALTQ_PRIQ # Priority Queueing

options ALTQ_RED # Random Early Detection

Опції ALTQ необхідні для включення ALTQ в ядрі Залежно від типу черги який ви плануєте використовувати, вам необхідно включити щонайменше один з типів ALTQ_CBQ, ALTQ_PRIQ, або ALTQ_HFSC

Використання ALTQ вимагає компіляції PF в ядро Завантажувані модулі ядра повязані з PF не підтримують функціонал ALTQ Для отримання більш актуальної інформації слід звернутися до документації PF для NetBSD за адресою http://wwwnetbsdorg/ Documentation / network / pfhtml

Зараз ми будемо розглядати приклади встановлення трьох різних типів черг ALTQ: заснованих на пріоритеті, заснованих на класах і HFSC

Основний синтаксис PF для черг ALTQ схожий на наступний:

altq on interface type [options .. ] main_queue { sub_q1, sub_q2 .} queue sub_q1 [ options .. ]

queue sub_q2 [ options .. ] { subA, subB, .. } [..]

pass [ .. ] queue sub_q1 pass [ .. ] queue sub_q2

Зверніть увагу, що черги cbq і hfsc можуть мати кілька рівнів підчерги Черги priq можна назвати плоскими, оскільки вони мають тільки черга одного рівня Ми будемо розглядати специфіку синтаксису для кожного типу в наступних розділах

Фактично, для черг може бути важко визначити корисну пропускну здатність конкретної інтерфейсу Якщо ви не вкажете загальну пропускну здатність, вона буде використана при розрахунку асигнувань Однак, деякі типи інтерфейсів не гарантують надання вірної інформації про фактичному значенні смуги пропускання Одним з поширених прикладів такої розбіжності явлется 100 Мбіт Ethernet-інтерфейс, у додатку до лінії DSL, яка, фактично дозволяє тільки 8Мбіт дл скачування і 1 Мбіт для завантаження * Ethernet-інтерфейс може повідомити вам про 100Мбіт пропускної здатності, без урахування значень DSL

Тому, і як правило, має сенс встановити загальну пропускну здатність для фіксованого значення На жаль, використовуване значення не буде саме тим, про який вам каже постачальник каналу завжди присутні деякі накладні витрати, мінливі в невеликих межах залежно від технологій та реалізації каналу У типових каналах TCP / IP Ethernet, накладні витрати досить низькі TCP / IP через ATM накладні витрати будуть набагато вище і можуть становити майже 20% Якщо інформація про пропускну здібності не надана постачальником каналу, вам доведеться зробити обгрунтоване припущення її початкового значення У будь-якому випадку, ви повинні гостро усвідомлювати, що доступна загальна пропускна здатність ніколи не перевищує пропускну здатність самого слабкого линка (каналу) в вашому мережевому маршруті

Черги підтримуються тільки для вихідних зєднань системи При плануванні керування смугою пропускання, ви повинні розглядати фактичну корисну пропускну здатність відповідну самому вузькому лінком на шляху зєднання, навіть якщо ваші черги налаштовані на різних інтерфейсах

* Ці цифри реальні зараз через кілька років вони можуть здатися дивними, якщо не смішними

Базові концепції черги заснованої на пріоритеті (priq) досить прості, і можливо навіть, є найпростішими для розуміння Загальна смуга пропускання розподіляється в основну чергу, і головне значення має пріоритет трафіку Ви визначаєте значення пріоритету в діапазоні від 0 до 15, де найбільш високе значення відповідає більш пріоритетному трафіку

З метою практичного прикладу звернемося до Даніелю Хартмееру Він виявив простий, але дуже ефективний спосіб поліпшення пропускної спроможності для власної мережі

використовуючи ALTQ Як і багато інших, Даніель використовував домашнє зєднання по

асиметричною лінії з досить низькою пропускною здатністю, і відчував сильне бажання поліпшити використання доступної смуги пропускання Крім того, коли лінія практично повністю завантажена, починають зявлятися деякі дивацтва Одна з особливостей вказує на можливості поліпшення – вхідний трафік (скачування, вхідна пошта та ін) сповільнюється диспропорційно всякий раз, коли виникає вихідний трафік – більш ніж можна було б пояснити передачею сирих даних Це повертає нас до базових особливостям TCP

Коли відсилається пакет, відправник очікує підтвердження (у вигляді пакету ACK) від приймаючої сторони, і чекає його прибуття деякий, певний час Якщо ACK не приходить протягом заданого інтервалу часу, відправник вважає, що пакет не був отриманий і відправляє пакет повторно Проблема полягає в тому, що в налаштуваннях за замовчуванням, пакети обслуговуються послідовно, по мірі їх надходження на інтерфейс Це неминуче означає, що пакети ACK, що практично не мають корисного навантаження, чекатимуть у черзі, в той час як передаються великі пакети даних

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

ext_if=&quotkue0&quot

altq on $ext_if priq bandwidth 100Kb queue { q_pri, q_def } queue q_pri priority 7

queue q_def priority 1 priq(default)

pass out on $ext_if proto tcp from $ext_if queue (q_def, q_pri) pass in on $ext_if proto tcp to $ext_if queue (q_def, q_pri)

Тут, чергу заснована на пріоритеті встановлюється на зовнішньому інтерфейсі з

двома підлеглими чергами Перша підчерги, q_pri, має більше значення пріоритету – значення 7 інша підчерги (q_def) має значно нижчий пріоритет – значення 1 Цей, здавалося б вельми простий набір правил працюючий за рахунок використання ALTQ обробляє черзі з різними пріоритетами Як тільки зєднання призначається в основну чергу, ALTQ перевіряє тип кожного пакета по полю типу сервісу (ToS) Пакети ACK містять біт затримки ToS встановлений в низьке значення (low), який говорить про те, що відправник хотів якнайшвидшої доставки пакета Коли ALTQ бачить пакет з низькою затримкою (low-delay), і доступні черзі з різними пріоритетами, він призначає пакет в високопріоритетні чергу Це означає, що пакети ACK відразу передаються в чергу з більш низьким пріоритетом і доставляються швидше, а це, в свою чергу означає, що пакети даних обслуговуються швидше

Кінцевим результатом є те, що така конфігурація забезпечує кращу продуктивність ніж чиста конфігурація FIFO на тому ж обладнанні і з тією ж смугою пропусканія2

У попередньому прикладі, набір правил був побудований традиційним чином, з призначенням черги як частини пропускає правила Проте це не

єдиний спосіб призначення черги Використання правил відповідності (match)

(Доступних в OpenBSD 46 і старше) дозволяє легко модифікувати цей простий режим пріоритетних черг в існуючому наборі правил

Якщо ви працюєте грунтуючись на прикладах глав 3 і 4, ймовірно, що ваш набір правил вже включає правило match, яке використовується для nat-to вихідного трафіку Якщо ви хочете використовувати черзі засновані на пріоритетах в своєму наборі правил, ви можете почати з додавання визначення черги та внесення некоторох незначних коригувань у вихідні правила match

Почніть з визначення черги з попереднього прикладу, і настройки загальної пропускної здатності відповідно до локальних умовами як у наступному прикладі:

altq on $ext_if priq bandwidth $ext_bw queue { q_pri, q_def } queue q_pri priority 7

queue q_def priority 1 priq(default)

Це дозволяє визначити макрос ext_bw для розподілу смуги пропускання на всі черги Самий простий і швидкий спосіб інтеграції черг в набір правил полягає в редагуванні вихідного правила match приблизно в наступному вигляді:

match out on $ext_if from $int_if:network nat-to ($ext_if) queue (q_def, q_pri)

Перезавантажте ваш набір правил, та пріоритетні черги будуть застосовані до всього трафіку ініційованому в локальній мережі ви можете використовувати команду systat для отримання живого огляду призначення трафіку черг

$ sudo systat queues

Результат виглядає приблизно так:

2 users Load 039 027 030 Fri Apr 1 16:33:44 2011

QUEUE  BW  SCH  PR PKTS  BYTES  DROP_P DROP_B QLEN BORROW SUSPE P/S B/S

q_pri

priq

7   21705 1392K    0

0

0

12 803

q_def

priq

12138 6759K    0

0

0

9 4620

Розглядаючи цифри в колонках PKTS (пакети) і BYTES, ви чітко бачите, що черги працюють саме так, як було задумано Черга q_pri обробляє досить значна кількість пакетів в обсязі даних, як власне і очікувалося Пакети ACK не займають багато місця З іншого боку, трафік призначений у чергу q_def

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

systat є програмою властивої всім BSD системам, а версія використовувана в OpenBSD пропонує кілька варіантів представлення інформації, що має відношення до PF, які відсутні в systat інших систем Ми повернемося до використання systat в наступному розділі У теж час, вам слід вивчити посібник з роботи з цією програмою і спробувати її Це вельми корисний інструмент для знайомства з вашою системою

Джерело: Книга про PF, by Peter NM Hansteen, Переклад виконав Михайлов Олексій aka iboxjo

Схожі статті:


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

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*