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

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

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

Сообщение xankraegor » 15 май 2018, 19:16

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

Возникла необходимость заворачивать десятки тысяч разных 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
Сообщения: 828
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka » 15 май 2018, 19:27

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

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 » 15 май 2018, 21:11

Спасибо, попробую с таймаутом, как более простой вариант!
Я так понимаю, что во втором случае маршруты тоже сохраняются в памяти роутера?

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

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

Сообщение Chupaka » 16 май 2018, 13:43

Да, по BGP маршруты прилетают на роутер только когда поднята BGP-сессия.

xankraegor
Сообщения: 3
Зарегистрирован: 15 май 2018, 18:47

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

Сообщение xankraegor » 17 май 2018, 00:24

Спасибо! Я окончательно убедился в том, что динамические списки будут для меня лучшим решением. Еще один вопрос по реализации, если можно. Как в 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
Сообщения: 828
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka » 17 май 2018, 12:08

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

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

Если обычные команды в Терминал вливаются быстрее - можно генерировать скрипт для создания - и его по ssh/telnet отправлять на роутер.

Ответить