Обработчик активации сервисов для Manad

Материал из BiTel WiKi

Перейти к: навигация, поиск

Manad представляет собой perl-вый скрипт, который выполняет команды на стороне маршрутизатора/шейпера. Это тот же самый Manad, который использовался в IPN(слегка изменен под inet). И обработчик активации сервиса для работы с ним. Обработчик умеет обрабатывать либо ip либо сети , указанные в сервисе.

Тут главное определится нужен ли вам Manad. Если это команды типа

iptables -A FORWARD -t filter -s 1.1.1.1 -j ACCEPT
iptables -D FORWARD -t filter -s 1.1.1.1 -j ACCEPT

Т.е достаточно использовать telnet или ssh-обработчики. Manad нужен если вы хотите в командах использовать некоторые счетчики, которые будут увеличиваться и запоминаться для каждого абонента. В этом случае Manad используется для выделения новых счетчиков и их хранения.


Например в случае ipfw(freebsd) нужно выделять номера pipi-ов для каждого абонента и команды

pipe 100 config bw 1280000
pipe 101 config bw 1280000
add 1000 pipe 100 ip from any to 1.1.1.1 out
add 1000 pipe 101 ip from 1.1.1.1 to any in
 
pipe 103 config bw 1280000
pipe 105 config bw 1280000
add 1001 pipe 103 ip from any to 2.2.2.2 out
add 1001 pipe 105 ip from 2.2.2.2 to any in

Или для iroute2(linux) нужно выделять номера классов

/sbin/tc class add dev eth0 parent 1:0 classid 1:1 htb rate 256kbit burst 4k prio 1
/sbin/tc qdisc add dev eth0 parent 1:1 handle 1: sfq perturb 10 quantum 1500
 
/sbin/tc class add dev eth0 parent 1:0 classid 1:2 htb rate 128kbit burst 4k prio 1
/sbin/tc qdisc add dev eth0 parent 1:2 handle 2: sfq perturb 10 quantum 1500
 
 
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 1.1.1.1  flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 2.2.2.2  flowid 1:1
 
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32 match ip src 1.1.1.1 flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32 match ip src 1.1.1.1 flowid 1:2


1) Заводим тип устройства Manad.

Класс обработчика активации сервисов:

ru.bitel.bgbilling.modules.inet.dyn.device.manad.ManadServiceActivator

Поставляется в стандартной поставке.


Параметры общие описаны тут:

Дополнительно поддерживается параметр

\t

Означающий символ табуляции.



Также дополнительно тут поддерживается параметр

$paramMulti

Работу которого можно показать на примере

speedCommands.1=add\t$servId\t
speedCommands.2=<LOOP>
speedCommands.3=pipe {P0} config bw $param($option,speed,100)
speedCommands.4=pipe {P1} config bw $param($option,speed,100)
speedCommands.5=add {N0} pipe {P0} ip from any to $ip out
speedCommands.6=add {N0} pipe {P1} ip from $ip to any in
speedCommands.7=</LOOP>
 
 
 
sa.command.inetOption.5.enable=$paramMulti(speedCommands)
sa.command.inetOption.6.enable=$paramMulti(speedCommands)
sa.command.inetOption.7.enable=$paramMulti(speedCommands)

В данном случае каждый макрос $paramMulti преобразуется в 7 строк.

С 6.2 упростили(макрос больше не нужен):

sa.command.common.inetOption.enable.1=add\t$servId\t
sa.command.common.inetOption.enable.2=<LOOP>
sa.command.common.inetOption.enable.3=pipe {P0} config bw $param($option,speed,100)
sa.command.common.inetOption.enable.4=pipe {P1} config bw $param($option,speed,100)
sa.command.common.inetOption.enable.5=add {N0} pipe {P0} ip from any to $ip out
sa.command.common.inetOption.enable.6=add {N0} pipe {P1} ip from $ip to any in
sa.command.common.inetOption.enable.7=</LOOP>

Данный обработчик поддерживает 2 основные схемы .

а) Все счетчики привязаны к одному сервису(т.е мы ограничиваем скорость на одном сервисе).

В этом случае просто пишем команды. Все макросы $servId $ip и т.д берутся из сервиса. Пример

