Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Ответить
 • Просмотры: 2
Аватара пользователя
barozzzy

Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Сообщение barozzzy »

Доброго времени суток.

Есть такая задача:

Имеется Mikrotik на базе Router OS 7.17, нужен скрипт, который будет проверять не лог на предмет не верной авторизации (api, Winbox, ssh), брать ip адрес и добавлять его в Adress List.



Используя ИИ (ChatGPT и DeepSeek) пробовал сгенерировать код (не силен в написании кодов), при каждом варианте лог сообщал



Лог ошибки

[spoiler]executing script blockbruteforce from winbox failed, please check it manually[/spoiler]






А вот сами варианты скрипта:



ChatGPT_1

[spoiler]/system logging action add name=bruteforce target=memory

/system logging add topics=login action=bruteforce



:global blocklist "bruteforceblock"

/ip firewall address-list add list=$blocklist address=0.0.0.0 comment="Temporary list for brute-force attackers"



:local maxAttempts 5

:local banTime 1d



:while (true) do={

:local logEntries [/log find where topics~"login failure"]



:foreach entry in=$logEntries do={

:local message [/log get $entry message]

:if ([:find $message "via ssh" -1] != -1 || [:find $message "via winbox" -1] != -1 || [:find $message "via api" -1] != -1) do={

:local ip [:pick $message ([:find $message "from "]+5) [:find $message " via"]]



:local count [/ip firewall address-list find where list=$blocklist && address=$ip]

:if ([:len $count] = 0) do={

/ip firewall address-list add list=$blocklist address=$ip timeout=$banTime comment="Blocked due to brute-force"

:log warning "Blocked IP $ip due to multiple failed SSH/Winbox/API login attempts."

}

}

}

:delay 10s

}[/spoiler]








ChatGPT_2

[spoiler]/system logging action add name=bruteforce target=memory

/system logging add topics=login action=bruteforce



:global blocklist "bruteforceblock"

:local maxAttempts 5

:local banTime "1d"



:while (true) do={

:local logEntries [/log find where topics~"critical"]



:foreach entry in=$logEntries do={

:local message [/log get $entry message]

:log info "Checking message: $message"



:if ([:find $message "via ssh" -1] != -1 || [:find $message "via winbox" -1] != -1 || [:find $message "via api" -1] != -1) do={

:local ipStart ([:find $message "from "] + 5)

:local ipEnd [:find $message " via"]

:if ($ipEnd > 0) do={

:local ip [:pick $message $ipStart $ipEnd]

:log info "Extracted IP: $ip"



:local count [/ip firewall address-list find where list=$blocklist && address=$ip]

:if ([:len $count] = 0) do={

/ip firewall address-list add list=$blocklist address=$ip timeout=$banTime comment="Blocked due to brute-force"

:log warning "Blocked IP $ip due to multiple failed login attempts."

}

} else={

:log error "Failed to extract IP from message: $message"

}

}

}

:delay 10s

}[/spoiler]








DeepSeek_1

