Налаштування Шейпера htb на офісному маршрутизаторі на базі linux за допомогою - by - блог олександра

Вирішив написати невелике HOWTO по налаштуванню Шейпера HTB на маршрутизаторі (роутере) на базі Linux за допомогою скрипта htb.init. Завдання наступна: є офісна мережа, є підключення до мережі Інтернет на певній швидкості, в розглянутому випадку це 20 мегабіт вхід і 5 мегабіт результат, швидкість потрібно поділити рівнозначно між офісними комп'ютерами, але в разі коли канал не завантажений - дати можливість працювати на максимальній швидкості . В даному HOWTO Шейп буде не тільки входить, але і вихідний трафік, причому підключення до Інтернет здійснюється за PPP, що накладає деякі нюанси на настройку.

Налаштування приведена на прикладі дистрибутива CentOS (RHEL, Fedora), для Debian (Ubuntu) будуть теж наведені пояснення, так як деякі системні утиліти відрізняються.

Для початку потрібно завантажити і налаштувати сам скрипт побудови правил Шейпера, даю приклад не на оригінальний скрипт, а на модифікований мною (виправлено декілька помилок, додано видалення кешу при перезапуску Шейпера, т. К. Буває в кеші залишаються записи, яких вже немає в конфігураційних файлах, версія 0.8.4):

Скрипт завантажений, зроблений запускаються, симлінк поміщений куди потрібно, тепер потрібно включити його в автозавантаження, для CentOS (RHEL, Fedora):

Те ж для Debian (Ubuntu):

Далі потрібно створити каталоги для файлів конфігурації Шейпера:

Далі файл опису кореневого класу інтерфейсу, вказується фізична швидкість інтерфейсу, в даному випадку це 100 мегабіт.

Спочатку необхідно нарізати швидкість для трафіку, що виходить з самого роутера, наприклад якщо на ньому встановлений файл-сервер, можна дати швидкість більшу ніж в Інтернет, причому ця швидкість не вплине на швидкість роботи в мережі Інтернет. 100 - 20 мегабіт, ну і 10 можна залишити на службові пакети і т. П. Щоб не утворилася планка (повне завантаження інтерфейсу), і робота залишалася комфортною, виходить 70 мегабіт. Швидкість з файл-сервера можна теж рівномірно поділити між учасниками мережі, але в даному прикладі це опускається.

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

Той трафік, який не потрапив в попередні правила - Шейп на швидкості 1 мегабіт.

Тепер вихідний трафік. В принципі те ж саме, інтерфейс ppp0, швидкість 5 мегабіт, трафік не потрапив під правила дається 128 кілобіт (останній файл), останнім від 512 кілобіт до 5 мегабіт. Трафік з роутера також буде Шейп.

Тепер про мітки. У iptables потрібно позначити вихідний трафік, робиться це таким правилом в таблиці mangle:

Для кожного комп'ютера - своє правило. У CentOS (RHEL, Fedora) правила фаєрволла зазвичай знаходяться в файлі / etc / sysconfig / iptables. після правки потрібно застосувати зміни командою:

В Debian (Ubuntu) можна зробити так. Зняти поточну конфігурацію в файл:

Поправити і застосувати:

Дані команди працюють і в CentOS (RHEL, Fedora), якщо потрібні. Далі. Налаштування закінчена, тепер потрібно перевірити правильність нашої конфігурації:

Якщо помилок немає - буде видно що ж побудував скрипт htb.init для системи на основі файлів конфігурації. Тепер можна запустити шейпер:

Файл потрібно зробити запускаються:

Запускатися він буде по cron, кожну хвилину, для цього в файлі / etc / crontab додаються такі рядки:

Вітаю! не могли б ви підказати настройки, конфігурація мережі така, eth0 інтерфейс дивиться в світ 1.5 мегабіт, eth1 = 1Gbit шлюзом в локальну мережу 192.168.2.100, eth2 = 1Gbit шлюзом 192.168.2.99, є 2 види користувачів, на eth1 звертаються інтернет користувачі без обмежень на ресурси в 1Mbit, а на шлюз eth2 клієнти онлайн ігор в 512Kbit з доступом тільки по портам ігор і не будь сторінок, локалка з 30 машин в одній підмережі

Яка у вас ширина зовнішнього каналу? Скільки зазначено в кореневому класі RATE? І взагалі які швидкості у вас прописані CEIL і RATE в кореневому класі і в індивідуальних? Бо якщо у вас негарантована CEIL = 512Kbit у всіх, і кореневої (загальний) клас теж на 512, то все правильно, швидкість повинна буде поділитися пропорційно на двох / трьох і т. П. Клієнтів в залежності від їх кількості.

Подивіться уважно мій приклад, там в кореневому класі прописана максимальна швидкість каналу, а в клієнтських вже прописаний цей максимум в негарантованої швидкості CEIL, а гарантована швидкість вже пишеться в RATE.

ситуація така:
роутер, fc14, 2 інтерфейси, eth0 - дивиться в бік клієнтів, IP = 172.20.10.1, мережа 172.20.10.0/24
інтерфейс eth1 - виділений канал в інтернет, білий IP

