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

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

(Различия между версиями)
Перейти к: навигация, поиск
(Manad Linux =)
 
(21 промежуточная версия не показана)
Строка 1: Строка 1:
-
'''Внимание, статья находится в стадии правки и пока не окончена.'''
 
-
 
Manad представляет собой perl-вый скрипт, который выполняет команды на стороне маршрутизатора/шейпера. Это тот же самый Manad, который использовался в IPN(слегка изменен под inet). И обработчик активации сервиса для работы с ним. Обработчик умеет обрабатывать либо ip либо сети , указанные  в сервисе.  
Manad представляет собой perl-вый скрипт, который выполняет команды на стороне маршрутизатора/шейпера. Это тот же самый Manad, который использовался в IPN(слегка изменен под inet). И обработчик активации сервиса для работы с ним. Обработчик умеет обрабатывать либо ip либо сети , указанные  в сервисе.  
Строка 70: Строка 68:
Означающий символ табуляции.   
Означающий символ табуляции.   
 +
 +
 +
Строка 94: Строка 95:
</source>
</source>
-
 
В данном случае каждый макрос $paramMulti преобразуется в 7 строк.  
В данном случае каждый макрос $paramMulti преобразуется в 7 строк.  
 +
 +
'''С 6.2 упростили(макрос больше не нужен):'''
 +
<source lang="bash">
 +
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>
 +
</source>
Данный обработчик поддерживает 2 основные схемы .  
Данный обработчик поддерживает 2 основные схемы .  
Строка 105: Строка 116:
<source lang="bash">
<source lang="bash">
-
speedCommands.1=add\t$servId\t
+
sa.command.common.inetOption.enable.1=add\t$servId\t
-
speedCommands.2=pipe {P0} config bw $param($option,speed,100)
+
sa.command.common.inetOption.enable.2=pipe {P0} config bw $param($option,speed,100)
-
speedCommands.3=pipe {P1} config bw $param($option,speed,100)
+
sa.command.common.inetOption.enable.3=pipe {P1} config bw $param($option,speed,100)
-
speedCommands.4=add {N0} pipe {P0} ip from any to $ip out
+
sa.command.common.inetOption.enable.4=add {N0} pipe {P0} ip from any to $ip out
-
speedCommands.5=add {N0} pipe {P1} ip from $ip to any in
+
sa.command.common.inetOption.enable.5=add {N0} pipe {P1} ip from $ip to any in
-
 
+
-
 
+
-
sa.command.inetOption.5.enable=$paramMulti(speedCommands)
+
-
sa.command.inetOption.6.enable=$paramMulti(speedCommands)
+
-
sa.command.inetOption.7.enable=$paramMulti(speedCommands)
+
-
 
+
</source>
</source>
-
 
-
 
Строка 127: Строка 130:
В этом случае есть общие команды(макросы $servId и другие подставляется из родительского сервиса), а есть команды, которые надо повторять для каждого сервиса
В этом случае есть общие команды(макросы $servId и другие подставляется из родительского сервиса), а есть команды, которые надо повторять для каждого сервиса
-
(макросы $ip и другие берутся из каждого дочернего сервиса). Пример
+
(макросы $ip и другие берутся из каждого дочернего сервиса) - такие команды выделяются тегами <LOOP>/<\LOOP>. Пример
<source lang="bash">
<source lang="bash">
-
speedCommands.1=add\t$servId\t
+
sa.command.common.inetOption.enable.1=add\t$servId\t
-
speedCommands.2=<LOOP>
+
sa.command.common.inetOption.enable.2=<LOOP>
-
speedCommands.3=pipe {P0} config bw $param($option,speed,100)
+
sa.command.common.inetOption.enable.3=pipe {P0} config bw $param($option,speed,100)
-
speedCommands.4=pipe {P1} config bw $param($option,speed,100)
+
sa.command.common.inetOption.enable.4=pipe {P1} config bw $param($option,speed,100)
-
speedCommands.5=add {N0} pipe {P0} ip from any to $ip out
+
sa.command.common.inetOption.enable.5=add {N0} pipe {P0} ip from any to $ip out
-
speedCommands.6=add {N0} pipe {P1} ip from $ip to any in
+
sa.command.common.inetOption.enable.6=add {N0} pipe {P1} ip from $ip to any in
-
speedCommands.7=</LOOP>
+
sa.command.common.inetOption.enable.7=</LOOP>
 +
