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

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

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

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

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

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

Ansy
Сообщения: 2
Зарегистрирован: 09 июн 2018, 17:50

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

Сообщение Ansy » 09 июн 2018, 18:12

Можно обойтись без 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
Сообщения: 7
Зарегистрирован: 17 авг 2016, 02:48

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

Сообщение Gennadiy51 » 09 июн 2018, 20:39

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, wAP ac, 2 x RB450G, hAP lite, X86 (Intel 566 MHz Slot1).

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

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

Сообщение Chupaka » 09 июн 2018, 22:22

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

Ansy
Сообщения: 2
Зарегистрирован: 09 июн 2018, 17:50

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

Сообщение Ansy » 10 июн 2018, 21:47

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

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

Ответить