Решил написать небольшое HOWTO по настройке шейпера HTB на маршрутизаторе (роутере) на базе Linux при помощи скрипта htb.init. Задача следующая: есть офисная сеть, есть подключение к сети Интернет на определённой скорости, в рассмотренном случае это 20 мегабит вход и 5 мегабит исход, скорость нужно поделить равнозначно между офисными компьютерами, но в случае когда канал не загружен — дать возможность работать на максимальной скорости. В данном HOWTO шейпиться будет не только входящий, но и исходящий трафик, причём подключение к Интернет производится по PPP, что накладывает некоторые нюансы на настройку.

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

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

cd /usr/local/sbin
wget http://ras.pl.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 пригодится, предложения, пожелания и замечания готов обсудить в комментариях к статье.

Facebooktwittergoogle_plusredditpinterestlinkedintumblr

Comments

comments