Шейпер трафика: режем скорость.
htb.init - это скрипт, который с помощью утилит ip, tc настраивает пропускную способность канала. Адрес проекта HTB.init http://sourceforge.net/projects/htbinit/
Немного теории:
Шейпер может ограничивать только ИСХОДЯЩИЙ трафик, распределяя его по разным очередям. Пакеты, не помещающиеся в очередь, отбрасываются. Данные из очереди выдаются на сетевой интерфейс и далее к клиенту.
Каждый конфигурационный файл описывает очередь, это заложено в самом названии файла, который имеет формат: $HTB_PATH/<ifname>-<clsid>(:<clsid>).<description> или если "по-русски": $HTB_PATH/<Имя интерфейса>-<Номер класса>(:<Номер дочернего класса>).<Комментарий>
clsid - задается цифровыми значениями от 0x2 до 0xFFFF (записывается без приставки 0x) Сам интерфейс описывается файлом только с именем ifname. Например:
eth0 имеет идентификатор класса clsid=0. eth0-2 - основной (корневой) класс с clsid=2 eth0-2:3 - класс очереди clsid=3, унаследует ограничения от родительского clsid=2 eth0-2:3:4 - класс очередь clsid=4, унаследует ограничения от родительского clsid=3 и 2, т.е. накладываются еще более жесткие ограничения.
Параметры
- DEFAULT=30 : указывает номер класса, куда попадает трафик не попавший ни под одно правило. - R2Q=10 : точность шейпера. - RATE=5Mbit : выделенная (гарантированная) пропускная способность очереди, задается в Kbit, Mbit или bps (bytes per second) - CEIL=6MBit : максимальная пропускная способность очереди. если не указывать, то по умолчанию CEIL=RATE - BURST=<bytes> : количество байт без ограничения скорости - PRIO=<number> : приоритет трафика очереди к другим очередям в классе. Чем меньше число, тем выше приоритет. По умолчанию 0 - LEAF=<параметр> правило распределения внутри самой очереди. default "none". LEAF=sfq - равномерное распределение между участниками очереди. - RULE= : правило, определяющее трафик, который должен проходить через данную очередь. В одном файле могут присутствовать сразу несколько правил. RULE=[[source_addr][:port[/mask]],][destination_addr][:port[/mask]] Если трафик попадает по условиям в очередь -2:10 (например где правило задано по маске), то дальше он уже не будет проверять условия в -2:20 (где допустим будет описано правило с конкретно этим ip), -2:30 - MARK=<метка> : трафик имеющий метку. Например если надо ограничить исходящий трафик от клиента в лок. сети, находящегося за NATом, RULE не прокатит, нужно использовать MARK, и метить нужные пакеты в фаерволе примерно так: iptables -t mangle -A PREROUTING -s 192.168.0.1 -j MARK –set-mark 101 - TIME : временные параметры. TIME=18:00-06:00;256Kbit
Для корректной работы скрипта, сумма всех RATE дочерних классов (очередей) не должна превышать RATE корневого класса, а значение CEIL в каждой очереди не должно превышать значение в корневом классе.
Установка htb.init
Качаем скрипт htb.init который будет генерировать вам правила шейпера согласно созданным вами файлам конфигурации. Сайт проекта http://sourceforge.net/projects/htbinit/ . Переименуем покороче скачанный скрипт, назовем например просто htb и поместим в директорию /usr/sbin. Разрешим выполнение этого скрипта:
chmod +x /usr/sbin/htb
По желанию можно добавить скрипт в автозагрузку системы, например добавив в rc.local строку /usr/sbin/htb start
Теперь надо создать директории и файлы необходимые для правильной работы скрипта.
mkdir /etc/sysconfig mkdir /etc/sysconfig/htb touch /var/cache/htb.init
Теперь можно приступать к написанию конфигурационных файлов нашего шейпера.
cd /etc/sysconfig/htb
На сервере имеется локалка на интерфейсе eth0, интернет на eth1. Используется NAT. Скорость интернет-канала 30Мбит\с. Необходимо обеспечить гарантированную скорость доступа по rdp (на сервере проброшены порты к некоторым компам) и ограничить скорость интернет для некоторых компьютеров в сети, при этом не ограничивая скорость в локалке (на сервере еще файлопомойка).
Создаем конфигурационные файлы:
Для входящего трафика:
sudo touch eth0 # Описываем интерфейс eth0 sudo nano eth0
DEFAULT=10 # метка на файл, создаваемый ниже, eth0-2:10.dfl R2Q=100 # точность ограничений
sudo touch eth0-2.root # корневой класс sudo nano eth0-2.root
RATE=100Mbit # гарантированная пропускная способность CEIL=100Mbit # максимальная пропускная способность BURST=15k # первые 15k без ограничений sudo touch eth0-2:10.dfl # сюда попадает трафик, не попадающий ни в одно из правил ниже sudo nano eth0-2:10.dfl
RATE=1024Kbit # гарантированная пропускная способность CEIL=99Mbit # максимальная пропускная способность LEAF=sfq # равномерное распределение между участниками очереди.
sudo touch eth0-2:20.rdp # гарантированный канал для rdp sudo nano eth0-2:20.rdp
RATE=1Mbit # гарантированная пропускная способность CEIL=2Mbit # максимальная пропускная способность BURST=15k # первые 15k без ограничений LEAF=sfq # равномерное распределение между участниками очереди. RULE=*:3389, # Применять правило для трафика, у которого исходящий порт - rdp-порт
sudo touch eth0-2:30.87 # ограничиваем скорость для ip 10.10.10.87 sudo nano eth0-2:30.87
RATE=64Kbit # гарантированная пропускная способность BURST=15k # максимальная пропускная способность LEAF=sfq # равномерное распределение между участниками очереди. MARK=87 # применять правило для пакетов, маркированных меткой 87
Для корректной работы надо добавить правило в фаервол:
sudo iptables -A FORWARD -d 10.10.10.87 -j MARK --set-mark 87 пакеты маркируются в цепочке форвард, поэтому на локалку это правило не действует.
sudo touch eth0-2:31.137 # ограничиваем скорость для ip 10.10.10.137 sudo nano eth0-2:31.137
RATE=64Kbit # гарантированная пропускная способность BURST=15k # максимальная пропускная способность LEAF=sfq # равномерное распределение между участниками очереди. MARK=137 # применять правило для пакетов, маркированных меткой 137
Для корректной работы надо добавить правило в фаервол:
sudo iptables -A FORWARD -d 10.10.10.137 -j MARK --set-mark 137
Для исходящего трафика:
sudo touch eth1 # Описываем интерфейс eth1 sudo nano eth1
DEFAULT=10 # метка на файл, создаваемый ниже, eth1-2:10.dfl R2Q=100 # точность ограничений
sudo touch eth1-2.root # корневой класс sudo nano eth1-2.root
RATE=30Mbit # гарантированная пропускная способность CEIL=30Mbit # максимальная пропускная способность BURST=15k # первые 15k без ограничений
sudo touch eth1-2:10.dfl # сюда попадает трафик, не попадающий ни в одно из правил ниже sudo nano eth1-2:10.dfl
RATE=256Kbit # гарантированная пропускная способность CEIL=29Mbit # максимальная пропускная способность LEAF=sfq # равномерное распределение между участниками очереди.
sudo touch eth1-2:20.rdp # гарантированный канал для rdp sudo nano eth1-2:20.rdp
RATE=1Mbit # гарантированная пропускная способность CEIL=2Mbit # максимальная пропускная способность BURST=15k # первые 15k без ограничений LEAF=sfq # равномерное распределение между участниками очереди. RULE=*:3389 # Применять правило для трафика, у которого порт назначения - rdp-порт
sudo touch eth1-2:30.87 # ограничиваем скорость для ip 10.10.10.87 sudo nano eth1-2:30.87
RATE=64Kbit # гарантированная пропускная способность BURST=15k # максимальная пропускная способность LEAF=sfq # равномерное распределение между участниками очереди. MARK=87 # применять правило для пакетов, маркированных меткой 87
Для корректной работы надо добавить правило в фаервол: sudo iptables -t mangle -A PREROUTING -s 10.10.10.87 -j MARK --set-mark 87
sudo touch eth1-2:31.137 # ограничиваем скорость для ip 10.10.10.137 sudo nano eth1-2:31.137
RATE=64Kbit # гарантированная пропускная способность BURST=15k # максимальная пропускная способность LEAF=sfq # равномерное распределение между участниками очереди. MARK=137 # применять правило для пакетов, маркированных меткой 137
Для корректной работы надо добавить правило в фаервол: sudo iptables -t mangle -A PREROUTING -s 10.10.10.137 -j MARK --set-mark 137
Осталось запустить скрипт:
sudo htb compile # тест. можно посмотреть какие правила будут сформированы и ошибки, если есть. sudo htb start # запуск sudo htb stop # остановка sudo htb restart # перезапуск после внесения изменений в файлы конфигурации
|