MikroTik - Script LTE auto

Скрипт проверки и автонастройки LTE интерфейса, и в случаи его отсутствии сбрасывает питание на USB порту.

Скрипт корректно работает только с одним lte интерфейсом.

Для нормальной работы скрипта, необходимо скрипт поместить в cron и lte интерфейс руками не настраивать, скрипт сам настроит MikroTik так как надо.

Настройка скрипта

:local addresses "8.8.8.8,8.8.4.4,77.88.8.8,77.88.8.1,77.88.8.88,77.88.8.2";
:local TimePowerReset 5;

addresses – список iP адресов которые разделены запятой, они необходимы для проверки наличия интернета. Именно адреса из этого списка будут пинговатся.

TimePowerReset – значение в секундах, но какое время будет выключено питание на USB порту MikroTik.

Константы

:local CommentRule "LTE Automation Script From vasilevkirill.com";
:local CountLteAllInterface [/interface lte print count-only];
:local CountLteSettingsInterface [/interface lte print count-only where comment="$CommentRule"];
:local Continue false;
:local NeedTest true;

CommentRule – Данная фраза, будет добавлена во все настройки MikroTik который будет делать данный скрипт, данная строка должна быть уникальным.

CountLteAllInterface – Количество LTE интерфейсов, которое на момент запуска скрипта есть в MikroTik

CountLteSettingsInterface – Количество LTE интерфейсов, которое на момент запуска скрипта есть в MikroTik с комментарием, указанным в переменной CommentRule.

Continue – Управляющая переменная, тип статус.

NeedTest – Управляющая переменная, тип статус.

Шаг первый - проверка условий

:if ($CountLteAllInterface = 0) do={
    :set Continue false;
    :set NeedTest false;
} else={
    :set Continue true;
}

Проверяем наличие LTE интерфейса, если интерфейсов нет, то нет смысла вообще хоть что-нибудь делать.

Если всё же интерфейс есть, то ставим статус продолжения работы.

Шаг второй - настройка

:if ($Continue and $CountLteSettingsInterface=0) do={
    :local LteNameInterface [/interface lte get [find] name];
    /interface lte set comment="$CommentRule" [find name="$LteNameInterface"]
    /ip firewall nat remove [find comment="$CommentRule"]
    /ip firewall nat add action=masquerade chain=srcnat out-interface="$LteNameInterface" disabled=no comment="$CommentRule"
    /ip dhcp-client remove [find comment="$CommentRule"]
    /ip dhcp-client add default-route-distance=50 disabled=no interface="$LteNameInterface" comment="$CommentRule"
    /ping 127.0.0.1 count=15
    :local LTEgateway [/ip route get [find dst-address="0.0.0.0/0" distance=50] gateway]
    /ip route remove [find routing-mark="$CommentRule"]
    /ip route add disable=no routing-mark="$CommentRule" gateway=$LTEgateway dst-address="0.0.0.0/0" comment="$CommentRule"
    /ip route rule remove [find comment="$CommentRule"]
    /ip route rule add action=lookup-only-in-table routing-mark="$CommentRule" table="$CommentRule" comment="$CommentRule"
    :set Continue false;
    :set NeedTest false;
}