</source>
 +
С тегами <LOOP></LOOP> будет работать  и в предыдущей схеме с одним сервисом(как частный случай).
-
sa.command.inetOption.5.enable=$paramMulti(speedCommands)
+
Добавления сервисов  для обоих описанных случаев можно увидеть тут :
-
sa.command.inetOption.6.enable=$paramMulti(speedCommands)
+
-
sa.command.inetOption.7.enable=$paramMulti(speedCommands)
+
-
</source>
+
[[Файл:Inet_manad_tc_servises.png]]
 +
 
 +
Там вначале идет отдельный сервис с ip-адресом, потом родительский, где ip  указаны в дочерних сервисах.
Так же обработчик заменяет  подстановки вида {XN}, где X - латинская буква, а N - цифра.  Начинать нумеровать эти последовательности нужно обязательно с нуля. Для каждого ip-адреса по каждой букве увеличивается индекс. Т.е., например, подстановки {A0}, {A1}, {B0} для 1-го ip-адреса преобразуется в {A0}, {A1}, {B0} ; для второго ip-адреса в {A1}, {A2}, {B1} и т.п. В текущей реализации перловый скрипт manad обрабтывает
Так же обработчик заменяет  подстановки вида {XN}, где X - латинская буква, а N - цифра.  Начинать нумеровать эти последовательности нужно обязательно с нуля. Для каждого ip-адреса по каждой букве увеличивается индекс. Т.е., например, подстановки {A0}, {A1}, {B0} для 1-го ip-адреса преобразуется в {A0}, {A1}, {B0} ; для второго ip-адреса в {A1}, {A2}, {B1} и т.п. В текущей реализации перловый скрипт manad обрабтывает
-
только 2 буквы: {N0},{N1} и т.п для номеров правил;{P0},{З1} и т.п номеров пайпов.  
+
только 2 буквы: {N0},{N1} и т.п для номеров правил;{P0},{З1} и т.п номеров пайпов. Так же он обрабатывает конструкции вида {PA} и {PB}, модификация взята отсюда:
-
 
+
-
 
+
-
 
+
-
 
+
 +
*[[Изменения в manad для работы с одним pipe на множество IP адресов]]
2) Заводим устройство типа Manad. На устройстве должен быть прописан host:port Manad. Либо просто  host, тогда порт может быть указан в параметре  
2) Заводим устройство типа Manad. На устройстве должен быть прописан host:port Manad. Либо просто  host, тогда порт может быть указан в параметре  
Строка 178: Строка 180:
-
== Manad FreeBSD ===
+
== Manad FreeBSD(ipfw) ==
-
Сам manad лучше взять вот этот(ссылка!!!).  
+
Заводим тип устройства Manad.
-
Вот пример конфигурации типа сервиса. 
+
Обработчик активации сервисов - ru.bitel.bgbilling.modules.inet.dyn.device.manad.ManadServiceActivator.
 +
 
 +
Конфигурация типа устройства
<source lang="bash">
<source lang="bash">
-
speedCommands.1=add\t$servId\t
+
sa.command.common.inetOption.enable.1=add\t$servId\t
-
speedCommands.2=pipe {P0} config bw $param($option,speed,100)
+
sa.command.common.inetOption.enable.2=pipe {P0} config bw $param($option,speed,100)
-
speedCommands.3=pipe {P1} config bw $param($option,speed,100)
+
sa.command.common.inetOption.enable.3=pipe {P1} config bw $param($option,speed,100)
-
speedCommands.4=add {N0} pipe {P0} ip from any to $ip out
+
sa.command.common.inetOption.enable.4=add {N0} pipe {P0} ip from any to $ip out
-
speedCommands.5=add {N0} pipe {P1} ip from $ip to any in
+
sa.command.common.inetOption.enable.5=add {N0} pipe {P1} ip from $ip to any in
 +
sa.command.common.inetOption.disable=remove\t$servId
 +
</source>
-
sa.command.inetOption.5.enable=$paramMulti(speedCommands)
+
Добавляем устройство этого типа. Указываем Хост:порт через ":", например 127.0.0.1:4567.  
-
sa.command.inetOption.6.enable=$paramMulti(speedCommands)
+
Не забываем добавить ip.resource.categoryId(и категорию тоже не забываем).
-
sa.command.inetOption.7.enable=$paramMulti(speedCommands)
+
-
sa.command.inetOption.5.disable.1=remove\t$servId
+
[[Файл:Inet_manad_ipfw_device_edit.png]]
-
sa.command.inetOption.6.disable.1=remove\t$servId
+
 
