В маршрутизаторах Mikrotik, а именно в RB941-2nD, иногда возникает проблема с зависшими peers в Firewall. Маршрутизатор ничего не может сделать с этой проблемой сам, поэтому приходится подключаться к нему вручную и производить удаление зависших peer на mikrotik. Это вычисляется по тому, что в логах шлюза, к которому пытается подключиться маршрутизатор, начинают появляться такие записи:

first L2TP UDP packet received from [ip-address]
Много повторов с коротким интервалом времени

Чтобы не делать это руками используем встроенный планировщик и скрипт для него:

{
:log info "IPSec Watchdog Started"
##### The host you want to ping######
:local HOST "10.74.0.1"
##### Interface to Remote Network#######
:local GW "company"
#### Ping Time out Increase or decrease as Required #####
:local TIMEOUT "100ms"
#### How Many try's ######
:local COUNT "10"
### If less than 8 successful reply's Restart IPSec#####
:local LESSTHAN "8"


##################################DONT EDIT BELOW###################################
:log info "Looking for $HOST at $GW"
:log info "Checking 10.74.0.1 via $GW"
:if ([/ping interface=$GW $HOST interval=$TIMEOUT count=$COUNT]<$LESSTHAN) \
do={log error "$HOST at $GW is unreachable. Forcing IPSec Restart"; /ip ipsec peer remove $GW} \
else {:log warning "IPSec Tunnel to $GW is OK Nothing to do"}
}

log info – запись в логе о том, что скрипт запустился

HOST – адрес шлюза, к которому подключается маршрутизатор

GW – интерфейс на маршрутизаторе, через который выполняется подключение

TIMEOUT – время ожидания ответа от команды Ping

COUNT – количество попыток

LESSTHAN – количество удачных попыток, если меньше этого числа, то срабатывает сброс IPSec

Добавление через Winbox

System > Scheduler > +

Установим необходимый интервал запуска скрипта в поле Interval, например, 5 минут.

Вставим скрипт в поле On Event. Вот он без комментариев:

{:log info "IPSec Watchdog Started"; :local HOST "10.74.0.1"; :local GW "company"; :local TIMEOUT "100ms"; :local COUNT "10"; :local LESSTHAN "8"; :log info "Looking for $HOST at $GW"; :log info "Checking 10.74.0.1 via $GW"; :if ([/ping interface=$GW $HOST interval=$TIMEOUT count=$COUNT]<$LESSTHAN) \
do={log error "$HOST at $GW is unreachable. Forcing IPSec Restart"; /ip ipsec peer remove $GW} \
else {:log warning "IPSec Tunnel to $GW is OK Nothing to do"}}

Добавление скрипта через терминал

Открываем терминал в Winbox или подключаемся к маршрутизатору через SSH, в этой команде сразу создается и задача в планировщике и тело задачи. Жирным выделены записи, которые Вам нужно заменить на свои. Выполняем команду:

system scheduler add name=company start-time=startup interval=00:10:00 on-event={{:log info "IPSec Watchdog Started"; :local HOST "10.74.0.1"; :local GW "company"; :local TIMEOUT "100ms"; :local COUNT "10"; :local LESSTHAN "8"; :log info "Looking for $HOST at $GW"; :log info "Checking 10.74.0.1 via $GW"; :if ([/ping interface=$GW $HOST interval=$TIMEOUT count=$COUNT]<$LESSTHAN) \
do={log error "$HOST at $GW is unreachable. Forcing IPSec Restart"; /ip ipsec peer remove $GW } \
else {:log warning "IPSec Tunnel to $GW is OK Nothing to do"}}}
/

Результат

Через указанный выше интервал времени планировщик будет запускать скрипт для проверки, выглядит в логах это так:

В этом примере все хорошо, о чем и сообщается в строке.

Если происходит зависание, то скрипт производит удаление зависших peer на mikrotik и перезапускает соединение: