Обработчик активации сервисов для Manad
Материал из BiTel WiKi
Stark (Обсуждение | вклад) |
Stark (Обсуждение | вклад) |
||
Строка 116: | Строка 116: | ||
<source lang="bash"> | <source lang="bash"> | ||
- | + | 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 | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
</source> | </source> | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
Строка 152: | Строка 133: | ||
<source lang="bash"> | <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> | |
- | + | ||
- | + | ||
- | + | ||
- | sa.command. | + | |
- | + | ||
- | + | ||
- | + | ||
</source> | </source> | ||
Версия 15:11, 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> будет работать и в предыдущей схеме с одним сервисом(как частный случай).
Добавления сервисов для обоих описанных случаев можно увидеть тут :
Там вначале идет отдельный сервис с 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.
Конфигурация типа устройства
speedCommands.1=add\t$servId\t speedCommands.2=pipe {P0} config bw $param($option,speed,100) speedCommands.3=pipe {P1} config bw $param($option,speed,100) speedCommands.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.inetOption.2.enable=$paramMulti(speedCommands) sa.command.inetOption.3.enable=$paramMulti(speedCommands) sa.command.inetOption.4.enable=$paramMulti(speedCommands) sa.command.inetOption.5.enable=$paramMulti(speedCommands) sa.command.inetOption.2.disable.1=remove\t$servId sa.command.inetOption.3.disable.1=remove\t$servId sa.command.inetOption.4.disable.1=remove\t$servId sa.command.inetOption.5.disable.1=remove\t$servId
Добавляем устройство этого типа. Указываем Хост:порт через ":", например 127.0.0.1:4567. Не забываем добавить ip.resource.categoryId(и категорию тоже не забываем).
Добавляем тип сервиса Manad, в нем прописываем const.device.id (если устройство одно, чтобы не выбирать его каждый раз на договоре). И
title.pattern=(${addressRange}|>)
Добавляем сервис на договоре, указываем ip.
Добавляем Опции в модуле inet.
Для полученных кодов опций прописываем команды в типе устройства (пример конфигурации выше, опции sa.command.inetOption.x). В данном пример мы используем опции с кодами 2,3,4,5. В каждой их опции прописываем параметр speed
speed=1024
Перечитываем конфигурацию на серверах кнопкой в устройствах.
Качаем 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.
Конфигурация типа устройства
speedEnable.1=add\t$servId\t 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> speedEnable.7=/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio {PA} u32 match ip dst $ip flowid 1:{PA} speedEnable.8=</LOOP> 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> speedEnable.13=/sbin/iptables -t filter -I FORWARD {N0} -s $ip -j ACCEPT speedEnable.14=</LOOP> speedDisable=remove\t$servId #команды влючение/выключения опций sa.command.inetOption.2.enable=$paramMulti(speedEnable) sa.command.inetOption.2.disable=$paramMulti(speedDisable) sa.command.inetOption.3.enable=$paramMulti(speedEnable) sa.command.inetOption.3.disable=$paramMulti(speedDisable) sa.command.inetOption.4.enable=$paramMulti(speedEnable) sa.command.inetOption.4.disable=$paramMulti(speedDisable) sa.command.inetOption.5.enable=$paramMulti(speedEnable) sa.command.inetOption.5.disable=$paramMulti(speedDisable)
Внимание. Этот макрос и пример команд устарел. Сейчас можно писать команды для всех опций без привязки к конкретному id. Описание есть в примере по ссылке выше. Вот пример как описывается сейчас(1,2 - это номера строк, а не коды опций
sa.command.common.inetOption.enable.1=sudo tc filter add dev $param(iface) protocol ip parent 1:0 prio 5 u32 ht $ip3:$ip4: match ip dst 0.0.0.0/0 flowid 1:$ip34 sa.command.common.inetOption.enable.2=sudo tc class add dev $param(iface) parent 1:0 classid 1:$ip34 htb rate {@speedRate} ceil {@speedCeil} quantum 2000 mtu 3000 burst 15k sa.command.common.inetOption.disable.1=sudo tc filter delete dev $param(iface) parent 1:0 protocol ip prio 5 handle $ip3:$ip4:800 u32 sa.command.common.inetOption.disable.2=sudo tc class delete dev $param(iface) parent 1:0 classid 1:$ip34 htb rate {@speedRate} ceil {@speedCeil} quantum 2000 mtu 3000 burst 15k
Добавляем устройство этого типа. Указываем Хост:порт через ":", например 127.0.0.1:4567. Не забываем добавить ip.resource.categoryId(и категорию тоже не забываем).
Добавляем тип сервиса Manad_iproute2, в нем прописываем const.device.id (если устройство одно, чтобы не выбирать его каждый раз на договоре). И
title.pattern=(${addressRange}|>)
Добавляем сервис на договоре, указываем ip.
Добавляем Опции в модуле inet.
Для полученных кодов опций прописываем команды в типе устройства (пример конфигурации выше, опции sa.command.inetOption.x). В данном пример мы используем опции с кодами 2,3,4,5. В каждой их опции прописываем параметр speed
speed=1024
Перечитываем конфигурацию на серверах кнопкой в устройствах.
Качаем 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, чтобы почистить все, потом обработчик активации управления устройства сам добавит все заново.