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