Скрипт Mikrotik Fail2ban

Написал скрипт  который ищет в логах неудачные попытки авторизации вида: login faillure for user и добавляет адреса с которых эти попытки сделаны в address-list BlackList.
Получается банит ssh, https, http, winbox, dude и т.д.
Чтобы забанить эти адреса нужно в firewall добавить правило которое блочит эти адреса, а так же в планировщике задать запуск по расписанию, конкретно для этого скрипта нужно запускать каждые 6 минут

/ip firewall raw add action=drop chain=prerouting comment="BlackList Drop All" src-address-list=BlackList

текст скрипта

:global attempt 3
:global temp
:global ipaddr
:global LogErr
:global string
:global signA " via";
:global signB "from ";
:set LogErr [/log find message~"login failure for user." time>([/system clock get time] - 6m)]
:foreach i in=$LogErr do={
:set string [:pick [/log get $i message ] 0 ([:len [/log get $i message ]])]
:set ipaddr [:pick $string ([:find $string $signB]+ 5) ($string [:find $string $signA])]
:if ([:len [/ip firewall address-list find address=$ipaddr]]=0) do {
/ip firewall address-list add list=AttemptBruteforce1 address=[:toip $ipaddr] timeout=30m
:log warning "attempt_bruteforce_1 $ipaddr"}
:if ([:len [/ip firewall address-list find address=$ipaddr]]>0 && [:len [/ip firewall address-list find address=$ipaddr]]<$attempt) do {
:set temp ([:len [/ip firewall address-list find address=$ipaddr]]+1)
/ip firewall address-list add list="AttemptBruteforce$temp" address=[:toip $ipaddr] timeout=30m
:log warning "attempt_bruteforce_ $temp $ipaddr"}
:if ([:len [/ip firewall address-list find address=$ipaddr]]=$attempt) do {
/ip firewall address-list add list=BlackList address=[:toip $ipaddr]
:log warning "Blocked_bruteforce_ip $ipaddr"}}

Лига Сисадминов

1.6K постов17.7K подписчиков

Добавить пост

Правила сообщества

Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.

27
Автор поста оценил этот комментарий

Я может глупость скажу, но не проще ли сделать вайтлист?

раскрыть ветку (1)
9
Автор поста оценил этот комментарий

Проще

показать ответы
1
Автор поста оценил этот комментарий

Так, и для чего тогда скрипт в данной ситуации?

Или у вас какой то эндпоинт для масс?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

у меня большая организация и соответсвенно много микротиков, white-list надо иногда чистить и дополнять, на каждый микротик заходить и делать это руками нет времени. Если скрипт будет просто банить брутфорсеров-будет красота.

показать ответы
Автор поста оценил этот комментарий

Допилил скрипт с помощью chat gpt, теперь она ищет ip только в определенных address list и может забанить одновременно несколько ip которые ломятся. Предыдущая версия банила только 1 ip если ломились например с 2х ip и потом через  6 минут банила второго так как первый переставал ломить т.к. его забанило.

:global attempt 3
:global temp 1
:global Tattempt 0
:global ipaddr
:global LogErr
:global string
:global signA " via"
:global signB "from "
:set LogErr [/log find message~"login failure for user." time>([/system clock get time] - 6m)]
:foreach i in=$LogErr do={
:set string [:pick [/log get $i message ] 0 ([:len [/log get $i message ]])]
:set ipaddr [:pick $string ([:find $string $signB]+ 5) ($string [:find $string $signA])]
:if ([:len [/ip firewall address-list find where address=$ipaddr && list="AttemptBruteforce$temp"]]>=0 && [:len [/ip firewall address-list find address=$ipaddr]]<$attempt) do {
:set $Tattempt ($Tattempt+1)
:set temp ([:len [/ip firewall address-list find address=$ipaddr]]+1)
/ip firewall address-list add list="AttemptBruteforce$temp" address=[:toip $ipaddr] timeout=30m
:log warning "attempt_bruteforce_ $temp $ipaddr"}
}
:if ($Tattempt>=$attempt) do {
:foreach i in=[/ip firewall address-list find list="AttemptBruteforce$temp"] do={
:set ipaddr [/ip firewall address-list get $i address]
/ip firewall address-list add list=BlackList address=$ipaddr
/ip firewall address-list remove $i
:log warning "Blocked_bruteforce_ip $ipaddr"
}
}

показать ответы
1
Автор поста оценил этот комментарий

Т.е. три попытки (клавиша запала) и всё, сбрасывать?

раскрыть ветку (1)
Автор поста оценил этот комментарий

с другого ip заходить или по mac

показать ответы