VPN подключения и Address list

Автоматизация при помощи встроенного скриптового языка и RouterOS API
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

VPN подключения и Address list

Сообщение bear »

Привет

Есть идея для скрипта
Т.к. сам в этом не очень разбираюсь, может кто-нибудь из знающих заинтересуется

В логе часто появляются такие записи:
Изображение

Создаём адрес лист block_vpn
Скрип будет запускаться раз в 5 минут (например) и проверять логи за последние 5 минут на наличие таких записей
Если такая запись найдена, нужно вытащить из неё адрес и превратить его в подсеть (в нашем примере это 47.252.42.0/24 и 43.157.27.0/24)
После этого надо сравнить 47.252.42.0/24 и 43.157.27.0/24 с существующими записями в block_vpn и добавить туда, если записи не найдены
Фаервол дропает инпуты из этих адресов

Да, проще создать вайтлисты и дропать всё остальное, но к сожалению адреса часто меняются
Аватара пользователя
Chupaka
Сообщения: 4088
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: VPN подключения и Address list

Сообщение Chupaka »

Приветствую. А много таких ошибок с одного адреса? Насколько актуально их блокировать? У меня за двое суток всего четыре ошибки с четырёх разных адресов...
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

это не катастрофическая проблема, обычно пару адресов в день, пару раз было около 10
бывает как сегодня, когда один адрес долбит каждую секунду 10-15 минут

я сейчас вручную раз в 2-3 дня захожу в логи и вручную собираю их в блоклисты, но если возможно, конечно хотелось бы автоматизировать
Аватара пользователя
Chupaka
Сообщения: 4088
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: VPN подключения и Address list

Сообщение Chupaka »

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

:foreach i in=[/log/find message~"^\\d+\\.\\d+\\.\\d+\\.\\d+ phase1 negotiation failed\\."] do={
	:local msg [/log get $i message];
	:local ip [:pick $msg 0 [:find $msg " phase1"]];
	do {/ip/firewall/address-list/add list=BLOCK_ME_PLEASE address=$ip} on-error={}
}
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

спасибо!

я попробую перевести это в текстовую форму

скрип выбирает все записи из лога, которые выглядят как "ip_address phase1 negotiation failed"
берём одну такую строчку, вытаскиваем всё что находится до " phase1" и добавляем в блоклист
если возникает ошибка (адрес существует в блоклисте), игнорируем переходим к следующему адресу

т.е. всегда обрабатывается весь лог и в блоклист записывается конкретный адрес

буду думать как подправить под свои требования
Аватара пользователя
Chupaka
Сообщения: 4088
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: VPN подключения и Address list

Сообщение Chupaka »

А какие требования? :)
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

Chupaka писал(а): 26 мар 2024, 19:51 А какие требования? :)
  • проверять не весь лог, а только записи за последние 15 минут (например)
  • записывать в блоклист не 47.252.42.12, а 47.252.42.0/24
  • отлавливать не только "ip_address phase1 negotiation failed" строки, но и "phase1 negotiation failed due time up ..."
Аватара пользователя
Chupaka
Сообщения: 4088
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: VPN подключения и Address list

Сообщение Chupaka »

bear писал(а): 26 мар 2024, 20:16 проверять не весь лог, а только записи за последние 15 минут (например)
А смысл? Вроде и без этого быстро отрабатывает :) И как-то лёгкого пути не вижу...
bear писал(а): 26 мар 2024, 20:16 записывать в блоклист не 47.252.42.12, а 47.252.42.0/24

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

:foreach i in=[/log/find message~"^\\d+\\.\\d+\\.\\d+\\.\\d+ phase1 negotiation failed\\."] do={
	:local msg [/log get $i message];
	:local ip ([:pick $msg 0 [:find $msg "." ([:find $msg "." ([:find $msg "."] + 1)] + 1)]].".0/24");	
	do {/ip/firewall/address-list/add list=BLOCK_ME_PLEASE address=$ip} on-error={}
}
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

Chupaka писал(а): 28 мар 2024, 18:29
bear писал(а): 26 мар 2024, 20:16 проверять не весь лог, а только записи за последние 15 минут (например)
А смысл? Вроде и без этого быстро отрабатывает
да как-то неоптимизировано выглядит :-)

а вот так не получится?

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

:foreach i in=[/log/find message~"^\\d+\\.\\d+\\.\\d+\\.\\d+ phase1 negotiation failed\\." where time>([/system clock get time] - 15m)]
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

у меня встречаются ещё такие типы сообщений
первая строка - это наверное 95% всех подобных ошибок

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