:if ($Continue and $CountLteSettingsInterface=0) do={ - Начинаем настройку MikroTik только в том случае если, флаг для продолжения true и количество интерфейсов LTE с комментарием CommentRule ровно нулю.

LteNameInterface - Получаем имя инетрфейса в переменную

/interface lte set comment="$CommentRule" [find name="$LteNameInterface"] - Устанавливаем комментарий на интерфейс Lte.

/ip firewall nat remove [find comment="$CommentRule"] - Удаляем все созданные до этого момента нашим скриптом правила NAT.

/ip firewall nat add action=masquerade chain=srcnat out-interface="$LteNameInterface" disabled=no comment="$CommentRule" - Создаём правило маскарада.

/ip dhcp-client remove [find comment="$CommentRule"] - Удаляем все созданные до этого момента dhcp-client настройки.

/ip dhcp-client add default-route-distance=50 disabled=no interface="$LteNameInterface" comment="$CommentRule" - Создаём новый dhcp-client.

/ping 127.0.0.1 count=15 - Делаем паузу в 15 секунд, для того чтобы dhcp-client смог получить все настройки от dhcp сервера.

:local LTEgateway [/ip route get [find dst-address="0.0.0.0/0" distance=50] gateway] - Получаем IP адрес Шлюза

/ip route remove [find routing-mark="$CommentRule"] - Удаляем все маршруты, созданные до этого момента нашим скриптом.

/ip route add disable=no routing-mark="$CommentRule" gateway=$LTEgateway dst-address="0.0.0.0/0" comment="$CommentRule" - Добавляем дефолтный маршрут, с оригинальной таблицы, которая нам необходима для проверки интернета только через LTE интерфейс.

/ip route rule remove [find comment="$CommentRule"] - Удаляем все правила маршрутизации, созданные до этого момента нашим скриптом.

/ip route rule add action=lookup-only-in-table routing-mark="$CommentRule" table="$CommentRule" comment="$CommentRule" - Добавляем правило маршрутизации, которое гарантирует, что трафик не когда не уйдёт в таблицу main

:set Continue false; - На будущее, дальше делать нечего

:set NeedTest false; - Не будем проверять наличие интернета, у только что созданного LTE интерфейса.

Шаг третий - проверка наличия интернета

:if ($NeedTest) do={
    :local InternetIsset false
    :local addr [:toarray $addresses]
    :foreach ipp in $addr do={
        :if ($InternetIsset=false) do={
            :if ([/ping address=$ipp routing-table="$CommentRule" count=3] = 0) do={
                /log warning message="Test LTE Internet fail address $ipp"
            } else={
                /log warning message="Test LTE Internet success $ipp"
                :set InternetIsset true;
            }
        }
    }

    :if ($InternetIsset=false) do={
        /system routerboard usb power-reset duration=$TimePowerReset
    }
}

Пингуем каждый IP адрес из списка, если как минимум один из хостов откликнулся, то считаем, что интернет живой на канале.

Сприпт целиком

:local addresses "8.8.8.8,8.8.4.4,77.88.8.8,77.88.8.1,77.88.8.88,77.88.8.2";
:local TimePowerReset 5;

:local CommentRule "LTE Automation Script From vasilevkirill.com";
:local CountLteAllInterface [/interface lte print count-only];
:local CountLteSettingsInterface [/interface lte print count-only where comment="$CommentRule"];
:local Continue false;
:local NeedTest true;

:if ($CountLteAllInterface = 0) do={
    :set Continue false;
    :set NeedTest false;
} else={
    :set Continue true;
}

:if ($Continue and $CountLteSettingsInterface=0) do={
    :local LteNameInterface [/interface lte get [find] name];
    /interface lte set comment="$CommentRule" [find]
    /ip firewall nat remove [find comment="$CommentRule"]
    /ip firewall nat add action=masquerade chain=srcnat out-interface="$LteNameInterface" disabled=no comment="$CommentRule"
    /ip dhcp-client remove [find comment="$CommentRule"]
    /ip dhcp-client add default-route-distance=50 disabled=no interface="$LteNameInterface" comment="$CommentRule"
    /ping 127.0.0.1 count=15
    :local LTEgateway [/ip route get [find dst-address="0.0.0.0/0" distance=50] gateway]
    /ip route remove [find routing-mark="$CommentRule"]
    /ip route add disable=no routing-mark="$CommentRule" gateway=$LTEgateway dst-address="0.0.0.0/0" comment="$CommentRule"
    /ip route rule remove [find comment="$CommentRule"]
    /ip route rule add action=lookup-only-in-table routing-mark="$CommentRule" table="$CommentRule" comment="$CommentRule"
    :set Continue false;
    :set NeedTest false;
}

:if ($NeedTest) do={
    :local InternetIsset false
    :local addr [:toarray $addresses]
    :foreach ipp in $addr do={
        :if ($InternetIsset=false) do={
            :if ([/ping address=$ipp routing-table="$CommentRule"  count=3] = 0) do={
                /log warning message="Test LTE Internet fail address $ipp"
            } else={
                /log warning message="Test LTE Internet success $ipp"
                :set InternetIsset true;
            }
        }
    }

    :if ($InternetIsset=false) do={
        /system routerboard usb power-reset duration=$TimePowerReset
    }
}

Контакты

vasilevkirill.com
г. Санкт-Петербург
Т:+7 (905) 207-3578
Мы работаем ежедневно с 10:00 до 18:00
Васильев Кирилл
me@vasilevkirill.com