sa.command.common.inetOption.enable.1=add\t$servId\t
sa.command.common.inetOption.enable.2=pipe {P0} config bw $param($option,speed,100)
sa.command.common.inetOption.enable.3=pipe {P1} config bw $param($option,speed,100)
sa.command.common.inetOption.enable.4=add {N0} pipe {P0} ip from any to $ip out
sa.command.common.inetOption.enable.5=add {N0} pipe {P1} ip from $ip to any in


б) Счетчики объединяют несколько сервисов. Т.е правила шейпинга назначаются не суммарный трафик нескольких независимых ip.

В этом случае заводится один пустой родительский сервис на договоре, а каждый ip прописывается на дочернем сервисе .


В этом случае есть общие команды(макросы $servId и другие подставляется из родительского сервиса), а есть команды, которые надо повторять для каждого сервиса (макросы $ip и другие берутся из каждого дочернего сервиса) - такие команды выделяются тегами <LOOP>/<\LOOP>. Пример

sa.command.common.inetOption.enable.1=add\t$servId\t
sa.command.common.inetOption.enable.2=<LOOP>
sa.command.common.inetOption.enable.3=pipe {P0} config bw $param($option,speed,100)
sa.command.common.inetOption.enable.4=pipe {P1} config bw $param($option,speed,100)
sa.command.common.inetOption.enable.5=add {N0} pipe {P0} ip from any to $ip out
sa.command.common.inetOption.enable.6=add {N0} pipe {P1} ip from $ip to any in
sa.command.common.inetOption.enable.7=</LOOP>

С тегами <LOOP></LOOP> будет работать и в предыдущей схеме с одним сервисом(как частный случай).


Добавления сервисов для обоих описанных случаев можно увидеть тут :

Файл:Inet_manad_tc_servises.png

Там вначале идет отдельный сервис с ip-адресом, потом родительский, где ip указаны в дочерних сервисах.

Так же обработчик заменяет подстановки вида {XN}, где X - латинская буква, а N - цифра. Начинать нумеровать эти последовательности нужно обязательно с нуля. Для каждого ip-адреса по каждой букве увеличивается индекс. Т.е., например, подстановки {A0}, {A1}, {B0} для 1-го ip-адреса преобразуется в {A0}, {A1}, {B0} ; для второго ip-адреса в {A1}, {A2}, {B1} и т.п. В текущей реализации перловый скрипт manad обрабтывает только 2 буквы: {N0},{N1} и т.п для номеров правил;{P0},{З1} и т.п номеров пайпов. Так же он обрабатывает конструкции вида {PA} и {PB}, модификация взята отсюда:

2) Заводим устройство типа Manad. На устройстве должен быть прописан host:port Manad. Либо просто host, тогда порт может быть указан в параметре

sa.port

в конфигурации устройств.

3) Запускаем и настраиваем сам Manad(перловый вариант). Скачать его можно тут Медиа:manad_inet.zip

Manad - это перловый скрипт, работающий в режиме демона.

Он принимает от BGBilling-сервера следующие строки:

1. add num rules;

2. remove num;

3. test.

4. uptime.

В качестве разделителя используется символ табуляции. num - это id сервиса, rules - это строка с набором команд, внутри которой команды разделяются символом "|". Подразумевается, что команда add добавляет правила, команда remove - удаляет. В ответ на команду test Manad шлёт список id договоров (разделённых символом пробела), открытых на данном шлюзе. test - не используется в модуле inet, использовалось только в IPN(оставлен для совместимости). uptime - время, которое произошло с запуска manad.


Manad FreeBSD(ipfw)

Заводим тип устройства Manad. Обработчик активации сервисов - ru.bitel.bgbilling.modules.inet.dyn.device.manad.ManadServiceActivator.

Конфигурация типа устройства

sa.command.common.inetOption.enable.1=add\t$servId\t
sa.command.common.inetOption.enable.2=pipe {P0} config bw $param($option,speed,100)
sa.command.common.inetOption.enable.3=pipe {P1} config bw $param($option,speed,100)
sa.command.common.inetOption.enable.4=add {N0} pipe {P0} ip from any to $ip out
sa.command.common.inetOption.enable.5=add {N0} pipe {P1} ip from $ip to any in
 
sa.command.common.inetOption.disable=remove\t$servId

