@EnumaElis

Два провайдера. Как проверить ранее упавший канал скриптом?

Здравствуйте.

По некоторым причинам, реализация failover'а нужна через скрипт. Видел несколько скриптов, взял один из них, немного модифицировав:

:local MainIf "ether1";
:local RsrvIf "ether5";
:local PingCount 5;
:local PingTargets {78.88.8.8; 87.250.250.203; 8.8.8.8};
:local MainIfInetOk false;
:local RsrvIfInetOk false;
:local MainPings 0;
:local RsrvPings 0;
:local mikroName [/system identity get name];
:local mikroDate [/system clock get date];
:local mikroTime [/system clock get time];

:log info ("== START PING to $PingTargets ==");

foreach host in=$PingTargets do={
 :local res [/ping $host count=$PingCount interface=$MainIf];
 :set MainPings ($MainPings + $res);
 :local res [/ping $host count=$PingCount interface=$RsrvIf];
 :set RsrvPings ($RsrvPings + $res);
}

:log info ("== Main pings success: $MainPings ==");
:log info ("== Rsrv pings success: $RsrvPings ==");

:set MainIfInetOk ($MainPings >= 10);
:set RsrvIfInetOk ($RsrvPings >= 10);

:local MainGWDistance [/ip route get [find comment="ISP1"] distance];
:local RsrvGWDistance [/ip route get [find comment="ISP2"] distance];

if ($MainIfInetOk && ($MainGWDistance >= $RsrvGWDistance)) do={
 /ip route set [find comment="ISP1"] distance=1;
 /ip route set [find comment="ISP2"] distance=2;
 foreach i in=[/ip firewall connection find dst-address~":1723"] do={/ip firewall connection remove $i};
 /tool e-mail send from="mail@mail.mail" server=10.10.10.10 to="mail@mail.mail" \ 
 body=("$mikroName switched to _PRIMARY_ ISP at ($mikroDate in $mikroTime)") subject="Mikrotik: $mikroName INTERNET MAIN UP";
 /log info ">>> Switched to main internet connection";
}

if (!$MainIfInetOk && $RsrvIfInetOk && ($MainGWDistance <= $RsrvGWDistance)) do={
 /ip route set [find comment="ISP1"] distance=2;
 /ip route set [find comment="ISP2"] distance=1;
 foreach i in=[/ip firewall connection find dst-address~":1723"] do={/ip firewall connection remove $i};
 /tool e-mail send from="mail@mail.mail" server=10.10.10.10 to="mail@mail.mail" \
 body=("$mikroName switched to _SECONDARY_ ISP at ($mikroDate in $mikroTime)") subject="Mikrotik: $mikroName INTERNET MAIN DOWN";
 /log info ">>> Switched to reserved internet connection";
}

:log info ("== DUAL ISP script end ==");


/ip route
add comment=ISP1 distance=1 gateway=IP_GW1
add comment=ISP2 distance=2 gateway=IP_GW2


Скрипт отрабатывается раз в минуту. В случае падения основного канала, он успешно переключает на резервный канал, сбрасывает VPN-соединения и шлёт письмо.
Проблема в том что, как я выяснил нагуглив, нельзя пинговать через интерфейсы IPv4: , оттуда:
interface (string; Default: )	Which interface to use (required when pinging IPv6 address)

Резонный вопрос, как эти скрипты вообще могли работать у людей?
Т.е. вот эта часть скрипта: "/ping $host count=$PingCount interface=$MainIf", при переключении дистанции, всегда возвращает "нет ответа от хоста", даже при том что основной канал уже мог вернуться к жизни.

Как можно проверить вернулся ли основной провайдер в строй?
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 1
l0ser140
@l0ser140
Параметр interface не работает с ipv4. Да и с ipv6 делает не то, что вы хотите.
В качестве параметра к ping необходимо указывать routing-table и иметь соответственно маршруты через шлюзы 1 и 2 провайдера, помеченные соответствующими роут-метками.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
от 160 000 до 200 000 руб.
WakeApp Москва
от 70 000 руб.
QRate Москва
от 120 000 руб.
15 авг. 2018, в 22:39
60000 руб./за проект
15 авг. 2018, в 22:01
6000 руб./за проект
15 авг. 2018, в 21:18
30000 руб./за проект