Привет, я использовал скрипт failover с . Теперь у меня проблема: переключение на резервное соединение автоматически происходит на eth2 и обратно не возвращается. Моя конфигурация:
# ------------------- header -------------------
# Скрипт от Tomas Kirnak, версия 1.0.7
# Если вы используете этот скрипт или редактируете и
# повторно используете его, пожалуйста, сохраняйте этот заголовок.
#
# Для дополнительной информации и подробностей
# об этом скрипте посетите страницу вики по адресу
#
# ------------------- header -------------------
# ------------- начало редактирования -------------
# Отредактируйте переменные ниже под свои нужды
# Укажите имена WAN-интерфейсов
:local InterfaceISP1 ether1
:local InterfaceISP2 ether2
# Укажите IP шлюзов (или имена интерфейсов в случае PPP)
:local GatewayISP1 192.168.0.1
:local GatewayISP2 192.168.1.1
# Укажите хост для проверки пинга — сейчас:
:local PingTarget 173.194.113.55
# Укажите, сколько неудачных пингов разрешено перед переключением
:local FailTreshold 3
# Определите увеличение distance маршрута при сбое
:local DistanceIncrease 2
# Редактирование скрипта ниже этого места может его сломать
# -------------- конец редактирования --------------
# Объявляем глобальные переменные
:global PingFailCountISP1
:global PingFailCountISP2
# Инициализация переменных PingFailCount, если скрипт запускается впервые
:if ([:typeof $PingFailCountISP1] = "nothing") do={:set PingFailCountISP1 0}
:if ([:typeof $PingFailCountISP2] = "nothing") do={:set PingFailCountISP2 0}
# Эта переменная будет хранить результаты одиночных попыток пинга
:local PingResult
# Проверяем ISP1
:set PingResult [ping $PingTarget count=1 interface=$InterfaceISP1]
:put $PingResult
:if ($PingResult = 0) do={
:if ($PingFailCountISP1 < ($FailTreshold+2)) do={
:set PingFailCountISP1 ($PingFailCountISP1 + 1)
:if ($PingFailCountISP1 = $FailTreshold) do={
:log warning "С ISP1 проблема на пути к $PingTarget — увеличиваем distance маршрутов."
:foreach i in=[/ip route find gateway=$GatewayISP1 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] + $DistanceIncrease)}
:log warning "Увеличение distance маршрутов завершено."
}
}
}
:if ($PingResult = 1) do={
:if ($PingFailCountISP1 > 0) do={
:set PingFailCountISP1 ($PingFailCountISP1 - 1)
:if ($PingFailCountISP1 = ($FailTreshold -1)) do={
:log warning "ISP1 снова может достучаться до $PingTarget — возвращаем original distance маршрутов."
:foreach i in=[/ip route find gateway=$GatewayISP1 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] - $DistanceIncrease)}
:log warning "Возврат distance маршрутов завершён."
}
}
}
# Проверяем ISP2
:set PingResult [ping $PingTarget count=1 interface=$InterfaceISP2]
:put $PingResult
:if ($PingResult = 0) do={
:if ($PingFailCountISP2 < ($FailTreshold+2)) do={
:set PingFailCountISP2 ($PingFailCountISP2 + 1)
:if ($PingFailCountISP2 = $FailTreshold) do={
:log warning "С ISP2 проблема на пути к $PingTarget — увеличиваем distance маршрутов."
:foreach i in=[/ip route find gateway=$GatewayISP2 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] + $DistanceIncrease)}
:log warning "Увеличение distance маршрутов завершено."
}
}
}
:if ($PingResult = 1) do={
:if ($PingFailCountISP2 > 0) do={
:set PingFailCountISP2 ($PingFailCountISP2 - 1)
:if ($PingFailCountISP2 = ($FailTreshold -1)) do={
:log warning "ISP2 снова может достучаться до $PingTarget — возвращаем original distance маршрутов."
:foreach i in=[/ip route find gateway=$GatewayISP2 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] - $DistanceIncrease)}
:log warning "Возврат distance маршрутов завершён."
}
}
}
# ------------------- header -------------------
# Скрипт от Tomas Kirnak, версия 1.0.7
# Если вы используете этот скрипт или редактируете и
# повторно используете его, пожалуйста, сохраняйте этот заголовок.
#
# Для дополнительной информации и подробностей
# об этом скрипте посетите страницу вики по адресу
#
# ------------------- header -------------------
# ------------- начало редактирования -------------
# Отредактируйте переменные ниже под свои нужды
# Укажите имена WAN-интерфейсов
:local InterfaceISP1 ether1
:local InterfaceISP2 ether2
# Укажите IP шлюзов (или имена интерфейсов в случае PPP)
:local GatewayISP1 192.168.0.1
:local GatewayISP2 192.168.1.1
# Укажите хост для проверки пинга — сейчас:
:local PingTarget 173.194.113.55
# Укажите, сколько неудачных пингов разрешено перед переключением
:local FailTreshold 3
# Определите увеличение distance маршрута при сбое
:local DistanceIncrease 2
# Редактирование скрипта ниже этого места может его сломать
# -------------- конец редактирования --------------
# Объявляем глобальные переменные
:global PingFailCountISP1
:global PingFailCountISP2
# Инициализация переменных PingFailCount, если скрипт запускается впервые
:if ([:typeof $PingFailCountISP1] = "nothing") do={:set PingFailCountISP1 0}
:if ([:typeof $PingFailCountISP2] = "nothing") do={:set PingFailCountISP2 0}
# Эта переменная будет хранить результаты одиночных попыток пинга
:local PingResult
# Проверяем ISP1
:set PingResult [ping $PingTarget count=1 interface=$InterfaceISP1]
:put $PingResult
:if ($PingResult = 0) do={
:if ($PingFailCountISP1 < ($FailTreshold+2)) do={
:set PingFailCountISP1 ($PingFailCountISP1 + 1)
:if ($PingFailCountISP1 = $FailTreshold) do={
:log warning "С ISP1 проблема на пути к $PingTarget — увеличиваем distance маршрутов."
:foreach i in=[/ip route find gateway=$GatewayISP1 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] + $DistanceIncrease)}
:log warning "Увеличение distance маршрутов завершено."
}
}
}
:if ($PingResult = 1) do={
:if ($PingFailCountISP1 > 0) do={
:set PingFailCountISP1 ($PingFailCountISP1 - 1)
:if ($PingFailCountISP1 = ($FailTreshold -1)) do={
:log warning "ISP1 снова может достучаться до $PingTarget — возвращаем original distance маршрутов."
:foreach i in=[/ip route find gateway=$GatewayISP1 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] - $DistanceIncrease)}
:log warning "Возврат distance маршрутов завершён."
}
}
}
# Проверяем ISP2
:set PingResult [ping $PingTarget count=1 interface=$InterfaceISP2]
:put $PingResult
:if ($PingResult = 0) do={
:if ($PingFailCountISP2 < ($FailTreshold+2)) do={
:set PingFailCountISP2 ($PingFailCountISP2 + 1)
:if ($PingFailCountISP2 = $FailTreshold) do={
:log warning "С ISP2 проблема на пути к $PingTarget — увеличиваем distance маршрутов."
:foreach i in=[/ip route find gateway=$GatewayISP2 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] + $DistanceIncrease)}
:log warning "Увеличение distance маршрутов завершено."
}
}
}
:if ($PingResult = 1) do={
:if ($PingFailCountISP2 > 0) do={
:set PingFailCountISP2 ($PingFailCountISP2 - 1)
:if ($PingFailCountISP2 = ($FailTreshold -1)) do={
:log warning "ISP2 снова может достучаться до $PingTarget — возвращаем original distance маршрутов."
:foreach i in=[/ip route find gateway=$GatewayISP2 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] - $DistanceIncrease)}
:log warning "Возврат distance маршрутов завершён."
}
}
}