-
sa.command.inetOption.7.disable.1=remove\t$servId
+
 
 +
 
 +
 
 +
 
 +
 
 +
[[Файл:Inet_manad_ipfw_device.png]]
 +
 
 +
Добавляем тип сервиса Manad, в нем прописываем const.device.id (если устройство одно, чтобы не выбирать его каждый раз на договоре). И
 +
 
 +
<source lang="bash">
 +
title.pattern=(${addressRange})
</source>
</source>
-
В данном примере manad будет реагировать только на изменение опций(скорости).  
+
[[Файл:Inet_manad_ipfw_serv_type_edit.png]]
 +
Добавляем сервис на договоре, указываем ip. 
-
== Manad Linux ===
+
[[Файл:Inet_manad_ipfw_serv_edit.png]]
-
Заводим тип устройства Manad_iproute2.
 
-
Обработчик активации сервисов - ru.bitel.bgbilling.modules.inet.dyn.device.manad.ManadServiceActivator.
 
-
Конфигурация типа устройства
 
 +
[[Файл:Inet_manad_ipfw_serv.png]]
 +
 +
Добавляем Опции в модуле inet.
 +
 +
[[Файл:Inet_manad_tc_options.png]]
 +
 +
Для полученных кодов опций прописываем команды в типе устройства (пример конфигурации выше, опции sa.command.inetOption.x). В данном пример  мы используем  опции с кодами 2,3,4,5.
 +
В каждой их опции прописываем параметр speed
<source lang="bash">
<source lang="bash">
 +
speed=1024
 +
</source>
-
speedEnable.1=add\t$servId\t
+
[[Файл:Inet_manad_tc_options_edit.png]]
-
speedEnable.2=/sbin/tc class add dev eth0 parent 1:0 classid 1:{PA} htb rate $param($option,speed,100)kbit burst 4k prio 1
 
-
speedEnable.3=/sbin/tc qdisc add dev eth0 parent 1:{PA} handle {PA}: sfq perturb 10 quantum 1500
 
-
speedEnable.4=/sbin/tc class add dev eth0 parent 1:0 classid 1:{PB} htb rate $param($option,speed,100)kbit burst 4k prio 1
+
Перечитываем конфигурацию на серверах кнопкой в устройствах.  
-
speedEnable.5=/sbin/tc qdisc add dev eth0 parent 1:{PB} handle {PB}: sfq perturb 10 quantum 1500
+
-
speedEnable.6=<LOOP>
+
Качаем perl-вый скрипт manad, открываем файл manad_inet.pl, оставляем секцию ipfw, комментируем секцию iproute2:
-
speedEnable.7=/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio {PA} u32 match ip dst $ip  flowid 1:{PA}
+
<source lang="perl">
-
speedEnable.8=</LOOP>
+
###################iptw ################################
 +
$rule_start = 1000;
 +
$rule_delete_comand = ("/sbin/ipfw delete ");
 +
@pipe_delete_comand = ("/sbin/ipfw pipe delete ");
 +
$add_command = "/sbin/ipfw -q ";
 +
################################################################
-
speedEnable.9=<LOOP>
 
-
speedEnable.10=/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio {PB} u32 match ip src $ip flowid 1:{PB}
 
-
speedEnable.11=</LOOP>
 
-
speedEnable.12=<LOOP>
+
###########iproute2###############################################
-
speedEnable.13=/sbin/iptables -t filter -I FORWARD {N0} -s $ip -j ACCEPT
+
#$rule_start = 1;
-
speedEnable.14=</LOOP>
+
#$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 = "";
 +
###################################################################
 +
</source>
 +
Запускаем manad.
 +
Для теста теперь заходим в договор, если состояние сервиса еще не включено, то включаем его вручную правой кнопкой.  Заходим в сервис manad, на на вкладке опции  добавляем  опцию 1024, сохраняем сервис.
-
speedDisable=remove\t$servId
+
Если все нормально, то на стороне manad должно произойти примерно следующее:
 +
<source lang="bash">
 +
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
-
sa.command.inetOption.2.enable=$paramMulti(speedEnable)
+
</source>
-
sa.command.inetOption.2.disable=$paramMulti(speedDisable)
+
 
