IPoE c Mikrotik в качестве шейпера
Данный пример предполагает выдачу абоненту биллингом адреса по DHCP и управление Mikrotik'ом с помощью Mikrotik-API для назначения скорости и ограничений данному IP-адресу.
Настройка
На вкладке Устройства и ресурсы - IP-ресурсы создайте категорию IP-ресурса, а затем IP-ресурс в этой категории. Можете также указать роутер, маску подсети и DNS - они будут выданы в DHCP (данные параметры можно также указывать в конфигурации устройства-коммутатора).
На вкладке Устройства и ресурсы - VLAN-ресурсы создайте категорию VLAN-ресурса и VLAN-ресурс.
На вкладке Справочники - Опции создайте опцию-папку Скорость, создайте дочерние опции-скорости, укажите в их конфигурациях address list'ы Mikrotik'а, например:
list=512k_ipНа вкладке Устройства и ресурсы - Типы устройств создайте тип устройства с названием Access+Accounting.
Создайте тип устройства RouterOS, укажите в качестве Обработчика активации сервисов TerminalServiceActivator. Укажите в конфигурации данного типа устройства:
# Порт подключения (если не указан, то используется порт из поля Хост/порт)sa.terminal.port=8729# протокол подключения (telnet/ssh/tcp/mikrotik-api/mikrotik-api-ssl/shell)sa.terminal.protocol=mikrotik-api-ssl# Команда выхода (отключения)sa.terminal.exit=# Команды, вызываемые при включении опции ID=x (и дочерних опций по отношению к ID=x) на соединенииsa.terminal.connection.inetOption.1.enable.1=/ip/firewall/address-list/print .proplist=.id where address=${ip()}andcomment=bgb${servId()}sa.terminal.connection.inetOption.1.enable.2=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/address-list/remove .id=${mikrotikLastIds()}sa.terminal.connection.inetOption.1.enable.3=/ip/firewall/address-list/add address=${ip()} list=${param(option(1),'list','512k_ip')} comment=bgb${servId()}# команды, вызываемые при отключении опции ID=x (и дочерних опций по отношению к ID=x) на соединенииsa.terminal.connection.inetOption.1.disable.1=/ip/firewall/address-list/print .proplist=.id where address=${ip()}andcomment=bgb${servId()}sa.terminal.connection.inetOption.1.disable.2=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/address-list/remove .id=${mikrotikLastIds()}Обратите внимание на макрос ${param(option(1),'list','512k_ip')} - он берет текущую активную опцию, дочернюю по отношению к опции с ID=1 и получает значение параметра list из ее конфигурации (третий параметр - значение по умолчанию).
При работе через SSH настройки подключения будут такими (но также нужно будет поменять команды, т.к. в Mikrotik SSH и API синтаксис различается):
# Порт подключения (если не указан, то используется порт из поля Хост/порт)sa.terminal.port=22# протокол подключения (telnet/ssh/tcp/mikrotik-api/mikrotik-api-ssl/shell)sa.terminal.protocol=sshsa.terminal.endSequence=\\[\w+@\w+\]\s+>\# Команда выхода (отключения)sa.terminal.exit=quitСоздайте тип устройства-relay, например, Cisco Catalyst, укажите в конфигурации параметры разбора Agent-Remote-Id из Option 82, например:
dhcp.option82.removeHeader=2# Параметры для извлечения из пакета agentRemoteId# вид значения в опции agentRemoteId: 0 (по умолчанию) - байты, 1 - строка#dhcp.option82.agentRemoteId.type=0# код субопции 82, содержащей идентификатор коммутатора клиента, позиция и длина последовательности идентификатораdhcp.option82.agentRemoteId.code=2dhcp.option82.agentRemoteId.position=0dhcp.option82.agentRemoteId.length=6# код субопции 82, содержащей VLAN, позиция и длина в субопции#dhcp.option82.vlanId.code=1#dhcp.option82.vlanId.position=0#dhcp.option82.vlanId.length=2# код субопции 82, содержащей SVLAN, позиция и длина в субопции#dhcp.option82.agentSvlanId.code=1#dhcp.option82.agentSvlanId.position=0#dhcp.option82.agentSvlanId.length=2Создайте тип устройства с названием SA-Rerouting, с обработчиком активации сервисов RecipientListServiceActivator, в конфигурации укажите:
# При пересинхронизации вызываем onAccountingStartsa.device.sync.onAccountingStart=1Устройство данного типа будут перенаправлять задания синхронизации на другу папку дерева устройств.
Создайте тип устройства коммутатора доступа, например DGS-1100-06/ME, на вкладке Интерфейсы создайте интерфейсы (порты) коммутатора.
В дереве устройств создайте устройство типа Access+Accounting, оно будет "корневым" для приложений InetAccess и InetAccounting. Укажите в нем конфигурацию:
# Идентификатор DHCP-сервера (IP-адрес InetAccess)dhcp.serverIdentifier=10.0.25.35# Категория ресурсов VLAN для статического назначения абонентамvlan.resource.category=1# Категория IP-ресурсов для динамической выдачи абонентамdhcp.ipCategories=1# lease time, выдаваемый абонентуdhcp.option.leaseTime=1800# Таймаут закрытия сессии по отсутствию DHCP(RADIUS/Netflow)-пакетовconnection.suspend.timeout=1300connection.close.timeout=1300# Режим поиска сервиса договора, например, по VLANdhcp.servSearchMode=4# Параметры тарификацииaccounting.worker.1.thread.count=1accounting.worker.1.tariffication.1.minDeltaAmount=0accounting.worker.1.tariffication.1.delay=10accounting.worker.1.tariffication.1.batchSize=500accounting.worker.1.tracking.1.delay=10accounting.worker.1.tracking.1.batchSize=500accounting.worker.2.thread.count=1accounting.worker.2.flushing.1.minDeltraAccount=0accounting.worker.2.flushing.1.delay=20accounting.worker.2.flushing.1.batchSize=500accounting.worker.3.thead.count=1accounting.worker.3.finishing.1.delay=20accounting.worker.3.finishing.1.batchSize=500# При выдаче Access-Accept заносим запись в БДconnection.start.fromAccept=1Создайте дочерние устройства-папки BRASы, Relay, Коммутаторы:
В папке BRASы создайте устройство типа RouterOS, укажите в поле Хост/порт IP-адрес данного BRAS'а, в полях Логин и Пароль - соответственно логин и пароль для управления данным устройством.
В конфигурации папки Relay укажите в конфигурации, что для всех устройств в данной папке агентскими устройствами будут устройства в папке Коммутаторы, указав ID папки Коммутаторы:
# Папка с агентскими устройствами (коммутаторами)device.agentDeviceRootId=14В папке Relay создайте устройство типа Cisco Catalist, в поле Хост/порт укажите IP-адрес данного устройства.
В папке Коммутаторы создайте устройство типа SA-Rerouting и укажите в его конфигурации в параметре sa.recipientList.rootDeviceId ID папки BRASы, чтобы задания синхронизации дублировались на устройства данной папки:
# Дублируем запросы синхронизации на другую папку устройств (BRASы)sa.recipientList.rootDeviceId=12В устройстве SA-Rerouting создайте дочернюю папку (например, для группировки по районам).
Дочерним к устройству типа SA-Rerouting создайте устройство типа DGS-1100-06/ME, укажите в поле идентификатор MAC-адрес коммутатора:
На вкладке Справочники - Типы сервисов создайте тип сервиса с названием, например IPoE, установите галочки устройство, интерфейс, интерфейс персонален, VLAN, VLAN персонален, MAC-адрес. Типа адреса: динамический или статический. В конфигурации:
# Шаблон имени сервиса в договореtitle.pattern=(${deviceIdentifier})/(${interfaceId})В договоре создайте сервис данного типа, укажите коммутатор, порт, VLAN и MAC-адрес.
Примечание
Указание всех полей в типе сервиса не является обязательным - важны лишь те поля, по которым идет поиск. Например, при поиске по VLAN обязательно нужно лишь указать устройство-коммутатор (не обязательно коммутатор доступа, этом может быть коммутатор агрегации, если у вас VLAN-per-User) и VLAN. Остальные поля могут быть использованы при управлении устройствами (коммутаторами).
Дереву устройств не обязательно быть именно таким. Если у вас один BRAS (шейпер), то SA-Rerouting не нужен. Если релеи не дублируются (т.е. в папке Relay будет только одно устройство), то не обязательно делать отдельные папки:
Вариант конфигурации команд
# Хост подключения (если не указан, то используется хост из поля Хост/порт)#sa.terminal.host=# Порт подключения (если не указан, то используется порт из поля Хост/порт)sa.terminal.port=22# протокол подключения (telnet/ssh/tcp/mikrotik-api/mikrotik-api-ssl/shell)sa.terminal.protocol=ssh# Regex ожидания приглашения на выполнения командыsa.terminal.endSequence=\\[\w+@\w+\]\s+>\ # Команда выхода (отключения)sa.terminal.exit=quit# Макросы {@key} заменяются на этапе парсинга конфига, используемые параметры должны быть описаны выше использования, являются своеобразнами alias'ами# Макросы ${key()} заменяются на этапе выполнения командacl=ACL-acceptedsif=ether3# вытаскиваем SVLAN из callingStationId сессии (туда SVLAN попадает при предобработке DHCP-пакета)svlan=${calledStationId().replaceAll( /^(\d+)\/.+$/,'$1' )}vlan=${vlan()}interface="{@sif}.{@svlan}.{@vlan}"# скорость получаем из параметра активной опцииspeed=${param( option(), 'speed', '1' )}# На onAccountingStop вызываем sa.terminal.connection.modify.disablesa.terminal.connection.onAccountingStop.after=${connectionDisable()}# Команды, вызываемые при включении доступа (состояние стало "включено"), при старте соединения с нормальным доступомsa.terminal.connection.modify.enable.1=/ip firewall address-list add address=${ip()} list={@acl}# команды, вызываемые при ограничении доступа (состояние стало "отключено"), при стопе соединения и при старте соединения с ограниченным доступомsa.terminal.connection.modify.disable.1=/ip firewall address-list remove [/ip firewall address-list find address=${ip()}]sa.terminal.connection.modify.disable.2=/queue simple remove [/queue simple find name=("queue{@vlan}up")]sa.terminal.connection.modify.disable.3=/queue tree remove [/queue tree find name=("queue{@vlan}down")]sa.terminal.connection.modify.disable.4=/interface bridge filter remove [/interface bridge filter find out-interface=({@interface})]# Команды, вызываемые при включении опции ID=x (и дочерних опций по отношению к ID=x) на соединенииsa.terminal.connection.inetOption.1.enable.1=/interface bridge filter add action=mark-packet chain=output out-interface=({@interface}) new-packet-mark=("{@speed}down")sa.terminal.connection.inetOption.1.enable.2=/queue simple add name=("queue{@vlan}up") queue=("up-{@speed}M/default-small") target=({@interface})sa.terminal.connection.inetOption.1.enable.3=/queue tree add name=("queue{@vlan}down") packet-mark=("{@speed}down") parent=({@interface}) queue=("down-{@speed}M")# команды, вызываемые при отключении опции ID=x (и дочерних опций по отношению к ID=x) на соединенииsa.terminal.connection.inetOption.1.disable.1=/queue simple remove [/queue simple find name=("queue{@vlan}up")]sa.terminal.connection.inetOption.1.disable.2=/queue tree remove [/queue tree find name=("queue{@vlan}down")]sa.terminal.connection.inetOption.1.disable.3=/interface bridge filter remove [/interface bridge filter find out-interface=({@interface})]