Скрипт блокировки адресов. Нужна помощь.

Раздел для тех, кто начинает знакомиться с MikroTik
Правила форума
Как правильно оформить вопрос.
Прежде чем начать настройку роутера, представьте, как это работает. Попробуйте почитать статьи об устройстве интернет-сетей. Убедитесь, что всё, что Вы задумали выполнимо вообще и на данном оборудовании в частности.
Не нужно изначально строить Наполеоновских планов. Попробуйте настроить простейшую конфигурацию, а усложнения добавлять в случае успеха постепенно.
Пожалуйста, не игнорируйте правила русского языка. Отсутствие знаков препинания и неграмотность автора топика для многих гуру достаточный повод проигнорировать топик вообще.

1. Назовите технологию подключения (динамический DHCP, L2TP, PPTP или что-то иное)
2. Изучите темку "Действия до настройки роутера".
viewtopic.php?f=15&t=2083
3. Настройте согласно выбранного Вами мануала
4. Дочитайте мануал до конца и без пропусков, в 70% случаев люди просто не до конца читают статью и пропускают важные моменты.
5. Если не получается, в Winbox открываем терминал и вбиваем там /export hide-sensitive. Результат в топик под кат, интимные подробности типа личных IP изменить на другие, пароль забить звездочками.
6. Нарисуйте Вашу сеть, рисунок (схему) сюда. На словах может быть одно, в действительности другое.
Ответить
i_eremenko
Сообщения: 9
Зарегистрирован: 17 июл 2018, 12:19

Приветствую!
Начал изучать Микротик недавно.

ВНИМАНИЕ! ВСЁ НИЖЕПЕРЕЧИСЛЕННОЕ НУЖНО ИСКЛЮЧИТЕЛЬНО ДЛЯ ТОГО, ЧТОБЫ РАЗОБРАТЬСЯ СО СКРИПТИНГОМ В МИКРОТИКАХ! НЕ ИСПОЛЬЗУЙТЕ ЭТО ДЛЯ ДРУГИХ ЦЕЛЕЙ!

