Всем привет! Я делал скрипт, который смотрит в системный лог и если находит “ipsec,error” о неудачных переговорах phase1, добавляет адрес в черный список. Если кому-то интересно, вот скрипт, который сейчас у меня работает на паре роутеров. Скрипт состоит из функции для поиска дублирующихся адресов в списке адресов и самого основного скрипта. Функция загружается как глобальная переменная и её нужно перезагружать после каждого рестарта роутера.
# Функция для поиска дублирующихся IP в address-list
:global searchIPList do={
:local listName $1
:local ipAddr $2
:if ([:len [/ip firewall address-list find list=$listName]] > 0) do={
:foreach foundIP in=[/ip firewall address-list find list=$listName] do={
:if ($ipAddr = ([:pick [/ip firewall address-list print as-value where .id=$foundIP] 0]->"address")) do={
:return "duplicated"
}
}
}
}
Это основной скрипт, который можно добавить на роутер, как любой другой.
# Основной скрипт добавляет в черный список адреса, у которых не прошел IPSec phase1
:global searchIPList
:global myBlackListName "intruseBL"
:foreach i in=[/log find where (topics=ipsec,error && message~"phase1 negotiation failed")] do={
:local iplength [:find [/log get value-name=message number=$i] " "]
:if ([:typeof $iplength] = "num") do={
:if ([:toip [:pick [/log get value-name=message number=$i] 0 $iplength]]~"^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}") do={
:local intruseIP [:pick [/log get value-name=message number=$i] 0 $iplength]
:if ([:len [/ip firewall address-list find list=$myBlackListName]] > 0) do={
:if ([$searchIPList $myBlackListName $intruseIP] != "duplicated") do={
/ip firewall address-list add list=$myBlackListName address=$intruseIP
}
} else={
/ip firewall address-list add list=$myBlackListName address=$intruseIP
}
}
}
}
Армандо
# Функция для поиска дублирующихся IP в address-list
:global searchIPList do={
:local listName $1
:local ipAddr $2
:if ([:len [/ip firewall address-list find list=$listName]] > 0) do={
:foreach foundIP in=[/ip firewall address-list find list=$listName] do={
:if ($ipAddr = ([:pick [/ip firewall address-list print as-value where .id=$foundIP] 0]->"address")) do={
:return "duplicated"
}
}
}
}
Это основной скрипт, который можно добавить на роутер, как любой другой.
# Основной скрипт добавляет в черный список адреса, у которых не прошел IPSec phase1
:global searchIPList
:global myBlackListName "intruseBL"
:foreach i in=[/log find where (topics=ipsec,error && message~"phase1 negotiation failed")] do={
:local iplength [:find [/log get value-name=message number=$i] " "]
:if ([:typeof $iplength] = "num") do={
:if ([:toip [:pick [/log get value-name=message number=$i] 0 $iplength]]~"^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}") do={
:local intruseIP [:pick [/log get value-name=message number=$i] 0 $iplength]
:if ([:len [/ip firewall address-list find list=$myBlackListName]] > 0) do={
:if ([$searchIPList $myBlackListName $intruseIP] != "duplicated") do={
/ip firewall address-list add list=$myBlackListName address=$intruseIP
}
} else={
/ip firewall address-list add list=$myBlackListName address=$intruseIP
}
}
}
}
Армандо