phase1 negotiation failed due to time up 100.100.100.100[500]<=>47.252.42.12[500] e0c091b198818b39:6b463379b059196c
<47.252.42.12>: user Admin authentication failed
47.252.42.12 parsing packet failed, possible cause: wrong password
как я понимаю, для первой строки логика должна быть примерно такая:
находим положение символа ">", вырезаем остаток строки после этого символа, потом по примеру первого сообщения обрабатывается вырезанный участок

для каждого из этих типов сообщений нужен свой foreach внутри одного скрипта или это должны быть дополнительные 3 скрипта?
Аватара пользователя
Chupaka
Сообщения: 4088
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: VPN подключения и Address list

Сообщение Chupaka »

bear писал(а): 28 мар 2024, 18:48 а вот так не получится?

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

where time>([/system clock get time] - 15m)]
У меня не работает, возвращает всё подряд. Подозреваю, потому, что "get time" получает лишь время, а не дату - там ещё есть get date :)
bear писал(а): 28 мар 2024, 19:04 как я понимаю, для первой строки логика должна быть примерно такая:
находим положение символа ">", вырезаем остаток строки после этого символа, потом по примеру первого сообщения обрабатывается вырезанный участок
Ну, примерно так. Даже так: найти ">" (определив таким образом начало адреса), от следующего места искал "." и т.д. (как в моём последнем примере с округлением до /24), а потом взял бы нужную часть адреса для дальнейшей обработки.
bear писал(а): 28 мар 2024, 19:04 для каждого из этих типов сообщений нужен свой foreach внутри одного скрипта или это должны быть дополнительные 3 скрипта?
Как захочется. Главное, что это три независимых обработчика, а в одном они скрипте или в нескольких - нет разницы.
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

del
Последний раз редактировалось bear 31 мар 2024, 20:11, всего редактировалось 1 раз.
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

del
Последний раз редактировалось bear 31 мар 2024, 20:11, всего редактировалось 1 раз.
Аватара пользователя
Chupaka
Сообщения: 4088
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: VPN подключения и Address list

Сообщение Chupaka »

Только сейчас добрался глянуть - и поперхнулся на ":find $i"... Потом обновил страницу и увидел, что сообщения удалены %)
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

да, я там зажигал от души :-))
добавлял себе в лог адрес 122.123.333.111 и не понимал, почему скрипт его не обрабатывает
но в итоге всё сделал, всё пашет

но у меня появилась новая вавка в голове
есть правило, которое добавляет а адреслист IP, который перебирает порты
но он добавляет отдельный адрес, а я хотел бы чтобы добавлялась подсеть (либо чтобы ip в адреслисте исправлялся на 0/24)

сейчас нахожусь на этом этапе, пытаюсь чтобы хотя бы выводились нужные строки, но похоже что-то не то делаю

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

:foreach i in=[/ip/firewall/address-list find list="drop_scanners" !address~".*\.0\/24.*"] do={
    :local ip [/ip firewall address-list get $i];
    :log info $ip;
}
подскажи пожалуйста, как правильно проапдейтить 122.123.123.111 в адреслисте до 122.123.123.0/24?
Аватара пользователя
Chupaka
Сообщения: 4088
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: VPN подключения и Address list

Сообщение Chupaka »

Там мрак какой-то с этим отрицанием... Тестирую на версии 7.14.1:

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

/ip/firewall/address-list> print where list=test address~".*/24\$"  
Columns: LIST, ADDRESS, CREATION-TIME
 # LIST  ADDRESS     CREATION-TIME      
88 test  1.2.3.0/24  2024-04-01 23:14:21
/ip/firewall/address-list> print where list=test !address~".*/24\$"
Columns: LIST, ADDRESS, CREATION-TIME
 # LIST  ADDRESS     CREATION-TIME      
89 test  1.2.3.4     2024-04-01 23:13:57
88 test  1.2.3.0/24  2024-04-01 23:14:21
Так что, видимо, наиболее работоспособный вариант - пробегать по всему списку и отдельно детектировать, /24 это или нет
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

ага, именно так и получалось
вроде выбираю только те, где нет 0/24, а он все выдавал
похоже действительно придётся всё перебирать
Аватара пользователя
Chupaka
Сообщения: 4088
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: VPN подключения и Address list

Сообщение Chupaka »

Кажется, вот так можно всё же /32 найти (т.к. они выводятся без маски):

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

address~"^[.0-9]*\$"
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

спасибо, попробую

upd:
да, правильно вытаскивает
спасибо, буду дальше веселиться :-)
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

адреслисты как-то странно обрабатываются