На просторах интернета наткнулся на следующую конструкцию: ( 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;
Суть в следующем: раз в 5 минут запускается сей скрипт, и всех, кто безуспешно пытался подобрать пароль на мою железку, вношу на 12 часов в список автобана.
Название списка формирую с учётом сервиса, на который ломится этот нехороший (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
Но: хотелось бы оставить себе право на ошибку при вводе пароля. Для этого нужно, чтобы скрипт считал количество попыток подключения. И срабатывал если неудачных попыток было больше, ну например, 5 или 10.
Приблизительная логика работы должна быть следующая:

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

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
но хочу всё сделать скриптом. Чем-то меня скрипт больше привлекает.
Помогите товарищи Гуру!
Последний раз редактировалось i_eremenko 18 июл 2018, 10:39, всего редактировалось 1 раз.


Аватара пользователя
amv
Сообщения: 7
Зарегистрирован: 23 дек 2017, 21:57

Этот вопрос решается менее затратными правилами firewall


i_eremenko
Сообщения: 9
Зарегистрирован: 17 июл 2018, 12:19

amv писал(а): 18 июл 2018, 07:32 Этот вопрос решается менее затратными правилами firewall
:sh_ok:
Этот ответ был более затратным, чем просто промолчать. ::yaz-yk:
Эта задача нужна не для того, чтобы снизить нагрузку на Микротик, ему мощности хватит, а для того, чтобы разобраться со скриптингом на нём.
По поводу затратности: https://github.com/AleksovAnry/Edelweis ... lweiss.rsc

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

# Контроллер работы скриптов и функций. Выполняется каждые 5 секунд при наличии скриптов "Edelweiss" и "Control" а так же глобальных
# переменных "controlledScripts" и "controlledFunctions". Следит за работой скриптов и при аварии перезапускает их. Так же будет полезен как
# некий аналог штатного планировщика для работы функций построенных на базе Edelweiss.
# Применение:
# $edelctl do=start
# $edelctl do=stop
# $edelctl do=restart
# $edelctl do=status

:global edelctl do={

	:local ecsrt do={
		if ([len [/system script job find where script=Edelweiss]]< 2) do={
			execute "/system script run Control";
			execute "/system script run Edelweiss";
		}
	}
	:local ecstp do={
		:global Edelweiss;
		set $Ia [/system script job find where script=Edelweiss];
		set $Nm [len $Ia];
		do {
			execute "/system script job remove numbers=$Ia"
			set $Nm ($Nm-1);
		} while ($Nm>0);
		log info "Edelweiss:: Stop \"Edelweiss Control\" $Edelweiss";
	}

	if ($do="start") do={$ecsrt;}
	if ($do="stop") do={$ecstp;}
	if ($do="restart") do={$ecstp;delay 500ms;$ecsrt;}
	if ($do="status") do={/system script job print where script=Edelweiss}
}


if ([len [/system script job find where script=Edelweiss]]< 2) do={
	if ([len [/system script find name=Control]]=1) do={
		:global Edelweiss;
		:global controlledScripts;
		:global controlledFunctions;
		if ([typeof $controlledScripts]="array" && [typeof $controlledFunctions]="array") do={
			log info "Edelweiss:: Start \"Edelweiss Control\" $Edelweiss";
			do {
				set $conA ([len $controlledScripts]-1);
				do {
					set $ScriptCurrentControl [($controlledScripts->$conA)];
					if ([len [/system script job find where script=$ScriptCurrentControl]]< 1 && [len [/system script find name=$ScriptCurrentControl]]=1) do={
						execute "/system script run $ScriptCurrentControl";
						log info "Edelweiss:: Run \"$ScriptCurrentControl\"";
					}
					delay 100ms;
					set $conA ($conA-1);
				} while ($conA>-1);

				set $conB ([len $controlledFunctions]-1);
				do {
					set $FunctionCurrentControl [($controlledFunctions->$conB)];
					execute "$FunctionCurrentControl Name=Edelweiss";
					delay 250ms;
					set $conB ($conB-1);
				} while ($conB>-1);

				delay 5s;
			} while (true);

		} else={
				execute "/system script run Control"
				delay 500ms;
				if ([typeof $controlledScripts]="array" && [typeof $controlledFunctions]="array") do={				
					log warning "Edelweiss:: Control variable not found. Restart script";
					execute "/system script run Edelweiss";
				} else={
					log warning "Edelweiss:: Control variable empty. Stop script";
					execute "$edelctl do=stop";
				}
			}

	} else={
		log warning "Edelweiss:: Script \"Control\" not found";
	}

}
Вот эта часть скрипта запускается каждые 5 секунд, при этом нагрузка на оборудование небольшая. Мне требуется запускать скрипт раз в 5 минут, то есть в 60 раз реже, скрипт менее сложен, так что извините "Великий Гуру Amv", но я сомневаюсь в Вашей профессиональности. :smu:sche_nie:
Мои вопросы выше относятся к логике работы и к методам реализации именно скрипта. В своём первом посте я описывал вариант реализации подобного "менее затратными правилами firewall", поэтому подобные указания совсем не то, что нужно. :nez-nayu:

Мне нужно что-то типа:
"-А нафига ты паришься с массивами, используй лог! Создай ещё один лог в памяти специально для работы скрипта, в скрипте считай айпишники с сервисами, и пиши их не в массив, а в лог, а потом по нему блочь!"
"-Вот тут у тебя куча костылей с определениями и переменными, они тут нафиг не упёрлись, надо сделать так: *блок кода*"
"-Используй вместо *блок кода* вот такую конструкцию: *блок кода*"

Так что уважаемый "Великий Гуру Amv", если Вас затруднит разобраться в том, что таки требуется топикстартеру, пожалуйста воспользуйтесь "менее затратными" решениями. То есть просто не отвечайте. Искренне благодарен Вам за участие. И извините за такое большое количество сарказма. Я не специально, честно! :ups: Не выспался наверное...


vqd
Модератор
Сообщения: 3600
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

Ваше решенее настолько же глупое как пытаться сделать капитальный ремонт двигателя через выхлопную трубу.

Как вы выше сказали все что вы написали решается парой правил в фаерволе


Есть интересная задача и бюджет? http://mikrotik.site
i_eremenko
Сообщения: 9
Зарегистрирован: 17 июл 2018, 12:19

vqd писал(а): 18 июл 2018, 10:02 Ваше решенее настолько же глупое как пытаться сделать капитальный ремонт двигателя через выхлопную трубу.

Как вы выше сказали все что вы написали решается парой правил в фаерволе
Ндя. Если даже модератор считает, что разбираться со скриптингом микротика - "решенее настолько же глупое как пытаться сделать капитальный ремонт двигателя через выхлопную трубу.", то тему нужно закрывать. Извините за потраченное внимание и время. Придётся как и раньше: хочешь сделать хорошо - делай это сам. Спасибо за помощь и участие. :te_ma-clo_se:


vqd
Модератор
Сообщения: 3600
Зарегистрирован: 26 сен 2013, 14:20
Откуда: НСК
Контактная информация:

Разбиратся со скриптами правильно. Но выкладывать глупое решение это неправильно. Потом недолекий товарищ его подхватит и будет тут мозги компосировать мол "а че не работает"


Есть интересная задача и бюджет? http://mikrotik.site
i_eremenko
Сообщения: 9
Зарегистрирован: 17 июл 2018, 12:19

vqd писал(а): 18 июл 2018, 10:32 Разбиратся со скриптами правильно. Но выкладывать глупое решение это неправильно. Потом недолекий товарищ его подхватит и будет тут мозги компосировать мол "а че не работает"
Хмм. А если так: *поправляет начало первого поста* :pisa_tel:


Erik_U
Сообщения: 1903
Зарегистрирован: 09 июл 2014, 12:33

i_eremenko писал(а): 18 июл 2018, 09:43
Этот ответ был более затратным, чем просто промолчать. ::yaz-yk:
Эта задача нужна не для того, чтобы снизить нагрузку на Микротик, ему мощности хватит, а для того, чтобы разобраться со скриптингом на нём.
Вы не правы.
В этом разделе форума делятся готовыми, проверенными, работоспособными, полезными скриптами.

Помощь просят в других разделах. Но.
Просить помочь решить конкретную задачу, а потом заявлять, что нужно не эффективное решение объявленной задачи, а личностный рост скриптописания - не правильно еще раз.

Ну, и последнее. Насколько мне удалось выяснить, этот форум - вполне себе частный ресурс, не имеющий отношения к производителю оборудования. А участники форума - вообще случайные люди, когда то купившие себе микротик.
Ни у кого из них нет обязанности решать любые задачи, сформулированные в любой форме.
Поэтому охотно решаются либо точно сформулированные, либо интересные, либо критичные задачи.

Вы уверены, что задача разбора нескольких листов некачественного скрипта на заранее ущербную тему ради вашего личностного роста относится к интересным, точно сформулированным, или критичным?

Здесь есть перевод статьи из вики на русский язык
https://telecom-sales.ru/content/stati/ ... -routeros/


i_eremenko
Сообщения: 9
Зарегистрирован: 17 июл 2018, 12:19

Erik_U писал(а): 18 июл 2018, 10:55
В этом разделе форума делятся готовыми, проверенными, работоспособными, полезными скриптами.

Помощь просят в других разделах.
А вот за это огромное Вам спасибо! Попрошу модератора переместить тему.


Аватара пользователя
podarok66
Модератор
Сообщения: 4370
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Вот специально не лез в полемику, было интересно, кто и как отреагирует. :-) По правде сказать, всё вышло ожидаемо. Думаю, в основном как раз из-за неверного выбора ветки и неточно сформулированной цели в первом посту.
Мои мысли по поводу всего этого:
1. Желание научиться писать скрипты весьма приятно мне видеть. Очень многие приходят просто получить, а ТС пришёл учиться. Я рад.
2. Задача, которую собрался решать ТС, действительно проще и точнее решается набором правил в фаерволе, и изобретать велосипед при наличии мотоцикла не слишком благодарное занятие.
3. Предположим, что ТС изучает теорию, и всё здесь ради теории. Вопрос, как быть с теми из переборщиков, кто начал свою работу перед самым началом работы скрипта? Они не наберут нужного количества попыток и для них после отработки скрипта будет еще 5 минут для их грязных делишек и тьма попыток за это время. Уменьшим период срабатывания скрипта - ситуация будет возникать чаще, увеличим - у негодяев будет больше времени. Набор правил в фаерволе лишен этого недостатка.
4. Наши люди весьма неохотно занимаются голой теорией, это, как правило не даёт им никакой пользы, не приносит дивидендов и не решает никаких задач. Реально существующая задача намного интереснее и в ее решении есть некий неуловимо приятный момент удовольствия. Даже если никаких других выгод не воспоследует.
Вы сначала решите, что вам действительно нужно с помощью скриптов осуществить, а уж потом приступайте к планированию и написанию самих скриптов.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Ответить