[spoiler]{

:local blocklist "bruteforceblock" # Название списка блокировки

:local maxAttempts 5 # Максимальное количество попыток

:local banTime "1d" # Время блокировки

:local failedIPs [:toarray {}] # Массив для хранения количества попыток



:local logEntries [/log find where topics~"critical"]



:foreach entry in=$logEntries do={

:local message [/log get $entry message]

:log info "Checking message: $message"



# Проверяем, связано ли сообщение с неудачной попыткой входа

:if ([:find $message "login failure for user"] != nil) do={

:local ipStart ([:find $message "from "] + 5)

:local ipEnd [:find $message " via"]

:local ip [:pick $message $ipStart $ipEnd]



:if ($ip != "") do={

:log info "Extracted IP: $ip"

:local ipCount 1



# Проверяем, есть ли уже запись об этом IP в массиве

:foreach ipEntry in=$failedIPs do={

:if ([:pick $ipEntry 0 [:find $ipEntry "="]] = $ip) do={

:set ipCount ([:pick $ipEntry ([:find $ipEntry "="] + 1) [:len $ipEntry]] + 1)

:set $failedIPs [:tostr [:replace $failedIPs $ipEntry ($ip . "=" . $ipCount)]]

}

}



# Если IP не найден в массиве, добавляем его

:if ($ipCount = 1) do={

:set $failedIPs [:tostr [:merge $failedIPs [:toarray [$ip . "=" . $ipCount]]]

}



# Если попыток больше maxAttempts, блокируем IP

:if ($ipCount >= $maxAttempts) do={

/ip firewall address-list add list=$blocklist address=$ip timeout=$banTime comment="Blocked due to brute-force"

:log warning "Blocked IP $ip due to $ipCount failed login attempts."

}

} else={

:log error "Failed to extract IP from message: $message"

}

}

}

}[/spoiler]








DeepSeek_2

[spoiler]/system script add name=block_bruteforce source="

:local blockTime 1d # Время блокировки (например, 1 день)

:local maxAttempts 3 # Количество неудачных попыток до блокировки

:local addressList \"BruteForce_Block\" # Название списка блокировки



:local failedIPs [:toarray {}] # Используем массив для хранения данных



:foreach logEntry in=[/log find where topics~\"account,info\"] do={

:local logMsg [/log get \$logEntry message]



# Проверяем, есть ли в сообщении 'login failure'

:if ([:find \$logMsg \"login failure for user\"] != nil) do={

:local startIndex [:find \$logMsg \"from\"]

:local failedIP [:pick \$logMsg (\$startIndex + 5) [:len \$logMsg]]



# Проверяем, не в списке ли уже этот IP

:if ([:len [/ip firewall address-list find where address=\$failedIP]] = 0) do={

:local ipCount 1



# Проверяем, есть ли уже запись об этом IP в массиве

:foreach ipEntry in=\$failedIPs do={

:if ([:pick \$ipEntry 0 [:find \$ipEntry \"=\"]] = \$failedIP) do={

:set ipCount ([:pick \$ipEntry ([:find \$ipEntry \"=\"] + 1) [:len \$ipEntry]] + 1)

:set \$failedIPs [:tostr [:replace \$failedIPs \$ipEntry (\$failedIP . \"=\" . \$ipCount)]]

}

}



# Если IP не найден в массиве, добавляем его

:if (\$ipCount = 1) do={

:set \$failedIPs [:tostr [:merge \$failedIPs [:toarray [\$failedIP . \"=\" . \$ipCount]]]]

}



# Если попыток больше maxAttempts, блокируем IP

:if (\$ipCount >= \$maxAttempts) do={

/ip firewall address-list add list=\$addressList address=\$failedIP timeout=\$blockTime

:log warning \"Blocked IP \$failedIP after \$ipCount failed login attempts!\"

}

}

}

}"[/spoiler]






Вариантов было намного больше, но я выложил крайние.



Может кто нибудь поможет в данном вопросе?
Аватара пользователя
Anton04

Re: Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Сообщение Anton04 »

Цитата barozzzy:



нужен скрипт, который будет проверять не лог на предмет не верной авторизации (api, Winbox, ssh), брать ip адрес и добавлять его в Adress List.
Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.




Зачем так делать? Не лучше ли банально НЕ выставлять порты api, Winbox, ssh голой попой наружу, чтоб к Вам все стучались!?

Закройте порты в наружи и подключайтесь к микроту по VPN или используйте port knocking и не занимайтесь бесполезной фигнёй.



P.S. Буквально два правила port knocking решат Вашу проблему:





Код:

Код: Выделить всё

/ip firewall filter
add action=add-src-to-address-list address-list=allow-ip \
    address-list-timeout=1h chain=input comment="icmp allow-ip list" \
    in-interface-list=WAN-list packet-size=123 protocol=icmp
add action=accept chain=input comment="Winbox and SSH" dst-port=22,8291 \
    in-interface-list=WAN-list protocol=tcp src-address-list=allow-ip
Аватара пользователя
bredych

Re: Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Сообщение bredych »

а можно пояснить строки?

как понял, по какому-то листу разрешен вход, но где этот лист и почему срок разрешения час?

или имелось в виду блокирование, а не разрешение?
Аватара пользователя
bredych

Re: Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Сообщение bredych »

Цитата bredych:



а можно пояснить строки?
Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.




Первое правило добавляет src ip, с которого приходит пинг размером 123 байта на интерфейсы в списке WAN-list в список под названием allow-ip на 1 час. Через 1 час этот адрес оттуда удаляется.

Второе правило разрешает доступ по портам 22,8291 на интерфейсы в списке WAN-list для адресов, находящихся в списке allow-ip.

Предполагается, что доступ по умолчанию запрещён.



Стоило также написать, что стучать в калитку в данном случае следует так:



Код:

Код: Выделить всё

ping  -l 95 -n 1

95+28=123

28 - размер заголовка.


Цитата bredych:



почему срок разрешения час?
Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.




Так в приведённом примере. Никто не запрещает открывать калитку хоть на сутки, или вообще навсегда. Или, с другой стороны, на 30-60 секунд, чтоб пройти самому, а соседи на мобильном интеренете, коих десятки тысяч, не проскочили. Как настроишь, так и будет.

Методы стука тоже есть разные, Anton04 привёл самый простой для исполнения со стороны клиента - ping практически везде есть, а скажем nmap - не везде.
Аватара пользователя
bredych

Re: Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Сообщение bredych »

Цитата Cereal Keeler:



Или, с другой стороны, на 30-60 секунд, чтоб пройти самому, а соседи на мобильном интеренете, коих десятки тысяч, не проскочили
Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.




пардон, а у всех с мобильного инета будет один ип?

И как сам будешь работать, если твой ип из списка удалится почти сразу?

Или такой стук должен предворять каждую сессию, а в ходе открытой сессии уже неважно остальное?
Аватара пользователя
Anton04

Re: Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Сообщение Anton04 »

Цитата bredych:



пардон, а у всех с мобильного инета будет один ип?

И как сам будешь работать, если твой ип из списка удалится почти сразу?

Или такой стук должен предворять каждую сессию, а в ходе открытой сессии уже неважно остальное?
Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.




Коротко:



1. Нет.

2. Подключился и работай.

3. ping -n 2 -l 95 "IP или адрес узла".



Развёрнуто:



1. Все зависит от того какие услуги Вам предоставляет Ваш провайдер, если не выдаёт "белые" IP, то в микроте зафиксируется IP конечного шлюза, если выдаёт белый статический IP адрес, то в микроте появится именно этот адрес.

2. Послали ICMP пакет определённой длинный, микрот принял пакет обработал и добавил адрес источника от куда он пришёл в белый список. далее вы подключаетесь в течении указанного в правиле времени и работаете, можете не закрывать Windows или ssh хоть сутками, т.к. время важно только для новых подключений.

3. Смотря что вы подразумеваете под "сессией", в сетях есть такое понятие время жизни соединения, т.е. время в течении которого соединение считается активным (т.е. рабочим). Если вы подразумеваете это, то если активна сессия, то запрос на открытие параллельной сессии считается нормальным. За это у Вас должно отвечать другое правило в самом верху, пример:





Код:

Код: Выделить всё

/ip firewall filter
add action=accept chain=input comment=\
    "accept input established,related" connection-state=\
    established,related
Аватара пользователя
Cereal Keeler

Re: Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Сообщение Cereal Keeler »

Цитата bredych:



пардон, а у всех с мобильного инета будет один ип?
Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.




Не у всех, но стопудово у очень многих, если опсос использует NAT/CGNAT, что обычно и наблюдаю, хотя может какие-то и выдают публичные адреса, но чёт сомневаюсь, при нынешнем их дефиците это расточительно. Для опсосов даже специальную CGNAT подсеть выделили: 100.64.0.0/10, то есть, в теории за одним публичным ip может сидеть до 4+ млн клиентов. На практике их конечно меньше, но тысячи и десятки тысяч - запросто. Могут и классический NAT по RFC 1918 использовать, мой опсос например использует 10.0.0.0/8, на 16+ млн адресов, хоть столько клиентов у него и близко нет.
Аватара пользователя
Cereal Keeler

Re: Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Сообщение Cereal Keeler »

Цитата Anton04:



если выдаёт белый статический IP адрес, то в микроте появится именно этот адрес.
Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.




Но тогда и в калитку стучать незачем, завайтлистил руками этот адрес навсегда и всё. Port knocking это ж для тех случаев, когда админу нужно срочно получить доступ из небезопасной помойки – мобильная сеть, публичный вайфай и тп. И у него почему-то нет VPN - то ли не умеет, то ли денег страшно жалко – аж десятку евро в месяц на VPS c ним. Супербомжовое и совсем небезопасное решение, но, да, лучше, чем держать голую жопу выставленной в публичный доступ, даже если проверять её на проникновения, как хотел OP.
Аватара пользователя
Anton04

Re: Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Сообщение Anton04 »

Цитата Cereal Keeler:



Но тогда и в калитку стучать незачем, завайтлистил руками этот адрес навсегда и всё.
Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.




Это хоть в какой-то мере убережёт от подмены IP или по крайней мере затруднит. Но да, лучше уж VPN настроить на самом микроте.
Аватара пользователя
Cereal Keeler

Re: Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.

Сообщение Cereal Keeler »

Цитата Anton04:



Это хоть в какой-то мере убережёт от подмены IP
Прочее - Mikrotik Router OS 7.17. Нужна помощь в написании скрипта.




От ip spoofing? Ребята, если за вас взялись на таком уровне, то калитка уже не поможет.
Ответить

Вернуться в «Сетевое оборудование»