В моих скрижалях есть нашел я нашел одну заметку, о которой стоит написать еще одну краткую опорную статью – настройка ограничения объема трафика на Mikrotik RBSXTR R11e-LTE. Хотя, устройство Mikrotik может быть и другое. И даже не обязательно выполнять настройку ограничения именно для LTE интерфейса. Скрипт, про который я расскажу ниже, можно адаптировать и для Ethernet интерфейса.
Этот скрипт написал не я. Я взял за основу вот это решение и немного его скорректировал.
Описание решения
Есть резернвый канал связи, который использует LTE на устройстве Mikrotik RBSXTR R11e-LTE. Тариф предусматривает определенный объем ежемесячного трафика. Необходимо настроить скрипт, который будет отключать LTE интерфейс по достижении указанного порогового значения.
Звучит достаточно понятно. Приступим к реализации.
Реализация
Как я уже сказал ранее, я взял за основу уже готовое решение и скорректировал его для работы с LTE интерфейсом:
:global persistVar do={
:local varName $1;
:local varValue $2;
:local varID [/ip firewall layer7-protocol find name="$varName"];
:if ([:typeof $varValue] = "nothing") do={
:if ($varID != "") do={
:set $varValue [/ip firewall layer7-protocol get $varID value-name=regexp];
}
} else={
:if ($varID = "") do={
/ip firewall layer7-protocol add name="$varName" regexp="$varValue"
} else={
/ip firewall layer7-protocol set $varID regexp="$varValue"
}
}
return $varValue
}
:do {
####################################################################################################
# User config
#Set limit in MB
:local limit 92160;
#Set day to reset limit
:local dayresetlimit "22";
#Set interface
:local interf "lte1";
#Set auto bring up interface
:local autointon true;
####################################################################################################
:local day ([:pick [/system clock get date] 4 6]);
:local newdata;
:local result;
:local ref;
:local status;
:local tx [/interface get $interf tx-byte];
:local rx [/interface get $interf rx-byte];
:set $newdata (($rx + $tx) / 1024 / 1024);
:if ([:len [$persistVar wan_counter]] < 1 ) do={
$persistVar wan_counter 0;
}
:if ([:len [$persistVar wan_rebootblock]] < 1 ) do={
$persistVar wan_rebootblock 1;
}
:if ([:len [$persistVar wan_offset]] < 1 ) do={
$persistVar wan_offset 0;
}
:if ([:len [$persistVar wan_refdata]] < 1 ) do={
$persistVar wan_refdata 0;
}
:local rebootblocker ([$persistVar wan_rebootblock]);
:if ( $day = $dayresetlimit and $rebootblocker = 0) do={
$persistVar wan_counter 0;
$persistVar wan_offset $newdata;
$persistVar wan_refdata 0;
/interface lte set $interf disabled=no
$persistVar wan_rebootblock 1;
:log info "Limit reset, int $interf bring up";
}
:if ( $day != $dayresetlimit ) do={
$persistVar wan_rebootblock 0;
}
:local before [$persistVar wan_counter];
:local offset [$persistVar wan_offset];
:if ( $newdata < $before ) do={
$persistVar wan_offset 0;
:set $ref [$persistVar wan_refdata];
:if ( $newdata < $ref ) do={
set $ref (0)
}
:set $result ($before + $newdata - $ref);
$persistVar wan_refdata $newdata;
$persistVar wan_counter $result;
} else={
:set $result ($newdata - $offset);
$persistVar wan_counter $result;
}
:local traffic ([$persistVar wan_counter]);
:local percent ($traffic*100 / $limit);
:log warning "Limit: $limit MB Traffic: $traffic MB Used: $percent%";
:if ($percent >= 100) do={
/interface lte set $interf disabled=yes
}
:if ($percent < 100 and $autointon = true) do={
:set $status [/interface get $interf value-name=disabled];
:if ($status = true) do={
/interface lte set $interf disabled=no
}
}
} on-error={ :log error "Error LTE Limiter "};
Жирным шрифтом я отметил ключевые моменты в скрипте.
Далее необходимо добавить скрипт в конфигурацию Mikrotik:
А также настроить его запуск в планировщике. Например, запускать его раз в час.
После этого скрипт будет рапортовать в журнал текущий объем израсходованного за месяц трафика и отключать LTE интерфейс при превышении его объема.
Настройка ограничения объема трафика на Mikrotik RBSXTR R11e-LTE завершена.
Настройка ограничения объема трафика на Mikrotik RBSXTR R11e-LTE: 7 комментариев
Спасибо за статью! В скриптах совсем не очень я =)
А как в скрипте указать чтобы считал трафик с 1 по 30 числи вместо 20 дней? Или он автоматически с 1-го чиста считает 20 ней?
Добрый день! Считаются все дни месяца. В строке ниже вы указываете в какой день месяца обнулять счетчик траффика:
:local dayresetlimit “22”
Спасибо! А что если микроник перезагрузился и счетчик обнулился.. То как быть тогда?
*микротик. А еще вижу какие-то данные в Layer7Protocols, за что они отвечают?
Возникла идея: а если смотреть лимит траффика по USSD-запросу, благо микротик это умеет? Может, это будет проще и не будет зависеть от выключений/перезагрузок девайса и сброса счетчиков? Ну и корректнее – а то счетчики траффика это одно, а биллинг оператора – совсем другое..
вот это: /tool sms send type=ussd lte1 phone-number=”*121#” работает, ответ пишет в лог gsm.info
осталось разобрать ответ.
Добрый день! Идея в целом здравая, даже тоже думал в этом направлении, но у меня пока особо нет времени погружаться в эту разработку. Плюс наше GMS шлю испольузется редко и только в качестве резервного канала. Перезагрузки оборудования крайне редкие. Поэтому конкретно в моем случае цель не оправдывает средства.
Если вы доработаете это решение, то при желании, можете дополнить комментарий и я включу это дополнение в публикацию с указанием того, что вы являетесь автором дополнения (или на GitHub можете выложить). Думаю, что нашим с вами коллегам, кто столкнулся с такой же потребностью, этот материал будет очень полезен.
Да в том-то и беда, что я со скриптами микротика дела не имел до сих пор.. то есть в общих чертах, глядя на скрипт, я понимаю, что к чему, но сам такое не напишу. Поэтому “дорабатывать” я его буду.. долго.. 🙂 , пока разберусь, что к чему.