Хранение больших firewall address-list в RAM / USB-Flash

Базовая функциональность RouterOS
xankraegor
Сообщения: 3
Зарегистрирован: 15 май 2018, 18:47

Хранение больших firewall address-list в RAM / USB-Flash

Сообщение xankraegor »

Здравствуйте!

Возникла необходимость заворачивать десятки тысяч разных IP-адресов и подсетей на определенный интерфейс в hap AC^2. Всё настроено и работает в связке firewall access list->mangle->route->nat, написал программу, которая собирает нужные адреса, объединяет их, фильтрует и пересылает с помощью MikrotikAPI на роутер.
Но вот беда. В роутере очень уж маленький объем NAND, и из общих чуть менее 16, у меня имеется всего 3 мб., в которые у меня влезает около 24 тысяч записей access-list из порядка 63 тысяч. Остальное записывается в RAM-диск и после перезагрузки роутера естественно исчезает. Это кажется не так страшно: можно ведь докачать недостающие с помощью программы. Но забитая до предела NAND приводит к невозможности сохранения и других измененных настроек роутера, если такие были. И вот это уже большая проблема.
Попытался попробовать использовать какой-то другой тип списков, например из WebProxy — его вроде можно сохранить на подключенный USB-девайс. Но firewall с такими списками работать не желает.
Я вижу два возможных выхода: сохранять список на флешку или же в целиком в RAM-диск (памяти на хранение всего списка в отличие от NAND хватает), но не нашел как. Может это всё же возможно? Или есть какие-то обходные пути типа использования access list’a WebProxy? Или хранения access-list’a на стороннем устройстве? Я бы мог например прикрутить к USB-выходу Raspberry Pi, обдающуюся с ним по API, но совершенно не понимаю, чем это может помочь.

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

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение Chupaka »

Приветствую.

WebProxy никак не поможет, это другая программа, к роутингу отношения не имеющая.
xankraegor писал(а): 15 май 2018, 19:16 Я вижу два возможных выхода: сохранять список на флешку или же в целиком в RAM-диск (памяти на хранение всего списка в отличие от NAND хватает), но не нашел как. Может это всё же возможно?
А если создавать динамические записи (указать timeout=35w) - они будут в памяти, не записываются на диск, и после перезагрузки можно влить опять с помощью программы. Не подойдёт?
xankraegor писал(а): 15 май 2018, 19:16 Или хранения access-list’a на стороннем устройстве? Я бы мог например прикрутить к USB-выходу Raspberry Pi, обдающуюся с ним по API, но совершенно не понимаю, чем это может помочь.
Ну, разве что поднять между Pi и ROS сессию BGP - и по ней получать список маршрутов.
xankraegor
Сообщения: 3
Зарегистрирован: 15 май 2018, 18:47

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение xankraegor »

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

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение Chupaka »

Да, по BGP маршруты прилетают на роутер только когда поднята BGP-сессия.
xankraegor
Сообщения: 3
Зарегистрирован: 15 май 2018, 18:47

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение xankraegor »

Спасибо! Я окончательно убедился в том, что динамические списки будут для меня лучшим решением. Еще один вопрос по реализации, если можно. Как в API передать сразу множество однотипных параметров? Интересует, прежде всего id.
На конкретном примере с /ip/firewall/remove при имеющемся списке id записей в access-list'e вторая строка как правильно пишется?
  • =.id=*1,*2,*3,*4
  • =.id=1,2,3,4
  • =.id=<1>,<2>,<3>,<4>

или еще как-то правильно?

Или почти аналогичное /ip/firewall/address-list/add
=list=listname
=timeout=35w
=address=1.1.1.1,2.2.2.2,3.3.3.0/24,4.4.0.0/16
? вроде как не проходит, микротик ругается что то, что после "address= ", "is not a valid dns name".

Я работаю с достаточно сыроватом API под Swift с сайта Mikrotik неизвестного авторства (даже на GitHub не закоммитить свои исправления :/) и тщетно пытаюсь отделить его проблемы от моего незнания синтаксиса API. Пока что приходится каждый запрос отсылать отдельно, в итоге вся программа отрабатывает за 25 минут, что для передачи 3 мб команд как-то очень уж много :)

P.S. Судя по выводу из консоли Микротика, всё печально, по крайней мере много адресов сразу передавать нельзя (в консоль) :
Address ::= A.B.C.D[-A.B.C.D |0..32 |/A.B.C.D ] (IP address range)
Range и подсети у меня и так используются по-максимуму, за это отвечает программа. Но хотелось бы как-то пакетно заливать список.
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение Chupaka »

Если /remove умеет удалять сразу несколько значений - тогда =.id=*1,*2,*3,*4 выглядит самым правильным. Но есть подозрение, что не умеет, и надо всё по одному удалять.

