Начал изучать Микротик недавно.
ВНИМАНИЕ! ВСЁ НИЖЕПЕРЕЧИСЛЕННОЕ НУЖНО ИСКЛЮЧИТЕЛЬНО ДЛЯ ТОГО, ЧТОБЫ РАЗОБРАТЬСЯ СО СКРИПТИНГОМ В МИКРОТИКАХ! НЕ ИСПОЛЬЗУЙТЕ ЭТО ДЛЯ ДРУГИХ ЦЕЛЕЙ!
На просторах интернета наткнулся на следующую конструкцию: ( https://goo.gl/dcdPpr )
Код: Выделить всё
:foreach line in=[/log find buffer=badaddr] do={
:do {
:local content [/log get $line message];
:local pos1 [:find $content "from" 0];
:local pos2 [:find $content "via" 0];
:local badipline "";
:local badip "";
:local badip1 "";
:set badipline [:pick $content $pos1 $pos2];
:local badipfrom [:find $badipline "from"];
:set badip [:pick $badipline ($badipfrom+5) ($badipfrom+20)];
:local pos3 [:find $badip " " 0];
:set badip1 [:pick $badip 0 ($pos3)];
/ip firewall address-list add list=badaddr address=$badip1 comment="AutoBan $badip1";
} on-error={};
}
/system logging action set badaddr memory-lines=1;
/system logging action set badaddr memory-lines=100;
Код: Выделить всё
:foreach line in=[/log find buffer=autoban] do={
:do {
:local content [/log get $line message];
:local pos1 [:find $content "from" 0];
:local pos2 [:find $content "via" 0];
:local badipline "";
:local badip "";
:local badip1 "";
:local prefix1 "-autoban-alist";
:local eol [:len $content]
:set badipline [:pick $content $pos1 $pos2];
:local badipfrom [:find $badipline "from"];
:set badip [:pick $badipline ($badipfrom+5) ($badipfrom+20)];
:local pos3 [:find $badip " " 0];
:set badip1 [:pick $badip 0 ($pos3)];
:local protvia [:pick $content ($pos2+4) ($eol)];
:local list1 "$protvia$prefix1";
if ([:len $badip1]>7) do {
/ip firewall address-list add list=$list1 timeout=12h address=$badip1 comment="AutoBan $badip1 $protvia";
}
} on-error={};
}
/system logging action set autoban memory-lines=1;
/system logging action set autoban memory-lines=100;
Название списка формирую с учётом сервиса, на который ломится этот нехороший (beep).
Далее срабатывают правила фильтрации:
Код: Выделить всё
/ip firewall raw
add action=drop chain=prerouting disabled=yes dst-port=8728 protocol=tcp src-address-list=api-autoban-alist
add action=drop chain=prerouting disabled=yes dst-port=8729 protocol=tcp src-address-list=api-ssl-autoban-alist
add action=drop chain=prerouting disabled=yes dst-port=21 protocol=tcp src-address-list=ftp-autoban-alist
add action=drop chain=prerouting disabled=yes dst-port=22 protocol=tcp src-address-list=ssh-autoban-alist
add action=drop chain=prerouting disabled=yes dst-port=23 protocol=tcp src-address-list=telnet-autoban-alist
add action=drop chain=prerouting disabled=yes dst-port=8291 protocol=tcp src-address-list=winbox-autoban-alist
add action=drop chain=prerouting disabled=yes dst-port=80 protocol=tcp src-address-list=www-autoban-alist
add action=drop chain=prerouting disabled=yes dst-port=443 protocol=tcp src-address-list=www-ssl-autoban-alist
Приблизительная логика работы должна быть следующая:
Код: Выделить всё
0. Считаем количество строк в логе
Если больше 5 запускаем скрипт
иначе выход
1. Создаём массив уникальных IP, по принципу: ip, сервис, количество повторений
Для каждого элемента списка {
Считать IP, сервис
Если сочитание IP и сервис есть в массиве(
добавить 1 к количеству повторений
иначе
Внести IP и сервис в массив
}
}
2. Если повторений больше 5, заносим в банлист на 7 дней
Для каждого элемента массива {
Считать количество повторений
Если количество повторений больше 5 {
Внести адрес в банлист с именем сервиса
иначе
Следующий
}
}
Обнулить массив
Обнулить память
Более того, возможно я нагородил конструкцию, поражающую своей кривизной. и есть гораздо более эффективные решения этой задачи.
Я знаком с конструкциями типа:
Код: Выделить всё
/ip firewall filter
add action=drop chain=input dst-port=22 protocol=tcp src-address-list=ssh-block-alist
add action=add-src-to-address-list address-list=ssh-block-alist address-list-timeout=1w3d chain=input connection-state=new dst-port=22 protocol=tcp src-address-list=ssh3-alist
add action=add-src-to-address-list address-list=ssh3-alist address-list-timeout=5m chain=input connection-state=new dst-port=22 protocol=tcp src-address-list=ssh2-alist
add action=add-src-to-address-list address-list=ssh2-alist address-list-timeout=3m chain=input connection-state=new dst-port=22 protocol=tcp src-address-list=ssh1-alist
add action=add-src-to-address-list address-list=ssh1-alist address-list-timeout=1m chain=input connection-state=new dst-port=22 protocol=tcp
Помогите товарищи Гуру!