Ответы пользователя по тегу Сетевое администрирование
  • Как правильно настроить IpSec мониторинг Mikrotik на Zаbbix?

    @Materique Автор вопроса
    Вернулся к задаче. После танцев с бубном, форумов и ГПТ наваял следующее. Скрипт пингует удаленный хост за IpSec. Если пинг отвалился, перезапускает политику с именем :local ipsecPolicyName "your_name". Проверяет снова, если пинга нет - второй раз перезапускает политику через :local initialRetryDelay 10s - интервал между 1ым и 2ым перезапуском . Если снова пинга нет, перезапускает политику :local maxRetries 3 (минус 1) - количество раз через :local subsequentRetryDelay 1m - интервал между 2ым и следующими перезапусками. Если после всех перезапусков пинг не появился, висит до появления пинга. После появления пинга скрипт перезапускается. Если политика отключена руками (до или во время выполнения скрипта), скрипт сообщает об этом и не трогает политику.

    :local pingSourceAddress "192.168.5.1" - адрес с которого идет пинг (у меня мост микрота)
    :local pingAddress "192.168.2.75" - адрес удаленного хоста
    :local ipsecDstAddressA "192.168.2.0/24" - удаленная подсеть для определения политики. Тут поясню - у политики нет имени (имя только у пира), но у политики есть dst/src address, именно так и определяем именно тут политику, которая Вам нужна. Т.к. если подсетей несколько, то и политик будет несколько, но "имена" политик будут одинаковые. В случае отсутствия параметра - будет перезапускать все политики с именем пира, что нежелательно. Можно смотреть где параметр ph2-state = no-phase2, но у меня часто бывают ситуации, когда ipsec лежит, а статус established - так что не вариант.

    Сам скрипт:

    # Parameters
    :local pingSourceAddress "192.168.5.1"
    :local pingAddress "192.168.2.75"
    :local ipsecDstAddressA "192.168.2.0/24"
    :local ipsecPolicyName "your_name"
    :local isPingSuccessful true
    # Telegram data
    :local chatID "-01234567899"
    :local botToken "99876543210:AAHTtyLVF3jjHyPvXVHOMoHe-QNvOkra7q0"
    # Number of restarts
    :local maxRetries 3
    :local retryCount 0
    # First interval for potics restart
    :local initialRetryDelay 10s
    # Secondary interval for potics restart
    :local subsequentRetryDelay 1m

    :while (true) do={
    # Ping to address
    :local pingResult [/ping address=$pingAddress src-address=$pingSourceAddress count=5];

    :if ($pingResult = 0) do={
    # If no ping
    :if ($isPingSuccessful) do={
    log warning "Ping $pingAddress unavailable. Checking IPSec policy status."
    /tool fetch url="https://api.telegram.org/bot$botToken/sendMessage?... $ipsecPolicyName Ping $pingAddress unavailable. Checking IPSec policy status.&parse_mode=HTML" keep-result=no
    :delay 2s

    # Check if the policy is already disabled
    :local policyStatus [/ip ipsec policy get [find peer=$ipsecPolicyName and dst-address=$ipsecDstAddressA] disabled];
    :if ($policyStatus = false) do={
    :set retryCount 0
    # First interval for potics restart
    :local retryDelay $initialRetryDelay
    :while ($retryCount < $maxRetries) do={
    log warning "Disabling IPSec policy $ipsecPolicyName."
    /ip ipsec policy set [find peer=$ipsecPolicyName and dst-address=$ipsecDstAddressA] disabled=yes
    :delay 3s

    log warning "Enabling IPSec policy $ipsecPolicyName."
    /ip ipsec policy set [find peer=$ipsecPolicyName and dst-address=$ipsecDstAddressA] disabled=no
    :delay 3s

    # Re-check ping after policy restart
    :local pingResultAfterRestart [/ping address=$pingAddress src-address=$pingSourceAddress count=5];
    :if ($pingResultAfterRestart = 0) do={
    log warning "Ping $pingAddress still unavailable after policy restart attempt ($retryCount+1)."
    /tool fetch url="https://api.telegram.org/bot$botToken/sendMessage?... $ipsecPolicyName Ping $pingAddress still unavailable after policy restart attempt ($retryCount+1)&parse_mode=HTML" keep-result=no
    :set retryCount ($retryCount + 1)
    :delay $retryDelay
    # Secondary interval for potics restart
    :if ($retryCount = 1) do={
    :set retryDelay $subsequentRetryDelay
    }
    } else={
    log warning "Ping $pingAddress became available after policy restart attempt ($retryCount+1)."
    /tool fetch url="https://api.telegram.org/bot$botToken/sendMessage?... $ipsecPolicyName Ping $pingAddress successful available after policy restart attempt ($retryCount+1).&parse_mode=HTML" keep-result=no
    :set retryCount $maxRetries
    }
    }
    } else={
    log warning "IPSec policy $ipsecPolicyName is already disabled. Skipping enable."
    }
    :set isPingSuccessful false
    }
    } else={
    # If ping successful
    :if (!$isPingSuccessful) do={
    log warning "Ping $pingAddress successful. Restart script."
    /tool fetch url="https://api.telegram.org/bot$botToken/sendMessage?... $ipsecPolicyName Ping $pingAddress successful. Restart script.&parse_mode=HTML" keep-result=no
    :set isPingSuccessful true
    }
    }

    # Delay between checks
    :delay 5s
    }
    Ответ написан
    Комментировать