Добавляем устройство этого типа. Указываем Хост:порт через ":", например 127.0.0.1:4567. Не забываем добавить ip.resource.categoryId(и категорию тоже не забываем).

Файл:Inet_manad_ipfw_device_edit.png




Файл:Inet_manad_ipfw_device.png

Добавляем тип сервиса Manad, в нем прописываем const.device.id (если устройство одно, чтобы не выбирать его каждый раз на договоре). И

title.pattern=(${addressRange}|>)

Файл:Inet_manad_ipfw_serv_type_edit.png

Добавляем сервис на договоре, указываем ip.

Файл:Inet_manad_ipfw_serv_edit.png


Файл:Inet_manad_ipfw_serv.png

Добавляем Опции в модуле inet.

Файл:Inet_manad_tc_options.png

Для полученных кодов опций прописываем команды в типе устройства (пример конфигурации выше, опции sa.command.inetOption.x). В данном пример мы используем опции с кодами 2,3,4,5. В каждой их опции прописываем параметр speed

speed=1024

Файл:Inet_manad_tc_options_edit.png


Перечитываем конфигурацию на серверах кнопкой в устройствах.

Качаем perl-вый скрипт manad, открываем файл manad_inet.pl, оставляем секцию ipfw, комментируем секцию iproute2:

###################iptw ################################
$rule_start = 1000;
$rule_delete_comand = ("/sbin/ipfw delete ");
@pipe_delete_comand = ("/sbin/ipfw pipe delete ");
$add_command = "/sbin/ipfw -q ";
################################################################
 
 
###########iproute2###############################################
#$rule_start = 1;
#$rule_delete_comand = ("/sbin/iptables -t filter -D FORWARD ");
#@pipe_delete_comand = ("/sbin/tc filter del dev eth0 parent 1:0 protocol ip prio ", "/sbin/tc class del dev eth0 parent 1:0 classid 1:");
#$add_command = "";
###################################################################

Запускаем manad.

Для теста теперь заходим в договор, если состояние сервиса еще не включено, то включаем его вручную правой кнопкой. Заходим в сервис manad, на на вкладке опции добавляем опцию 1024, сохраняем сервис.

Если все нормально, то на стороне manad должно произойти примерно следующее:

request=add	268	|pipe {P0} config bw 1024|pipe {P1} config bw 1024|add {N0} pipe {P0} ip from any to 109.233.170.1 out|add {N0} pipe {P1} ip from 109.233.170.1 to any in|
 
 
/sbin/ipfw -q pipe 100 config bw 1024; /sbin/ipfw -q pipe 101 config bw 1024; /sbin/ipfw -q add 1000 pipe 100 ip from any to 109.233.170.1 out; /sbin/ipfw -q add 1000 pipe 101 ip from 109.233.170.1 to any in; /sbin/ipfw -q

Теперь заходим в сервис и удаляем опцию. на стороне manad должно произойти примерно следующее:

request=remove	268|
/sbin/ipfw delete 1000
/sbin/ipfw pipe delete 101
/sbin/ipfw pipe delete 100


Данная схема подразумевает управление скоростью с помощью опций inet. Опции можно задавать в тарифе. Если сменить опцию, то посылаются команды на отключение старой опции и подключения новой. Схема подразумевает, что на сервисе должна быть опция обязательно, причем только одна. Задана она может быть и тарифом. Опции нужно объединить в группу опций, пересечение в которой не возможно(галочка не стоит). При отключении сервиса с опцией посылаются команды отключения опции, при подключении - команды включения опции. Если на сервисе нет опцией, то в данном примере ничего не посылается при отключении/включении.

perl-вый manad не сохраняет внутри себя никакой информации после перезагрузки. Эту проблему можно решить с помощью обработчика управления устройством(не путать с обработчиком активации сервиса) - ru.bitel.bgbilling.modules.inet.dyn.device.manad.ManadDeviceManager из стандартной поставки. Он управляет manad периодически, запрашивая его uptime, и определяет что manad перезагрузился. Если manad перезагрузился, тогда для всех активных сервисов вызывается команды включения опций . Для включения обработчика управления устройством нужно добавить настройки

#синхронизовать сервисы при перезагрузке устройства
sa.device.sync.onReboot=1
#Интервал проверки перезагрузки устройства
manage.uptime.pause.millis=600000