вот скрипт и что он выводит:

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

:foreach i in=[/ip firewall address-list find list="port_scanners" address~"^[.0-9]*\$"] do={
    :local addrListMessage [/ip firewall address-list get $i];
    :log info $addrListMessage  # .id=*1f4a;address=206.168.34.2;creation-time=2024-03-31 08:03:33;disabled=false;dynamic=false;list=port_scanners
    :local start [:find $addrListMessage "address="];
    :local end [:find $addrListMessage ";" ($start + 1)];
    :local addressPart [:pick $addrListMessage ($start + 1) $end];
    :log info $addressPart; # address=206.168.34.2
    :local startPosition [:find $addressPart "="];
    :local msg [:pick $addressPart ($startPosition + 1) [:len $addressPart]];
    :local ip ([:pick $msg 0 [:find $msg "." ([:find $msg "." ([:find $msg "."] + 1)] + 1)]].".0/24");
    :log info $ip; # .0/24
}
Последний раз редактировалось bear 02 апр 2024, 15:36, всего редактировалось 2 раза.
Аватара пользователя
Chupaka
Сообщения: 4088
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: VPN подключения и Address list

Сообщение Chupaka »

Отмена миссии! Отмена миссии! Надо просто сделать "/ip firewall address-list get $i address" вместо "/ip firewall address-list get $i" :) Все так обрабатываются
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

да, спасибо, так всё работает :-)
storeas
Сообщения: 6
Зарегистрирован: 03 апр 2024, 13:56

Re: VPN подключения и Address list

Сообщение storeas »

День добрый, а скриптом не поделитесь который (phase1 negotiation failed due to time up ) блокирует?)
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

Re: VPN подключения и Address list

Сообщение bear »

storeas писал(а): 03 апр 2024, 14:00 День добрый, а скриптом не поделитесь который (phase1 negotiation failed due to time up ) блокирует?)
почему-то был уверен, что выше выкладывал :-)

примеры записей в логе:

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

123.123.111.123 phase1 negotiation failed.
123.123.122.123 parsing packet failed, possible cause: wrong password
phase1 negotiation failed due to time up 100.100.100.100[500]<=>123.123.133.123[500] e0c091b198818b39:6b463379b059196c
<123.123.144.123>: user Admin authentication failed
скрипт, который отловит все эти варианты и запишет 0/24 подсеть в выбраный адреслист
в моём примере это лист block_vpn_access (не забываем про фаервол, который должен дропать инпуты из этого листа)

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

:foreach i in=[/log/find message~"^\\d+\\.\\d+\\.\\d+\\.\\d+ phase1 negotiation failed\\."] do={
	:local msg [/log get $i message];
	:local ip ([:pick $msg 0 [:find $msg "." ([:find $msg "." ([:find $msg "."] + 1)] + 1)]].".0/24");	
	do {/ip/firewall/address-list/add list=block_vpn_access address=$ip} on-error={}
}

:foreach i in=[/log/find message~"^\\d+\\.\\d+\\.\\d+\\.\\d+ parsing packet failed, possible cause: wrong password"] do={
	:local msg [/log get $i message];
	:local ip ([:pick $msg 0 [:find $msg "." ([:find $msg "." ([:find $msg "."] + 1)] + 1)]].".0/24");	
	do {/ip/firewall/address-list/add list=block_vpn_access address=$ip} on-error={}
}

:foreach i in=[/log/find message~"^phase1 negotiation failed due to time up"] do={
	:local logMessage [/log get $i message];
	:local startPosition [:find $logMessage ">"];
	:local msg [:pick $logMessage ($startPosition + 1) [:len $logMessage]];
	:local ip ([:pick $msg 0 [:find $msg "." ([:find $msg "." ([:find $msg "."] + 1)] + 1)]].".0/24");
	do {/ip/firewall/address-list/add list=block_vpn_access address=$ip} on-error={}
}

:foreach i in=[/log/find message~".*>: user [^ ]+ authentication failed"] do={
	:local logMessage [/log get $i message];
	:local startPosition [:find $logMessage "<"];
	:local msg [:pick $logMessage ($startPosition + 1) [:len $logMessage]];
	:local ip ([:pick $msg 0 [:find $msg "." ([:find $msg "." ([:find $msg "."] + 1)] + 1)]].".0/24");
	do {/ip/firewall/address-list/add list=block_vpn_access address=$ip} on-error={}
}
storeas
Сообщения: 6
Зарегистрирован: 03 апр 2024, 13:56

Re: VPN подключения и Address list

Сообщение storeas »

Благодарю!)