Deltahost

Facebook

Irpin Bike

Strava

🏠 Oleksandr Rudenko blog

🎚️ Налаштування шейпера HTB на Linux за допомогою htb.init

07.07.2011 | Олександр

Вирішив реанімувату статтю з старого блога, бо часи зараз такі, що можливо виникне необхідність роздать невеличкий канал 4G або Starlink. Тож, в наших умовах війни з московією, буде не зайвою.

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

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

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

cd /usr/local/sbin
wget https://rudenko.net.ua/pub/linux/htb.init
mv -f ./htb.init ./htb
chmod 755 ./htb
ln -sf /usr/local/sbin/htb /etc/init.d/htb
Скрипт завантажений, зроблений запускаємим, симлінк поміщений куди потрібно, тепер потрібно включити його в автозавантаження, для CentOS (RHEL, Fedora):
chkconfig htb on
Те ж саме для Debian (Ubuntu):
update-rc.d htb start 20 0 1 2 3 4 5 .
Далі потрібно створити каталоги для конфігураційних файлів шейпера:
mkdir /etc/sysconfig
mkdir /etc/sysconfig/htb
Тепер можна розпочати безпосередньо налаштування. Правила шейпера будуються на основі файлів, які потрібно створювати у каталозі /etc/sysconfig/htb, звідси їх буде читати htb.init і будувати правила для утиліти tc. Нагадаю, що канал у нас 20/5 мегабіт, приблизно 10 комп'ютерів у мережі, тому нижче будуть наведені файли конфігурації з поясненням що вони описують.

Файл опису інтерфейсу, eth0 - інтерфейс, що дивиться в локальну мережу офісу. Адресація 192.168.0.1/24, маршрутизатор має IP 192.168.0.1, за ним — комп'ютери офісу. Вказується клас, яким шейптиметься трафік, що не потрапив ні під одне правило шейпера.

/etc/sysconfig/htb/eth0:
DEFAULT=9
Далі файл опису кореневого класу інтерфейсу, вказується фізична швидкість інтерфейсу, на разі це 100 мегабіт.

/etc/sysconfig/htb/eth0-2.root:
RATE=100Mbit
Спочатку необхідно нарізати швидкість для трафіку, що виходить із самого роутера, наприклад, якщо на ньому встановлено файл-сервер, можна дати швидкість більшу, ніж в Інтернет, причому ця швидкість не вплине на швидкість роботи в Інтернеті. 100 - 20 мегабіт, ну і 10 можна залишити на службові пакети і т. п., щоб не утворилася планка (повне завантаження інтерфейсу), і робота залишалася комфортною, виходить 70 мегабіт. Швидкість з файл-сервера можна також поділити між учасниками мережі, але в даному прикладі це опускається.

/etc/sysconfig/htb/eth0-2:4.from_router_to_network:
RATE=70Mbit
PRIO=4
LEAF=sfq
RULE=192.168.0.0/24,
Тепер черга опису класу трафіку з Інтернету. Один мегабіт залишиться для трафіку, що не потрапив до правил, 19 мегабіт залишається, описується. Тут пріоритет зазначено більший, ніж у локальному трафіку з роутера, чим він більше, тим обробляється пізніше.

/etc/sysconfig/htb/eth0-2:5.to_network:
RATE=19Mbit
PRIO=5
Тепер самі правила для комп'ютерів мережі. Максимальна швидкість на один комп'ютер 19 мегабіт, гарантована один мегабіт. Таких файлів потрібно створити за кількістю комп'ютерів в мережі, останнє число - це 1000 + останній октет IP-адреси. І в самому файлі в RULE вказана IP-адреса комп'ютера. Вхідний трафік на сам роутер не шейпиться, це можна зробити, але метод в даному прикладі не розглядається.

/etc/sysconfig/htb/eth0-2:5:1002:
CEIL=19Mbit
RATE=1Mbit
PRIO=5
LEAF=sfq
RULE=192.168.0.2
Той трафік, який не потрапив до попередніх правил - шиїться на швидкості 1 мегабіт.