-
sa.command.inetOption.3.enable=$paramMulti(speedEnable)
+
Теперь заходим в сервис и  удаляем опцию. на стороне manad должно произойти примерно следующее:
-
sa.command.inetOption.3.disable=$paramMulti(speedDisable)
+
 
-
sa.command.inetOption.4.enable=$paramMulti(speedEnable)
+
<source lang="bash">
-
sa.command.inetOption.4.disable=$paramMulti(speedDisable)
+
request=remove 268|
-
sa.command.inetOption.5.enable=$paramMulti(speedEnable)
+
/sbin/ipfw delete 1000
-
sa.command.inetOption.5.disable=$paramMulti(speedDisable)
+
/sbin/ipfw pipe delete 101
 +
/sbin/ipfw pipe delete 100
Строка 251: Строка 282:
-
Добавляем устройство этого типа. Указываем Хост:порт через ":", например 127.0.0.1:4567.  Скриншоты.
+
Данная схема подразумевает управление скоростью с помощью опций inet. Опции можно задавать в тарифе.  Если сменить опцию, то посылаются команды на отключение старой опции и  подключения новой. Схема подразумевает, что на сервисе должна быть опция обязательно, причем только одна. Задана она может быть и тарифом.  Опции нужно объединить в группу опций, пересечение в которой не возможно(галочка не стоит).  При отключении сервиса с опцией посылаются команды отключения опции, при подключении - команды включения опции.  Если на сервисе нет опцией, то в данном примере ничего не посылается при отключении/включении.
 +
 
 +
perl-вый manad не сохраняет внутри себя никакой информации после перезагрузки. Эту проблему можно решить с помощью обработчика управления устройством(не путать с обработчиком активации сервиса) -
 +
ru.bitel.bgbilling.modules.inet.dyn.device.manad.ManadDeviceManager из стандартной поставки. Он управляет manad периодически, запрашивая его uptime, и определяет что manad перезагрузился.  Если manad перезагрузился, тогда для всех активных сервисов вызывается команды включения опций . Для включения обработчика управления устройством нужно добавить настройки
 +
 
 +
<source lang="bash">
 +
#синхронизовать сервисы при перезагрузке устройства
 +
sa.device.sync.onReboot=1
 +
#Интервал проверки перезагрузки устройства
 +
manage.uptime.pause.millis=600000
 +
 
 +
</source>
 +
 
 +
 
 +
При это чтобы правила не дублировались заново, нужно в скрипте запуска manad_inet.pl очистить все pipe и правила при старте. Потом обработчик активации управления устройства сам добавит все заново.
 +
 
 +
== Manad Linux(iproute2/iptables) ==
 +
 
 +
Заводим тип устройства Manad_iproute2.
 +
Обработчик активации сервисов - ru.bitel.bgbilling.modules.inet.dyn.device.manad.ManadServiceActivator.
 +
 
 +
Конфигурация типа устройства
 +
 
 +
<source lang="bash">
 +
 
 +
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
 +
</source>
 +
 
 +
Добавляем устройство этого типа. Указываем Хост:порт через ":", например 127.0.0.1:4567.
Не забываем добавить ip.resource.categoryId(и категорию тоже не забываем).
Не забываем добавить ip.resource.categoryId(и категорию тоже не забываем).
 +
 +
[[Файл:Inet_manad_tc_device_edit.png]]
 +
 +
 +
 +
 +
 +
 +
[[Файл:Inet_manad_tc_device.png]]
 +
Добавляем тип сервиса Manad_iproute2, в нем прописываем const.device.id (если устройство одно, чтобы не выбирать его каждый раз на договоре). И  
Добавляем тип сервиса Manad_iproute2, в нем прописываем const.device.id (если устройство одно, чтобы не выбирать его каждый раз на договоре). И  
Строка 258: Строка 346:
title.pattern=(${addressRange})
title.pattern=(${addressRange})
</source>
</source>
-
Скриншот
 
 +
[[Файл:Inet_manad_tc_serv_type_edit.png]]
 +
Добавляем сервис на договоре, указываем ip. 
-
Добавляем сервис на договоре, указываем ip. Скриншот
+
[[Файл:Inet_manad_tc_serv_edit.png]]
-
Добавляем Опции в модуле inet. Скриншот
+
 
 +
 
 +
