@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", при переключении дистанции, всегда возвращает "нет ответа от хоста", даже при том что основной канал уже мог вернуться к жизни.

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

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

Войти через центр авторизации
Похожие вопросы