Добавлять - точно по одному :) Для ускорения можно попробовать в несколько потоков это делать...

Если обычные команды в Терминал вливаются быстрее - можно генерировать скрипт для создания - и его по ssh/telnet отправлять на роутер.
Ansy
Сообщения: 3
Зарегистрирован: 09 июн 2018, 17:50

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение Ansy »

Можно обойтись без API, автоскриптом.

Имя файла должно оканчиваться на .auto.rsc, заливать по FTP (можно на подключенную флешку) -- оно сразу само выполняется, ошибки пишет в лог (есть смысл поднастроить логгирование), если всё ОК -- рядом в Files появляется файлик .auto.log с результатом (или пустой, если накосячили в коде).

Скрипт укомпакчивал долго, чтобы сократить объем. Вышло примерно так (параметры разделены табуляцией, работает автодополнение):

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

/ip firewall address-list { remove numbers=[find list=z]
a       l       z t     9w a    100.34.204.147
a       l       z t     9w a    101.0.110.52
...
a       l       z t     9w a    99.192.254.198
}
Тут пока 80K строк с хвостиком заливается норм, адреса и подсети вперемешку.
Таймаут выбран такой (9w), чтоб маскимальный срок жизни, но минимум символов в коде (всё равно обновляется ежечасно).
В аналогичном стиле сделаны и записи доменов и шаблонов в Access для Web-Proxy, их пока порядка 19К. Заливаемый скрипт весит под 2.7MB.
Всё вместе с обрезанной по минимуму системой жужжит на RB951Ui-2HnD (потому что там NAND и 128MB RAM, около 20 пока свободно).

Но думаю, на что уползать / делить функции, ибо аппетит у РКН (вы ведь их блокировки реализуете, судя по количеству записей на момент старта темы?) растёт, и уже есть риск упереться в RAM и штраф :(
Пробовал hEX (RB750Gr3) -- оно падало на перезагрузке, именно из-за FLASH-памяти. Сейчас рассматриваю или варианты с x86 (на порядки быстрее, но непонятно, какое железо ставить в необслуживаемом исполнении) или RB450Gx4 (их пока не везут, только анонсировали).
Аватара пользователя
Gennadiy51
Сообщения: 14
Зарегистрирован: 17 авг 2016, 02:48

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение Gennadiy51 »

Ansy писал(а): 09 июн 2018, 18:12
Пробовал hEX (RB750Gr3) -- оно падало на перезагрузке, именно из-за FLASH-памяти. Сейчас рассматриваю или варианты с x86 (на порядки быстрее, но непонятно, какое железо ставить в необслуживаемом исполнении) или RB450Gx4 (их пока не везут, только анонсировали).
RB450Gx4 можно уже сейчас купить здесь: https://www.eurodk.com/en/products/rout ... ard-450gx4
RB493G, 2 x hAP ac^2, 2 x hAP ac^3, wAP ac, 2 x RB450G, hAP ac lite, X86 (Intel 566 MHz Slot1).
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение Chupaka »

Ansy писал(а): 09 июн 2018, 18:12 (параметры разделены табуляцией, работает автодополнение)
Табуляция не обязательна, работает не автодополнение, а сокращение команд до минимума, при котором ещё можно понять, что там за команда в данном контексте :)
Ansy
Сообщения: 3
Зарегистрирован: 09 июн 2018, 17:50

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение Ansy »

Gennadiy51 писал(а): 09 июн 2018, 20:39
Ansy писал(а): 09 июн 2018, 18:12 RB450Gx4 (их пока не везут, только анонсировали).
RB450Gx4 можно уже сейчас купить здесь: https://www.eurodk.com/en/products/rout ... ard-450gx4
Ну, так-то понятно, что купить быстрее в принципе где-то возможно... но мне ж не лично себе, а контора заказывает лишь при обоснованной необходимости, со всеми документами и в проверенных уже Интернет-магазинах.
Подождём у наших обычных поставщиков.

С другой стороны, если кто уже пощупал эту железку -- интересен бы был временный удалённый доступ к ней или просто выслать текущий скрипт, залить списки и посмотреть время обработки (разницу таймстампов скрипта и лога по завершении) -- могбыть игра не стОит свеч.
Chupakabra303
Сообщения: 31
Зарегистрирован: 24 янв 2017, 11:57

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение Chupakabra303 »

А что это за фильтр такой с десятками тысяч адресов и сетей?
Chupakabra303
Сообщения: 31
Зарегистрирован: 24 янв 2017, 11:57

Re: Хранение больших firewall address-list в RAM / USB-Flash

Сообщение Chupakabra303 »

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