Страница 5 из 13
Re: Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Добавлено: 06 дек 2021, 21:15
Sertik
Может не понял чего, поправьте ...
Зачем банить ip из лога тех, кто пытается подобрать пароль к vpn ? Ведь это почти бессмысленно, так как никто не делает больше одной попытки с одного IP-адреса - IP постоянно меняются ...
Re: Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Добавлено: 06 дек 2021, 22:55
drpioneer
Sertik писал(а): ↑06 дек 2021, 21:15
...
Зачем банить ip из лога тех, кто пытается подобрать пароль к vpn ? Ведь это почти бессмысленно, так как никто не делает больше одной попытки с одного IP-адреса - IP постоянно меняются
...
Есть список хотелок:
viewtopic.php?p=70810#p70810, согласно которому скрипт развивается.
Этой позицией покрывается последний пункт в списке хотелок.
tranceinsane писал(а): ↑06 дек 2021, 09:59
...
а у меня этот скрипт не работает. Предыдущий работает, а вот именно этот нет, просто тихо и все. В чем может быть проблема?
...
Скрипт был немного усовершенствован:
Код: Выделить всё
# Script for blocking dangerous addresses that tried to connect to the router by drPioneer
# https://forummikrotik.ru/viewtopic.php?p=82619#p82619
# tested on ROS 6.49
# updated 2021/12/08
:do {
:local outMsg "Dangerous addresses detected:";
:local lenMsg [:len $outMsg];
# ----------- Stage 1 - search for a device login attempt -----------
:foreach routerUser in=[ /user find disabled=no; ] do={
:do {
:foreach dangerString in=[ /log find message~"login failure for user"; ] do={
:do {
:local stringTemp ([ /log get $dangerString message ]);
:local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "from" ] - 1 )]);
:local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :find $stringTemp "via" ] - 1 )]);
:local dangerVia ([ :pick $stringTemp ([ :find $stringTemp "via" ]) ([ :find $stringTemp "via" ] + 20)]);
:if ($routerUser != $dangerUser) do={
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong router user '".$dangerUser."' ".$dangerVia.")");
}
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Login failure for user' in log."); }
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found active router user."); }
}
# ----------- Stage 2 - search for login attempts via WinBox -----------
:foreach dangerString in=[ /log find message~"denied winbox/dude connect from"; ] do={
:do {
:local stringTemp ([ /log get $dangerString message ]);
:local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :len $stringTemp ]) ]);
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (not allowed WinBox user IP-address)");
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Denied winbox/dude connect from' in log."); }
}
# ----------- Stage 3 - search for an attempt to enter through IPSec password -----------
:foreach dangerString in=[ /log find message~"parsing packet failed, possible cause: wrong password"; ] do={
:do {
:local stringTemp ([ /log get $dangerString message ]);
:local dangerIP ([ :pick $stringTemp 0 ([ :find $stringTemp "parsing" ] - 1) ]);
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec password)");
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Parsing packet failed, possible cause: wrong password' in log."); }
}
# ----------- Stage 4 - search for an attempt to enter through IPSec proposal -----------
:foreach dangerString in=[ /log find message~"failed to get valid proposal"; ] do={
:do {
:local stringTemp ([ /log get $dangerString message ]);
:local dangerIP ([ :pick $stringTemp 0 ([ :find $stringTemp "failed" ] - 1) ]);
if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec proposal)");
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Failed to get valid proposal' in log."); }
}
# ----------- Stage 5 - search for an attempt to enter through L2TP -----------
:foreach dangerString in=[ /log find topics~"l2tp" message~"user" message~"authentication failed"; ] do={
:do {
:local stringTemp ([ /log get $dangerString message ]);
:local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
:local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "<" ] + 1) ([ :find $stringTemp ">" ]) ]);
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong L2TP user '".$dangerUser."')");
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of L2TP 'User' & 'Authentication failed' in log."); }
}
# ----------- Stage 6 - search for an attempt to enter through PPTP -----------
:foreach dangerStr1 in=[ /log find topics~"pptp" message~"user" message~"authentication failed"; ] do={
:do {
:foreach dangerStr2 in=[ /log find topics~"pptp" message~"TCP connection established from"; ] do={
:do {
:local stringId1 ("0x".[:pick $dangerStr1 ([:find $dangerStr1 "*"] + 1) [:len $dangerStr1]]);
:local stringId2 ("0x".[:pick $dangerStr2 ([:find $dangerStr2 "*"] + 1) [:len $dangerStr2]]);
:if ((($stringId1 - $stringId2) = 1) || (($stringId2 - $stringId1) = 1)) do={
:local stringTemp ([ /log get $dangerStr1 message ]);
:local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
:local stringTemp ([ /log get $dangerStr2 message ]);
:local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :len $stringTemp ]) ]);
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong PPTP user '".$dangerUser."')");
}
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of PPTP 'TCP connection established from' in log."); }
}
} on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of PPTP 'User' & 'Authentication failed' in log."); }
}
# ----------- Checking & installing firewall-filter rule -----------
:if ([ /ip firewall filter find src-address-list="BlockDangerAddress"; ] = "") do={
/ip firewall filter add action=drop chain=input comment="Dropping dangerous adresses" src-address-list=BlockDangerAddress;
}
:if ([ /ip firewall filter find src-address-list="BlockDangerAddress" disabled=yes; ] != "") do={
/ip firewall filter enable [ /ip firewall filter find src-address-list="BlockDangerAddress" disabled=yes; ];
}
# ----------- Output searching results -----------
:if ([:len $outMsg] > $lenMsg) do={
:put $outMsg;
:log warning $outMsg;
}
}
- подправлена логика поиска проблемных IP-адресов для PPTP
- внедрено автодобавление отсутствующего и включение выключенного правила в "Firewall->Filter Rules", производящего глушение проблемных IP-адресов. Положение правила в списке необходимо выставлять вручную в соответствии со своими предпочтениями.
Re: Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Добавлено: 20 дек 2021, 23:18
Mikuser01
Добрый день. Спасибо большое за замечательный скрипт. Скрипт добавляет только последнего пользователя или всех кто есть в логах?
Re: Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Добавлено: 21 дек 2021, 02:04
Virtue
Mikuser01 писал(а): ↑20 дек 2021, 23:18
Добрый день. Спасибо большое за замечательный скрипт. Скрипт добавляет только последнего пользователя или всех кто есть в логах?
с тех же самых айпишек сегодня и меня долбили..
добавил правило:
Код: Выделить всё
/ip firewall filter
add action=accept chain=input dst-port=1723 in-interface="интерфейс, смотрящий в интернет" protocol=tcp src-address-list="лист разрешенных адресов"
add action=drop chain=input in-interface="интерфейс, смотрящий в интернет"
и больше не беспокоят...
Re: Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Добавлено: 21 дек 2021, 16:45
drpioneer
Mikuser01 писал(а): ↑20 дек 2021, 23:18
Добрый день. Спасибо большое за замечательный скрипт. Скрипт добавляет только последнего пользователя или всех кто есть в логах?
Приветствую.
Скрипт формирует чёрный список всех подозрительных IP-адресов.
Скрипт никуда не добавляет никаких пользователей.
Re: Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Добавлено: 28 дек 2021, 19:21
denismikh
Добрый! Заметил что скрипт долго выполняется, загрузка CPU 100%, если лог пишется на диск в 10000 строк. Проверяли на 951Ui-2HnD с прошивкой 6.49.2, время выполнение заняло примерно 35 минут.
Re: Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Добавлено: 28 дек 2021, 23:34
drpioneer
denismikh писал(а): ↑28 дек 2021, 19:21
Добрый! Заметил что скрипт долго выполняется, загрузка CPU 100%, если лог пишется на диск в 10000 строк. Проверяли на 951Ui-2HnD с прошивкой 6.49.2, время выполнение заняло примерно 35 минут.
Добрый день.
Подтвердил подобное поведение при описанных условиях на RB751U-2HnD ROS 6.49.
Переписал скрипт на предмет ускорения его работы.
Теперь в моих условиях скрипт грузит процессор на 100% в течении 30 секунд.
Считаю такой вариант приемлемым по сравнению с тем, что было:
Код: Выделить всё
# Script of blocking dangerous addresses by drPioneer.
# https://forummikrotik.ru/viewtopic.php?t=4781&start=20
# tested on ROS 6.49
# updated 2021/12/29
:do {
:local outMsg "Detected dangerous addresses:";
:local lenMsg [:len [$outMsg]];
# ----------- Stage 1 - search for a device login attempt -----------
:foreach dangerString in=[ /log find message~"login failure for user"; ] do={
:foreach routerUser in=[ /user find disabled=no; ] do={
:local stringTemp ([ /log get $dangerString message; ]);
:local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "from" ] - 1 )]);
:local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :find $stringTemp "via" ] - 1 )]);
:local dangerVia ([ :pick $stringTemp ([ :find $stringTemp "via" ]) ([ :find $stringTemp "via" ] + 20)]);
:if ($routerUser != $dangerUser) do={
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP; ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong router user '".$dangerUser."' ".$dangerVia.")");
}
}
}
}
# ----------- Stage 2 - search for login attempts via WinBox -----------
:foreach dangerString in=[ /log find message~"denied winbox/dude connect from"; ] do={
:local stringTemp ([ /log get $dangerString message; ]);
:local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :len $stringTemp ]) ]);
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP; ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (not allowed WinBox user IP-address)");
}
}
# ----------- Stage 3 - search for an attempt to enter through IPSec password -----------
:foreach dangerString in=[ /log find message~"parsing packet failed, possible cause: wrong password"; ] do={
:local stringTemp ([ /log get $dangerString message; ]);
:local dangerIP ([ :pick $stringTemp 0 ([ :find $stringTemp "parsing" ] - 1) ]);
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP; ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec password)");
}
}
# ----------- Stage 4 - search for an attempt to enter through IPSec proposal -----------
:foreach dangerString in=[ /log find message~"failed to get valid proposal"; ] do={
:local stringTemp ([ /log get $dangerString message; ]);
:local dangerIP ([ :pick $stringTemp 0 ([ :find $stringTemp "failed" ] - 1) ]);
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP; ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec proposal)");
}
}
# ----------- Stage 5 - search for an attempt to enter through L2TP -----------
:foreach dangerString in=[ /log find topics~"l2tp" message~"user" message~"authentication failed"; ] do={
:local stringTemp ([ /log get $dangerString message; ]);
:local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
:local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "<" ] + 1) ([ :find $stringTemp ">" ]) ]);
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP; ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong L2TP user '".$dangerUser."')");
}
}
# ----------- Stage 6 - search for an attempt to enter through PPTP -----------
:foreach dangerStr1 in=[ /log find topics~"pptp" message~"user" message~"authentication failed"; ] do={
:foreach dangerStr2 in=[ /log find topics~"pptp" message~"TCP connection established from"; ] do={
:local stringId1 ("0x".[:pick $dangerStr1 ([:find $dangerStr1 "*"] + 1) [:len $dangerStr1]]);
:local stringId2 ("0x".[:pick $dangerStr2 ([:find $dangerStr2 "*"] + 1) [:len $dangerStr2]]);
:if ((($stringId1 - $stringId2) = 1) || (($stringId2 - $stringId1) = 1)) do={
:local stringTemp ([ /log get $dangerStr1 message ]);
:local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
:local stringTemp ([ /log get $dangerStr2 message; ]);
:local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :len $stringTemp ]) ]);
:if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={
/ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
:set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong PPTP user '".$dangerUser."')");
}
}
}
}
# ----------- Checking & installing firewall-filter rule -----------
:if ([ /ip firewall filter find src-address-list="BlockDangerAddress"; ] = "") do={
/ip firewall filter add action=drop chain=input comment="Dropping dangerous adresses" src-address-list=BlockDangerAddress;
}
:if ([ /ip firewall filter find src-address-list="BlockDangerAddress" disabled=yes; ] != "") do={
/ip firewall filter enable [ /ip firewall filter find src-address-list="BlockDangerAddress" disabled=yes; ];
}
# ----------- Output searching results -----------
:if ([:len $outMsg] > $lenMsg) do={
:put $outMsg;
:log warning $outMsg;
}
} on-error={ :log warning ("Script of blocking dangerous IP addresses worked with errors."); }
Спасибо за замечание
.
Re: Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Добавлено: 29 дек 2021, 11:31
denismikh
drpioneer писал(а): ↑28 дек 2021, 23:34
Добрый день.
Подтвердил подобное поведение при описанных условиях на RB751U-2HnD ROS 6.49.
Переписал скрипт на предмет ускорения его работы.
Теперь в моих условиях скрипт грузит процессор на 100% в течении 30 секунд.
Считаю такой вариант приемлемым по сравнению с тем, что было:
Спасибо! Заметил в скрипте теперь нет этапа #Checking & installing firewall-filter rule, его можно вернуть?
Re: Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Добавлено: 29 дек 2021, 11:50
drpioneer
denismikh писал(а): ↑29 дек 2021, 11:31
drpioneer писал(а): ↑28 дек 2021, 23:34
...
Переписал скрипт на предмет ускорения его работы.
...
Спасибо! Заметил в скрипте теперь нет этапа #Checking & installing firewall-filter rule, его можно вернуть?
Внёс недостающий этап:
viewtopic.php?p=83124#p83124
Ещё раз спасибо за замечание.
Re: Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера
Добавлено: 29 дек 2021, 12:26
denismikh
Проверил ещё раз, время выполнения всё равно 30 минут.
Настройки лога на диск