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

Автоматизация при помощи встроенного скриптового языка и RouterOS API
storeas
Сообщения: 6
Зарегистрирован: 03 апр 2024, 13:56

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

Сообщение storeas »

bear писал(а): 03 апр 2024, 14:30
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={}
}
скрипт переделал не на подсеть а на отдельные ip

заменив :local ip [:pick $msg 0 [:find $msg "["]];

и добавил уведомления после добавления в адрес лист))

:local alerttext "$currdatetime Mikrotik $[/system identity get name] $ip IP was added to block_vpn_access-list";
/log info ">>> Script L2TP IPsec protector: $ip IP was added to block_vpn_access. <<<";
/tool fetch keep-result=no url="https://api.telegram.org/bot$BotToken/s ... $alerttext";

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

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

Сообщение bear »

storeas писал(а): 04 апр 2024, 10:41 а как можно сделать проверку на то, что ip адрес уже есть в адрес листе? и не добавлять такой ip повторно
в этом нет необходимости
второй раз адрес нельзя добавить в тот же адреслист
а "on-error={}" в скрипте как раз скроет ошибку о существовании такой записи, т.е. адрес будет просто пропущен
storeas
Сообщения: 6
Зарегистрирован: 03 апр 2024, 13:56

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

Сообщение storeas »

bear писал(а): 04 апр 2024, 10:52
storeas писал(а): 04 апр 2024, 10:41 а как можно сделать проверку на то, что ip адрес уже есть в адрес листе? и не добавлять такой ip повторно
в этом нет необходимости
второй раз адрес нельзя добавить в тот же адреслист
а "on-error={}" в скрипте как раз скроет ошибку о существовании такой записи, т.е. адрес будет просто пропущен
Да, так и есть в случае если не слать себе уведомления)
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

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

Сообщение bear »

что-то типа такого можно попробовать сделать

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

: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");
    /ip/firewall/address-list/add list=block_vpn_access address=$ip;
      :if ([:len [/ip/firewall/address-list/find address=$ip]] > 0) do={
          :log info "successfully added $ip to address list";
      } else={
          :log warning "failed to add $ip to address list";
    }
}
я не знаю как/если это будет работать, надо тестить, но if-else должен помочь решить эту проблему
*само собой сообщения в лог надо заменить на свою логику
storeas
Сообщения: 6
Зарегистрирован: 03 апр 2024, 13:56

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

Сообщение storeas »

bear писал(а): 04 апр 2024, 11:08 что-то типа такого можно попробовать сделать

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

: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");
    /ip/firewall/address-list/add list=block_vpn_access address=$ip;
      :if ([:len [/ip/firewall/address-list/find address=$ip]] > 0) do={
          :log info "successfully added $ip to address list";
      } else={
          :log warning "failed to add $ip to address list";
    }
}
я не знаю как/если это будет работать, надо тестить, но if-else должен помочь решить эту проблему
*само собой сообщения в лог надо заменить на свою логику
Работает до тех пор пока не появляется ip который уже есть в листе
storeas
Сообщения: 6
Зарегистрирован: 03 апр 2024, 13:56

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

Сообщение storeas »

:local currdate ([/system/clock/get date]);
:local currtime ([/system/clock/get time]);
:local currdatetime ($currdate . " " . $currtime);
:local BotToken "";
:local ChatID "";

: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]];

#--------------Find subnet
# :local ip ([:pick $msg 0 [:find $msg "." ([:find $msg "." ([:find $msg "."] + 1)] + 1)]].".0/24");

#--------------Find ip address
:local ip [:pick $msg 0 [:find $msg "["]];

:local alerttext "$currdatetime $[/system identity get name] [ $ip ] add to block_vpn_access-list";

:if ($ip~"((25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)[.]){3}(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)") do={
:if ([/ip firewall address-list find address=$ip list=block_vpn_access]="") do={
/ip firewall address-list add address=$ip list=block_vpn_access timeout=3h;
/log info "> $alerttext <";
/tool fetch keep-result=no url="https://api.telegram.org/bot$BotToken/s ... $alerttext";
} else={
:log info "This $ip already exists to address list";
}
}
}


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

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

Сообщение bear »

storeas писал(а): 04 апр 2024, 11:39 Работает до тех пор пока не появляется ip который уже есть в листе
проверил этот вариант, вроде всё норм

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

: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");    
    :if ([:len [/ip/firewall/address-list/find address=$ip]] = 0) do={
        /ip/firewall/address-list/add list=block_vpn_access address=$ip;
        :if ([:len [/ip/firewall/address-list/find address=$ip]] > 0) do={
            :log info "successfully added $ip to address list";
        } else={
            :log info "failed to add $ip to address list";
        }
    } else={
        :log info "$ip is already in the address list";
    }
}
Аватара пользователя
Chupaka
Сообщения: 3977
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

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

Сообщение Chupaka »

Не проще отсылку в Телеграм засунуть внутрь блока do { ... }, который с on-error={}? Если добавление в address-list закончится с ошибкой - то до fetch дело не дойдёт, а ошибку проглотит on-error
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

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

Сообщение bear »

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

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

Сообщение Chupaka »

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

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

Сообщение bear »

уважаемый лесник, мы ещё не закончили :-)

появился новый вопрос по этой части:

ошибка

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

<123.123.144.123>: user Admin authentication failed
скрипт

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

: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={}
}
как оказалось, в такой ошибке не всегда присуствует IP, иногда ошибка выглядит так

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

<123>: user Admin authentication failed
и в этом случае в block_vpn_access попадает не то что надо

я хотел сделать простою проверку на количество символов между "<" и ">", но скрипт почему-то не работает
при этом сообщения находятся, вырезаются правильно, считаются тоже правильно, но вот if не отрабатывает

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

:foreach i in=[/log/find message~".*>: user [^ ]+ authentication failed"] do={
	:local logMessage [/log get $i message];
	:local startPosition [:find $logMessage "<"];
	:local endPosition [:find $logMessage ">"];
	:local msg [:pick $logMessage ($startPosition + 1) $endPosition];
	:if (:len [$msg] > 6) do={
		: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={}
	}
}
что я упускаю?
или может есть какой-то другой способ для решения это проблемы?
Последний раз редактировалось bear 10 апр 2024, 20:10, всего редактировалось 1 раз.
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

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

Сообщение bear »

квадратные скобки упустил блин

вот правильный вариант

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

:foreach i in=[/log/find message~".*>: user [^ ]+ authentication failed"] do={
	:local logMessage [/log get $i message];
	:local startPosition [:find $logMessage "<"];
	:local endPosition [:find $logMessage ">"];
	:local msg [:pick $logMessage ($startPosition + 1) $endPosition];
	:if ([:len [$msg]] > 6) do={
		: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={}
	}
}
Аватара пользователя
Chupaka
Сообщения: 3977
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

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

Сообщение Chupaka »

Хм... Если хотите проверять, что там IP-адрес - ну так почему бы не искать "\\d+\\.\\d+\\.\\d+\\.\\d+" вместо ".*"?..
Аватара пользователя
bear
Сообщения: 167
Зарегистрирован: 03 мар 2016, 18:39

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

Сообщение bear »

ну вот опять
я тут рисую себе сложные варианты с if-else, а достаточно в начале сразу это проверить :-)
спасибо, работает этот вариант