в каталозі / etc / sysconfig / htb слід. файли:
eth0:
DEFAULT = 9

eth0-2: 9.default:
RATE = 256Kbit
PRIO = 5
LEAF = sfq

eth1-2: 9.default:
RATE = 256Kbit
PRIO = 5
LEAF = sfq

і робиться
/ Etc / sysconfig / htb restart

При відключенні клієнта цей файл видаляється.

Швидкість у клієнта при цьому замість 512 всього 256.
Що я ще забув зробити?

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

tc -s class show dev eth0

Повинен бути по-перше клас для даного правила, по-друге повинні бути пакети в лічильниках, ну і скинуті пакети при перевищенні ліміту швидкості.

клас є, лічильники порожні:

class htb 1: 9 parent 1: 2 leaf 9: prio 5 rate 256000bit ceil 256000bit burst 1600b cburst 1600b
Sent 10920 bytes 174 pkt (dropped 0, overlimits 0 requeues 0)
rate 2128bit 4pps backlog 0b 0p requeues 0
lended: 174 borrowed: 0 giants: 0
tokens: 765641 ctokens: 765641

class htb 1: 2 root rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
Sent 10920 bytes 174 pkt (dropped 0, overlimits 0 requeues 0)
rate 2128bit 4pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 1969 ctokens: 1969

> Cat / etc / sysconfig / htb / eth0-2: 5: 1010
CEIL = 5Mbit
RATE = 512Kbit
LEAF = sfq
PRIO = 5
RULE = 172.20.10.10

І tcpdump -nni eth0 dst host 172.20.10.10 трафік показує?

Явно не потрапляє трафік в правило, тому і не Шейп, може інтерфейси або вхід / вихід плутаєте?

RULE = 172.20.10.10 - вказує dst host, а ось
RULE = 172.20.10.10, - вказує src host

нда ...
все виявилося набагато гірше ...
ті цифри швидкості що я приводив виявилися для вихідного трафіку (міряв iperf-му, він струму до сервера міг достукатися, в зворотну - ніяк)
так що виходить так - вихідна швидкість регулюється значення у файлі eth1-2: 9.default.
Ну що виходить мене поки що не хвилює, а ось що входить завжди однакова і дорівнює 128кбіт / с, що б я не робив ...
пішов вішатися

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

Бачу ви людина розбирається. Налаштовував даную схему через tc, весь трафік чомусь прямував в дефолтний клас, що б я в фільтрі писав. Знайшов цю інструкцію, зделал все як на малюнку. Все одно весь трафік йде в дефолтний клас. В чому може бути проблема? Дистрибутив Ubuntu 10.04

Переробив заново, в надії що де то все таки помилився. Проблема залишилася, якщо не важко ткніте пальцем куди копати)

compile відображає таке:

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1 htb default 9

tc class add dev eth0 parent 1: classid 1: 2 htb rate 100Mbit

tc class add dev eth0 parent 1: 2 classid 1: 4 htb rate 90Mbit prio 4
tc qdisc add dev eth0 parent 1: 4 handle 4 sfq perturb 10
tc filter add dev eth0 parent 1: 0 protocol ip prio 100 u32 match ip src 192.168.0.0/24 classid 1: 4

tc class add dev eth0 parent 1: 2 classid 1: 5 htb rate 100Kbit prio 5

tc class add dev eth0 parent 1: 5 classid 1: 1010 htb rate 50Kbit ceil 100Kbit prio 5
tc qdisc add dev eth0 parent 1: 1010 handle 1010 sfq perturb 10
tc filter add dev eth0 parent 1: 0 protocol ip prio 100 u32 match ip dst 10.8.0.10 classid 1: 1010

tc class add dev eth0 parent 1: 5 classid 1: 1011 htb rate 50Kbit ceil 100Kbit prio 5
tc qdisc add dev eth0 parent 1: 1011 handle 1011 sfq perturb 10
tc filter add dev eth0 parent 1: 0 protocol ip prio 100 u32 match ip dst 10.8.0.11 classid 1: 1011

tc class add dev eth0 parent 1: 2 classid 1: 9 htb rate 20Kbit prio 5
tc qdisc add dev eth0 parent 1: 9 handle 9 sfq perturb 10

Перенастроювання всетаки допомогла, заодно знайшов помилку в рядку
tc filter add dev eth0 parent 1: 0 protocol ip prio 100 u32 match ip src 192.168.0.0/24 classid 1: 4
А у мене ж мережу 10.8.0.0/16 🙂

Велике спасибі за статтю Олександр.

🙂 нема за що, значить просто прикра помилка ...

Качає але жорстко по RATE, в чому може бути косяк?

Ось як у мене виглядає користувач:

RATE = 1Mbit
CEIL = 10Mbit
PRIO = 5
LEAF = sfq
RULE = 10.8.0.10

Висновок Компільо в минулому повідомленні.