При это чтобы правила не дублировались заново, нужно в скрипте запуска manad_inet.pl очистить все pipe и правила при старте. Потом обработчик активации управления устройства сам добавит все заново.

Manad Linux(iproute2/iptables)

Заводим тип устройства Manad_iproute2. Обработчик активации сервисов - ru.bitel.bgbilling.modules.inet.dyn.device.manad.ManadServiceActivator.

Конфигурация типа устройства

sa.command.common.inetOption.enable.1=add\t$servId\t
 
sa.command.common.inetOption.enable.2=/sbin/tc class add dev eth0 parent 1:0 classid 1:{PA} htb rate $param($option,speed,100)kbit burst 4k prio 1
sa.command.common.inetOption.enable.3=/sbin/tc qdisc add dev eth0 parent 1:{PA} handle {PA}: sfq perturb 10 quantum 1500
 
sa.command.common.inetOption.enable.4=/sbin/tc class add dev eth0 parent 1:0 classid 1:{PB} htb rate $param($option,speed,100)kbit burst 4k prio 1
sa.command.common.inetOption.enable.5=/sbin/tc qdisc add dev eth0 parent 1:{PB} handle {PB}: sfq perturb 10 quantum 1500
 
sa.command.common.inetOption.enable.6=<LOOP>
sa.command.common.inetOption.enable.7=/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio {PA} u32 match ip dst $ip  flowid 1:{PA}
sa.command.common.inetOption.enable.8=</LOOP>
sa.command.common.inetOption.enable.9=<LOOP>
sa.command.common.inetOption.enable.10=/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio {PB} u32 match ip src $ip flowid 1:{PB}
sa.command.common.inetOption.enable.11=</LOOP>
sa.command.common.inetOption.enable.12=<LOOP>
sa.command.common.inetOption.enable.13=/sbin/iptables  -t filter  -I FORWARD {N0} -s $ip -j ACCEPT
sa.command.common.inetOption.enable.14=</LOOP>
 
#команды влючение/выключения опций
sa.command.common.inetOption.disable=remove\t$servId

Добавляем устройство этого типа. Указываем Хост:порт через ":", например 127.0.0.1:4567. Не забываем добавить ip.resource.categoryId(и категорию тоже не забываем).

Файл:Inet_manad_tc_device_edit.png




Файл:Inet_manad_tc_device.png

Добавляем тип сервиса Manad_iproute2, в нем прописываем const.device.id (если устройство одно, чтобы не выбирать его каждый раз на договоре). И

title.pattern=(${addressRange}|>)

Файл:Inet_manad_tc_serv_type_edit.png

Добавляем сервис на договоре, указываем ip.

Файл:Inet_manad_tc_serv_edit.png


Файл:Inet_manad_tc_serv.png

Добавляем Опции в модуле inet.

Файл:Inet_manad_tc_options.png

Для полученных кодов опций прописываем команды в типе устройства (пример конфигурации выше, опции sa.command.inetOption.x). В данном пример мы используем опции с кодами 2,3,4,5. В каждой их опции прописываем параметр speed

speed=1024

Файл:Inet_manad_tc_options_edit.png


Перечитываем конфигурацию на серверах кнопкой в устройствах.

Качаем perl-вый скрипт manad, открываем файл manad_inet.pl, комментируем секцию ipfw, раскомментируем секцию iproute2:

###################iptw ################################
#$rule_start = 1000;
#$rule_delete_comand = ("/sbin/ipfw delete ");
#@pipe_delete_comand = ("/sbin/ipfw pipe delete ");
#$add_command = "/sbin/ipfw -q ";
################################################################
 
 
###########iproute2###############################################
$rule_start = 1;
$rule_delete_comand = ("/sbin/iptables -t filter -D FORWARD ");
@pipe_delete_comand = ("/sbin/tc filter del dev eth0 parent 1:0 protocol ip prio ", "/sbin/tc class del dev eth0 parent 1:0 classid 1:");
$add_command = "";
###################################################################

На этой же машине инициализируем правила iproute2 cпомощь скрипта init_shaping.sh

#!/bin/sh
 
 
INDEV="eth0"
 
/sbin/tc qdisc del dev $INDEV root 2> /dev/null
 
