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()}
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
Создайте тип устройства-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
Создайте тип устройства с названием SA-Rerouting, с обработчиком активации сервисов RecipientListServiceActivator, в конфигурации укажите:
# При пересинхронизации вызываем onAccountingStart
sa.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=
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
Создайте дочерние устройства-папки 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
-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
})]