IPoE c Mikrotik в качестве шейпера

Данный пример предполагает выдачу абоненту биллингом адреса по DHCP и управление Mikrotik'ом с помощью Mikrotik-API для назначения скорости и ограничений данному IP-адресу.

Настройка

  1. На вкладке Устройства и ресурсы - IP-ресурсы создайте категорию IP-ресурса, а затем IP-ресурс в этой категории. Можете также указать роутер, маску подсети и DNS - они будут выданы в DHCP (данные параметры можно также указывать в конфигурации устройства-коммутатора).

  2. На вкладке Устройства и ресурсы - VLAN-ресурсы создайте категорию VLAN-ресурса и VLAN-ресурс.

  3. На вкладке Справочники - Опции создайте опцию-папку Скорость, создайте дочерние опции-скорости, укажите в их конфигурациях address list'ы Mikrotik'а, например:

    list=512k_ip
  4. На вкладке Устройства и ресурсы - Типы устройств создайте тип устройства с названием Access+Accounting.

  5. Создайте тип устройства 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()} and comment=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()} and comment=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=ssh
     
    sa.terminal.endSequence=\\[\w+@\w+\]\s+>\
    # Команда выхода (отключения)
    sa.terminal.exit=quit
  6. Создайте тип устройства-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=2
    dhcp.option82.agentRemoteId.position=0
    dhcp.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
  7. Создайте тип устройства с названием SA-Rerouting, с обработчиком активации сервисов RecipientListServiceActivator, в конфигурации укажите:

    # При пересинхронизации вызываем onAccountingStart
    sa.device.sync.onAccountingStart=1

    Устройство данного типа будут перенаправлять задания синхронизации на другу папку дерева устройств.

  8. Создайте тип устройства коммутатора доступа, например DGS-1100-06/ME, на вкладке Интерфейсы создайте интерфейсы (порты) коммутатора.

  9. В дереве устройств создайте устройство типа 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=1300
    connection.close.timeout=1300
     
    # Режим поиска сервиса договора, например, по VLAN
    dhcp.servSearchMode=4
     
    # Параметры тарификации
    accounting.worker.1.thread.count=1
    accounting.worker.1.tariffication.1.minDeltaAmount=0
    accounting.worker.1.tariffication.1.delay=10
    accounting.worker.1.tariffication.1.batchSize=500
    accounting.worker.1.tracking.1.delay=10
    accounting.worker.1.tracking.1.batchSize=500
    accounting.worker.2.thread.count=1
    accounting.worker.2.flushing.1.minDeltraAccount=0
    accounting.worker.2.flushing.1.delay=20
    accounting.worker.2.flushing.1.batchSize=500
    accounting.worker.3.thead.count=1
    accounting.worker.3.finishing.1.delay=20
    accounting.worker.3.finishing.1.batchSize=500
     
    # При выдаче Access-Accept заносим запись в БД
    connection.start.fromAccept=1
  10. Создайте дочерние устройства-папки BRASы, Relay, Коммутаторы:

    images/download/attachments/141393933/tree_1.PNG

  11. В папке BRASы создайте устройство типа RouterOS, укажите в поле Хост/порт IP-адрес данного BRAS'а, в полях Логин и Пароль - соответственно логин и пароль для управления данным устройством.

  12. В конфигурации папки Relay укажите в конфигурации, что для всех устройств в данной папке агентскими устройствами будут устройства в папке Коммутаторы, указав ID папки Коммутаторы:

    # Папка с агентскими устройствами (коммутаторами)
    device.agentDeviceRootId=14
  13. В папке Relay создайте устройство типа Cisco Catalist, в поле Хост/порт укажите IP-адрес данного устройства.

  14. В папке Коммутаторы создайте устройство типа SA-Rerouting и укажите в его конфигурации в параметре sa.recipientList.rootDeviceId ID папки BRASы, чтобы задания синхронизации дублировались на устройства данной папки:

    # Дублируем запросы синхронизации на другую папку устройств (BRASы)
    sa.recipientList.rootDeviceId=12
  15. В устройстве SA-Rerouting создайте дочернюю папку (например, для группировки по районам).

  16. Дочерним к устройству типа SA-Rerouting создайте устройство типа DGS-1100-06/ME, укажите в поле идентификатор MAC-адрес коммутатора:

    images/download/attachments/141393933/tree_2.PNG
  17. На вкладке Справочники - Типы сервисов создайте тип сервиса с названием, например IPoE, установите галочки устройство, интерфейс, интерфейс персонален, VLAN, VLAN персонален, MAC-адрес. Типа адреса: динамический или статический. В конфигурации:

    # Шаблон имени сервиса в договоре
    title.pattern=(${deviceIdentifier})/(${interfaceId})
  18. В договоре создайте сервис данного типа, укажите коммутатор, порт, VLAN и MAC-адрес.

Примечание

Указание всех полей в типе сервиса не является обязательным - важны лишь те поля, по которым идет поиск. Например, при поиске по VLAN обязательно нужно лишь указать устройство-коммутатор (не обязательно коммутатор доступа, этом может быть коммутатор агрегации, если у вас VLAN-per-User) и VLAN. Остальные поля могут быть использованы при управлении устройствами (коммутаторами).

Дереву устройств не обязательно быть именно таким. Если у вас один BRAS (шейпер), то SA-Rerouting не нужен. Если релеи не дублируются (т.е. в папке Relay будет только одно устройство), то не обязательно делать отдельные папки:
images/download/attachments/141393933/tree_3.PNG

Вариант конфигурации команд

# Хост подключения (если не указан, то используется хост из поля Хост/порт)
#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-accepted
sif=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.disable
sa.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})]