##### speed server->client(downstream)
 
/sbin/tc qdisc add dev $INDEV root handle 1: htb default ffff r2q 1
 
#default 
/sbin/tc class add dev $INDEV parent 1:0 classid 1:ffff htb rate 100mbit burst 4k prio 3
/sbin/tc qdisc add dev $INDEV parent 1:ffff handle ffff: sfq perturb 10 quantum 1500

Запускаем manad.

Для теста теперь заходим в договор, если состояние сервиса еще не включено, то включаем его вручную правой кнопкой. Заходим в сервис manad_iproute2, на на вкладке опции добавляем опцию 1024, сохраняем сервис.

Если все нормально, то на стороне manad должно произойти примерно следующее:

request=add	273	|/sbin/tc class add dev eth0 parent 1:0 classid 1:{PA} htb rate 1024kbit burst 4k prio 1|/sbin/tc qdisc add dev eth0 parent 1:{PA} handle {PA}: sfq perturb 10 quantum 1500|/sbin/tc class add dev eth0 parent 1:0 classid 1:{PB} htb rate 1024kbit burst 4k prio 1|/sbin/tc qdisc add dev eth0 parent 1:{PB} handle {PB}: sfq perturb 10 quantum 1500|/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio {PA} u32 match ip dst 109.233.170.1  flowid 1:{PA}|/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio {PB} u32 match ip src 109.233.170.1 flowid 1:{PB}|/sbin/iptables  -t filter  -I FORWARD {N0} -s 109.233.170.1 -j ACCEPT
 
 
/sbin/tc class add dev eth0 parent 1:0 classid 1:100 htb rate 1024kbit burst 4k prio 1; /sbin/tc qdisc add dev eth0 parent 1:100 handle 100: sfq perturb 10 quantum 1500; /sbin/tc class add dev eth0 parent 1:0 classid 1:101 htb rate 1024kbit burst 4k prio 1; /sbin/tc qdisc add dev eth0 parent 1:101 handle 101: sfq perturb 10 quantum 1500; /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip dst 109.233.170.1  flowid 1:100; /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 101 u32 match ip src 109.233.170.1 flowid 1:101; /sbin/iptables  -t filter  -I FORWARD 1 -s 109.233.170.1 -j ACCEPT

Теперь заходим в сервис и удаляем опцию. на стороне manad должно произойти примерно следующее:

request=remove	273
/sbin/iptables -t filter -D FORWARD 1
/sbin/tc filter del dev eth0 parent 1:0 protocol ip prio 100
/sbin/tc class del dev eth0 parent 1:0 classid 1:100
/sbin/tc filter del dev eth0 parent 1:0 protocol ip prio 101
/sbin/tc class del dev eth0 parent 1:0 classid 1:101


Данная схема подразумевает управление скоростью с помощью опций inet. Опции можно задавать в тарифе. Если сменить опцию, то посылаются команды на отключение старой опции и подключения новой. Схема подразумевает, что на сервисе должна быть опция обязательно, причем только одна. Задана она может быть и тарифом. Опции нужно объединить в группу опций, пересечение в которой не возможно(галочка не стоит). При отключении сервиса с опцией посылаются команды отключения опции, при подключении - команды включения опции. Если на сервисе нет опцией, то в данном примере ничего не посылается при отключении/включении.

perl-вый manad не сохраняет внутри себя никакой информации после перезагрузки. Эту проблему можно решить с помощью обработчика управления устройством(не путать с обработчиком активации сервиса) - ru.bitel.bgbilling.modules.inet.dyn.device.manad.ManadDeviceManager из стандартной поставки. Он управляет manad периодически, запрашивая его uptime, и определяет что manad перезагрузился. Если manad перезагрузился, тогда для всех активных сервисов вызывается команды включения опций . Для включения обработчика управления устройством нужно добавить настройки

#синхронизовать сервисы при перезагрузке устройства
sa.device.sync.onReboot=1
#Интервал проверки перезагрузки устройства
manage.uptime.pause.millis=600000


При это чтобы правила не дублировались заново, нужно в скрипте запуска manad_inet.pl вызывать скрипт inet_shaping.sh, чтобы почистить все, потом обработчик активации управления устройства сам добавит все заново.

Личные инструменты