/etc/sysconfig/htb/eth0-2:9.default:
RATE=1Mbit
PRIO=5
LEAF=sfq
Тепер вихідний трафік. В принципі те саме, інтерфейс ppp0, швидкість 5 мегабіт, трафіку, що не потрапив під правила, дається 128 кілобіт (останній файл), решті від 512 кілобіт до 5 мегабіт. Трафік з роутера також шейпитиметься.

/etc/sysconfig/htb/ppp0:
DEFAULT=9
/etc/sysconfig/htb/ppp0-2.root:
RATE=100Mbit
/etc/sysconfig/htb/ppp0-2:5.from_network:
RATE=5Mbit
PRIO=5
Оскільки вихідний трафік у нас натиться (SNAT, MASQUERADE) в одну зовнішню IP-адресу, не вдасться будувати правила на основі IP-адрес. Тому будуть використані мітки, які ставитимуться фаєрволом (iptables), про це нижче. Таких правил потрібно створити за кількістю комп'ютерів у мережі, знову ж таки остання цифра це 1000 + останній октет IP-адреси, мітка (MARK) має таке ж значення.

/etc/sysconfig/htb/ppp0-2:5:1001:
CEIL=5Mbit
RATE=512Kbit
PRIO=5
LEAF=sfq
MARK=1001
/etc/sysconfig/htb/ppp0-2:9.default:
RATE=128Kbit
PRIO=5
LEAF=sfq
Тепер про мітки. У iptables потрібно позначити вихідний трафік, робиться це наступним правилом у таблиці mangle:
-A PREROUTING -s 192.168.0.1 -j MARK --set-mark 1001
Для кожного комп'ютера своє правило. У CentOS (RHEL, Fedora) правила фаєрволла зазвичай знаходяться у файлі /etc/sysconfig/iptables, після редагування потрібно застосувати зміни командою:
/etc/init.d/iptables restart
У Debian (Ubuntu) можна зробити так. Зняти поточну конфігурацію у файл:
iptables-save > /etc/sysconfig/iptables
Поправити та застосувати:
iptables-restore < /etc/sysconfig/iptables
Ці команди працюють і в CentOS (RHEL, Fedora), якщо потрібні. Далі. Налаштування завершено, тепер потрібно перевірити правильність нашої конфігурації:
/etc/init.d/htb compile
Якщо помилок немає - буде видно, що ж побудував скрипт htb.init для системи на основі файлів конфігурації. Тепер можна запустити шейпер:
/etc/init.d/htb start
Залишився один нюанс. З'єднання з Інтернет у даному прикладі здійснюється за PPP, якщо використовується безпосереднє підключення - далі можна не читати. Але інтерфейс PPP (ppp0) може падати (перепідключення, зникнення зв'язку), при падінні інтерфейсу всі правила шейпера на ньому будуть скинуті. Наступний скрипт перевірятиме наявність PPP-інтерфейсу та наявність на ньому правил, якщо правил не буде, він перезапустить htb.init.

/usr/local/sbin/htb_check:
#!/bin/bash

#################################################################################
#
# Перевірка наявності правил шейпера на інтерфейсі, перезапуск htb.init при
# необхідності
#
#################################################################################

# Перевіряємий інтерфейс
DEVICE='ppp0'

# Перевірка наявності інтерфейсу
TEST_PPP=`/sbin/ip link show dev $DEVICE 2>/dev/null`
if [ "$TEST_PPP" != "" ] ; then
  # Перевірка наявності правил шейпера на інтерфейсі
  TEST_HTB=`/sbin/tc class show dev $DEVICE`
  if [ "$TEST_HTB" == "" ] ; then
    # Якщо правил на інтерфейсі немає - перезапуск htb.init
    /etc/init.d/htb restart
  fi
fi
Файл потрібно зробити запускаємим:
chmod 755 /usr/local/sbin/htb_check
Запускатиметься він по cron щохвилини, для цього у файлі /etc/crontab додаються наступні рядки:
# Перевірка наявності правил шейпера на інтерфейсі, перезапуск htb.init при
# необхідності
* * * * * root /usr/local/sbin/htb_check >/dev/null
На цьому все, сподіваюся комусь дане HOWTO стане в нагоді, пропозиції, побажання та зауваження готовий обговорити в коментарях до статті.


Коментарі

⬆️ Наверх сторінки