В моих скрижалях есть нашел я нашел одну заметку, о которой стоит написать еще одну краткую опорную статью – настройка ограничения объема трафика на 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 завершена.