Ні, спочатку дає швидкість ближче до CEIL, через кілька секунд опускається до RATE, і тому не піднімається (

У вас загальна швидкість вказана в 100 кілобіт:

tc class add dev eth0 parent 1: 2 classid 1: 5 htb rate 100Kbit prio 5

А далі ви роздає гарантованих 50, негарантованих 100 (кілобіт). Не знаю навіщо вам такі «високі швидкості» :), але у вас описано 3 клієнта, хоча 2 вже можуть забити загальну смугу до планки. А таку смугу забити дуже легко. Думаю що так і відбувається. І це ще добре що швидкість падає тільки до rate а не ще нижче.

Я для тесту ставив такі швидкості, а то не було на чому потреніроватся)

А коли вирішив що то серйозне здолати, не змінив заг. швидкість, ще раз спасибі)

Добридень! Підкажіть що не так роблю:
інтерфейс в локалку eth0, eth1 до провайдера, піднімається ppp0 для інету.
Все налаштував по мануалу, що не Шейп хоч убий

/ Sbin / tc qdisc del dev eth0 root
/ Sbin / tc qdisc add dev eth0 root handle 1 htb default 9

/ Sbin / tc qdisc del dev ppp0 root
/ Sbin / tc qdisc add dev ppp0 root handle 1 htb default 9

/ Sbin / tc class add dev eth0 parent 1: 2 classid 1: 4 htb rate 100Mbit prio 4
/ Sbin / tc qdisc add dev eth0 parent 1: 4 handle 4 sfq perturb 10
/ Sbin / tc filter add dev eth0 parent 1: 0 protocol ip prio 100 u32 match ip dst 192.168.0.0/16 classid 1: 4

/ Sbin / tc class add dev eth0 parent 1: 5 classid 1: 1002 htb rate 512Kbit ceil 1Mbit prio 5
/ Sbin / tc qdisc add dev eth0 parent 1: 1002 handle 1002 sfq perturb 10
/ Sbin / tc filter add dev eth0 parent 1: 0 protocol ip prio 100 u32 match ip dst 192.168.0.11 classid 1: 1002

/ Sbin / tc class add dev eth0 parent 1: 2 classid 1: 9 htb rate 512Kbit prio 5
/ Sbin / tc qdisc add dev eth0 parent 1: 9 handle 9 sfq perturb 10

/ Sbin / tc class add dev ppp0 parent 1: 2 classid 1: 5 htb rate 5Mbit prio 5

/ Sbin / tc class add dev ppp0 parent 1: 5 classid 1: 1001, htb rate 512Kbit ceil 5Mbit prio 5
/ Sbin / tc qdisc add dev ppp0 parent 1: 1001, handle 1001 sfq perturb 10
/ Sbin / tc filter add dev ppp0 parent 1: 0 protocol ip prio 200 handle 1001 fw classid 1: 1001,

/ Sbin / tc class add dev ppp0 parent 1: 2 classid 1: 9 htb rate 128Kbit prio 5
/ Sbin / tc qdisc add dev ppp0 parent 1: 9 handle 9 sfq perturb 10

Пакети маркував:
Chain PREROUTING (policy ACCEPT)
target prot opt ​​source destination
MARK all - 192.168.0.11 anywhere MARK xset 0x3e9 / 0xffffffff

То чи не Шейп результат? Дайте висновок iptables-save ту частину, що ставить мітки, думаю там проблема.

POSTROUTING ACCEPT [78714397: 34898500393]
-A PREROUTING -s 192.168.0.11/32 -j MARK -set-xmark 0x3e9 / 0xffffffff
COMMIT

роблю все це на Ubuntu server, kernel 2.6.32-39

Візуально все правильно. Можна спробувати подивитися як трафік потрапляє в якісь правила:

tc -s qdisc show dev eth0
tc -s qdisc show dev ppp0

Ще в даному ядрі 2.6.32 міняли в якійсь версії механізм шейпінгу, що у нас приводило в заниження входить швидкості і не різанні виходить, може якось з цим пов'язано. Можете спробувати іншу версію ядра, наприклад 2.6.36?

tc -s qdisc show dev eth0
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 13365370 bytes 14533 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0

Але з'явилася проблемка, незнаю вплинув шейпер чи ні - швидкість інтернету впала до 2Мбіт і більше не піднімається, хоча iperf показує [3] 0.0-10.1 sec 12.9 MBytes 10.8 Mbits / sec
але у клієнтів спідтестом - 1-2мбіта і все, і це з 30-50 можливих 🙁
Став на кабель, який йде до сервера - на ньому максимальна швидкість, тобто втрачається десь в сервері, htb скрипт видалив для тесту, і папку / etc / htb теж - не допомогло ....

Якщо хочеться вимкнути шейпер, його потрібно не видаляти, а стопнуть.

Я стопал htb, не вирішило проблему. Поставив таку-ж ubuntu налаштував тільки ppp і маськарадінг, все одно швидкості немає, проблема не в Шейпера виявилася 🙁 На centos 6 - швидкість максимальна ... чудеса та й годі!
Зараз дивимося в сторону рішень від ideco.
Спасибі величезне за консультацію!

Так, не питання, звертайтеся :).