[[Файл:Inet_manad_tc_serv.png]]
 +
 
 +
Добавляем Опции в модуле inet.  
 +
 
 +
[[Файл:Inet_manad_tc_options.png]]
Для полученных кодов опций прописываем команды в типе устройства (пример конфигурации выше, опции sa.command.inetOption.x). В данном пример  мы используем  опции с кодами 2,3,4,5.
Для полученных кодов опций прописываем команды в типе устройства (пример конфигурации выше, опции sa.command.inetOption.x). В данном пример  мы используем  опции с кодами 2,3,4,5.
В каждой их опции прописываем параметр speed
В каждой их опции прописываем параметр speed
-
<source>
+
<source lang="bash">
speed=1024
speed=1024
</source>
</source>
-
Скриншот
+
 
 +
[[Файл:Inet_manad_tc_options_edit.png]]
 +
 
Перечитываем конфигурацию на серверах кнопкой в устройствах.  
Перечитываем конфигурацию на серверах кнопкой в устройствах.  
Качаем perl-вый скрипт manad, открываем файл manad_inet.pl, комментируем секцию ipfw, раскомментируем секцию iproute2:
Качаем perl-вый скрипт manad, открываем файл manad_inet.pl, комментируем секцию ipfw, раскомментируем секцию iproute2:
-
<source lang="bash">
+
<source lang="perl">
###################iptw ################################
###################iptw ################################
#$rule_start = 1000;
#$rule_start = 1000;
Строка 291: Строка 388:
$add_command = "";
$add_command = "";
###################################################################
###################################################################
 +
 +
</source>
 +
 +
На этой же машине  инициализируем правила iproute2 cпомощь скрипта init_shaping.sh
 +
 +
<source lang="bash">
 +
#!/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
</source>
</source>
Строка 297: Строка 414:
Для теста теперь заходим в договор, если состояние сервиса еще не включено, то включаем его вручную правой кнопкой.  Заходим в сервис manad_iproute2, на на вкладке опции  добавляем  опцию 1024, сохраняем сервис.
Для теста теперь заходим в договор, если состояние сервиса еще не включено, то включаем его вручную правой кнопкой.  Заходим в сервис manad_iproute2, на на вкладке опции  добавляем  опцию 1024, сохраняем сервис.
 +
 +
Если все нормально, то на стороне manad должно произойти примерно следующее:
 +
<source lang="bash">
 +
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
 +
 +
</source>
 +
 +
Теперь заходим в сервис и  удаляем опцию. на стороне manad должно произойти примерно следующее:
 +
 +
<source lang="bash">
 +
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
 +
 +
</source>
 +
 +
 +
Данная схема подразумевает управление скоростью с помощью опций inet. Опции можно задавать в тарифе.  Если сменить опцию, то посылаются команды на отключение старой опции и  подключения новой. Схема подразумевает, что на сервисе должна быть опция обязательно, причем только одна. Задана она может быть и тарифом.  Опции нужно объединить в группу опций, пересечение в которой не возможно(галочка не стоит).  При отключении сервиса с опцией посылаются команды отключения опции, при подключении - команды включения опции.  Если на сервисе нет опцией, то в данном примере ничего не посылается при отключении/включении.
 +
 +
perl-вый manad не сохраняет внутри себя никакой информации после перезагрузки. Эту проблему можно решить с помощью обработчика управления устройством(не путать с обработчиком активации сервиса) -
 +
ru.bitel.bgbilling.modules.inet.dyn.device.manad.ManadDeviceManager из стандартной поставки. Он управляет manad периодически, запрашивая его uptime, и определяет что manad перезагрузился.  Если manad перезагрузился, тогда для всех активных сервисов вызывается команды включения опций . Для включения обработчика управления устройством нужно добавить настройки
 +
 +
<source lang="bash">
 +
#синхронизовать сервисы при перезагрузке устройства
 +
sa.device.sync.onReboot=1
 +
#Интервал проверки перезагрузки устройства
 +
manage.uptime.pause.millis=600000
 +
 +
</source>
 +
 +
 +
При это чтобы правила не дублировались заново, нужно в скрипте запуска manad_inet.pl вызывать скрипт inet_shaping.sh, чтобы почистить все, потом обработчик активации управления устройства сам добавит все заново.

Текущая версия на 15:17, 30 декабря 2015

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, чтобы почистить все, потом обработчик активации управления устройства сам добавит все заново.

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