Для тех, кто работал с шейпером под FreeBSD (ipfw, pf) настройка шейпера под линукс может вызвать шок: чего только стоят правила в стиле tc! Для облегчения была написана утилита htb, которая по сути является конвертором “простых” переменных/правил в правила в стиле tc.
Тестовый стенд: Centos linux 6.3.
0) Введение
У нас в сервере 1 сетевой интерфейс (который будет внешним) и ещё один виртуальный tun0 (будет считаться внутренним). Пользователи через openvpn будут подключаться к этому серверу и выходить через него в интернет. Соответственно так же будет настроен NAT на eth0.
1) Установка
HTB представляет собой обычный shell-скрипт, поэтому переходим в папку /etc/init.d и скачиваем туда скрипт, например, с этого адреса:
#cd /etc/init.d
#wget http://ras.pl.ua/pub/linux/htb.init
#mv -f ./htb.init ./htb
#chmod 755 ./htb
#chkconfig htb on
#mkdir /etc/htb
Открываем файл /etc/init.d/htb и приводим в нём строку к виду:
HTB_PATH=${HTB_PATH:-/etc/htb}
2) Настройка
Правила шейпера строятся на основе файлов, которые нужно создавать в каталоге /etc/htb, отсюда их будет читать htb и строить правила для утилиты tc. Переходим в каталог /etc/htb и следуем инструкциям
– внутренний интерфейс tun0 (входящий трафик)
Создадим основные файлы для интерфейса tun0 такого содержания:
DEFAULT=9
R2Q=100
Этот файл указывает номер класса в который попадет весь не классифицированный трафик и точность шейпера, чем меньше значение R2Q тем меньше погрешности в плюс или минус по скорости, в Kbit/sec.
Далее создаём файл tun0-2.root описания корневого класса интерфейса такого содержания (указывается физическая скорость интерфейса, в данном случае это 100 мегабит)
RATE=100Mbit
Теперь непосредственно сами правила для компьютеров сети. Создаём файл tun0-2:5:1006 такого содержания (максимальная скорость на один компьютер 10 мегабит, гарантированная — 1 мегабит (можно ставить и одинаковые цифры)):
CEIL=10Mbit
RATE=1Mbit
PRIO=5
LEAF=sfq
RULE=10.11.0.6
Для каждого хоста нужно создать отдельно файл и указать в нём правильный IP-адрес.
А так же правило (скорость 1 мбит) для всего остального трафика (создаём файл tun0-2:9.default такого содержания)
RATE=1Mbit
PRIO=5
LEAF=sfq
– внешний интерфейс eth0 (исходящий трафик)
Создадим основные файлы для интерфейса eth0 такого содержания:
DEFAULT=9
R2Q=100
Этот файл указывает номер класса в который попадет весь не классифицированный трафик и точность шейпера, чем меньше значение R2Q тем меньше погрешности в плюс или минус по скорости, в Kbit/sec.
Далее создаём файл eth0-2.root описания корневого класса интерфейса такого содержания (указывается физическая скорость интерфейса, в данном случае это 100 мегабит)
RATE=100Mbit
Теперь непосредственно сами правила для компьютеров сети. Так как исходящий трафик у нас натится (SNAT, MASQUERADE) в один внешний IP-адрес, не получится строить правила на основе IP-адресов. Поэтому будут использованы метки, которые будут ставиться фаерволом (iptables), об этом ниже. Таких правил нужно создать по количеству компьютеров в сети, опять же последняя цифра это 1000 + последний октет IP-адреса, метка (MARK) имеет такое же значение. Создаём файл eth0-2:5:1006 такого содержания (максимальная скорость на один компьютер 10 мегабит, гарантированная — 1 мегабит (можно ставить и одинаковые цифры)):
CEIL=10Mbit
RATE=1Mbit
PRIO=5
LEAF=sfq
MARK=1006
Для каждого хоста нужно создать отдельно файл и указать в нём правильный IP-адрес.
А так же правило (скорость 1 мбит) для всего остального трафика (создаём файл eth0-2:9.default такого содержания)
RATE=1Mbit
PRIO=5
LEAF=sfq
Так же нужно добавить правила в файервол для меток пакетов:
iptables -t mangle -A PREROUTING -s 10.11.0.6 -j MARK --set-mark 1006
Аналогично создать правила для остальных адресов.
3) Запуск.
После того, как все файлы настроек созданы, переходим к компиляции и запуску htb:
#/etc/init.d/htb compile
#/etc/init.d/htb start
При последующих перезапусках, используйте restart, вместо start. Для отключения шейпера – используйте stop.
Примечание.
Возможно htb будет ругаться на команду find, тогда уберите ‘-dept 1‘ из скрипта /etc/init.d/htb (в 2-х местах). Обязательно после каждого изменения сначала compile, потом restart.