Mikrotik переключение vpn сервера, когда основной не доступен.

Опубликовано beregov.a.e - пт, 08/23/2019 - 12:33

Добрый день.

Столкнулся с проблемой, когда основой провайдер перестаёт работать. И vpn клиенты на mikrotik не могут подключиться так как в настройках только один ip указан сервера который в данным момент не доступен. Из-за чего возникает простой в работе. У кого openvpn клиент на компьютере то там проще. Так как в файле настроек можно перечислить несколько серверов для подключения. И когда основной провайдер падает то они сами подключаются по другому ip адресу.

Собственно сам скрипт.

:global switch do={/interface ovpn-client set connect-to=$goserver $int}
:local vpnserver1 "ip  сервера"
:local vpnserver2 "ip сервера"
:local int "ovpn-out1"
:local goserver
:local runvpn [/ip address print count-only value-list where interface=$int]
:local nowserver [/interface ovpn-client print count-only where connect-to=$vpnserver1]
if ($runvpn = 0) do={if ($nowserver = 1) do={$switch goserver=$vpnserver2 int=$int;}  else {$switch goserver=$vpnserver1 int=$int;}}

Описание по строкам:

:global switch do={/interface ovpn-client set connect-to=$goserver $int} функция переключения.

Для которой нужно передать две переменные. Ip сервера к которому подключаться и имя vpn интерфейса который нужно перенастроить для подключения на другой сервер.

:local vpnserver1 "ip  сервера"

первый ip адрес vpn сервера. Присваивается в инициализированную переменную vpnserver1

:local vpnserver2 "ip сервера"

втрой ip адрес vpn сервера. Присваивается в инициализированную переменную vpnserver2

Решение для двух ip адресов. Для большего количества потребуется цыкал. С проверкой что соединение благополучно установилось. Больше кода как следствие. У меня больше двух интернет каналов каналов не было у серверов. Так как если требуется мега надёжность то сервер нужно ставать где-нибудь в цоде. Так как иметь больше дух провайдеров на основном узле накладно по расходам. Да и к тому же, если дальше повышать надёжность то нужно ещё автономность по электрообеспечению серьёзную организовывать. ИБП, генераторы. Короче, два провайдера достаточно. Итак продолжим.

:local int "ovpn-out1"

Инициируем переменную и присваиваем в неё значение. Имя сетевого интерфейса который создаётся при удачном подключением к серверу openvpn.

:local goserver

Инициируем пустую переменную goserver. Будет использоваться для присвоения в неё ip адреса к которому будит подключаться роутер.

:local runvpn [/ip address print count-only value-list where interface=$int]

Инициализация переменно runvpn. Этой строкой проверяем работает vpn или нет. Возвращает в переменную значение 0 если vpn не работает или 1 если работает.

:local nowserver [/interface ovpn-client print count-only where connect-to=$vpnserver1]

Инициализация переменной $nowrun. И присваивается значение 1 если в настройках vpn подключения сервер ip такой же как в переменной $vpnserver1 и 0 если отличен.

if ($runvpn = 0) do={if ($nowserver = 1) do={$switch goserver=$vpnserver2 int=$int;}  else {$switch goserver=$vpnserver1 int=$int;}}

Тут происходит основная магия. В первом условии проверяется что сервер работает. if ($runvpn = 0). Если работает то на этом завершается работа скрипта. Если vpn не работает то переходим ко в второму условию if ($nowserver = 1). Магия этого условия следующая. Если ip совпадают то выполняется первое действие. И функции switch передаётся ip второго сервера для перенастройки vpn соединения, а если значения отличаются то ip первого сервера. На этом работа скрипта завершается.

Далее создаём задание по расписанию. В данном случае каждую минуту. И на этом всё.

Скрин для иллюстрации того как это выглядит.

mikrotik_vpn

 

Теги