Русский
Русский
English
Статистика
Реклама

Administration

SaaS и ALEPIZ мониторинг и управление инфраструктурой

20.05.2021 12:07:50 | Автор: admin

Я системный администратор, более 20 лет занимаюсь управлением и мониторингом критичной в масштабах страны инфраструктуры. Услуги, которые я администрирую, предоставляются по модели SaaS (Software as a Service аренда ПО). Это моя первая публикация, я решил поделиться своими наработками в этой области, возможно кому-то это будет полезно.

ALEPIZ распространяется бесплатно по лицензии GPL v3ALEPIZ распространяется бесплатно по лицензии GPL v3

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

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

История

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

В начале 2000 мы начали внедрять, как тогда казалось подходящую нам и довольно распространенную систему мониторинга. В процессе её адаптации через некоторое время стало понятно, что использовать систему как есть не получится. Пришлось заниматься доработкой. В результате, за 10 лет эксплуатации и разработки мы получили систему по управлению и мониторингу с организацией рабочих процессов между подразделениями. В качестве ядра системы использовалась выбранная нами система мониторинга и ее БД.

Обновить ее мы не могли, потому что разработчики системы мониторинга меняли структуру БД, к которой было жестко привязано наше ПО. Несколько лет назад производительности системы стало существенно не хватать. Появилось много неудобств, связанных с недостаточно проработанной архитектурой как системы мониторинга, так и наших доработок.

Я решил учесть ошибки и разработать новую систему. Большинство продуктов создаются разработчиками ПО, а я системный администратор. Я хуже знаю процесс разработки, но проектирование и реализация системы для системных администраторов в данном случае сделана системным администратором, с учетом нюансов нашей работы. Считаю, что это положительно сказалось на конечном результате

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

ALEPIZ

Новая система получила название ALEPIZ. Я не планировал ее распространять, но создание системы затянулось. Чтобы не платить за средства разработки я выполнил условия для их бесплатного использования: выложил ПО на GitHub под лицензией GPL v3 и создал сайт alepiz.com.

Data Browser служит для отображения собранных исторических данныхData Browser служит для отображения собранных исторических данных

Архитектура системы

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

Тестирование и эксплуатация ведется под ОС Microsoft Windows. Выбор ОС продиктован архитектурой программного обеспечения, которое используется в моей организации.

Для возможности портирования в будущем на другие архитектуры, в качестве платформы были выбраны JavaScript и NodeJS. Это так же позволило унифицировать разработку backend и frontend и использовать асинхронность JavaScript для достижения требуемой производительности. Применение потоков (threads) в NodeJS невозможно из-за отсутствия поддержки во многих модулях, поэтому используется схема с запуском нескольких процессов.

В ALEPIZ встроен Web сервер и сервер БД на основе быстрой и простой SQLITE. При развертывании системы нет необходимости в установке дополнительного ПО: ALEPIZ включает все требуемые компоненты. Для ускорения работы с БД реализована система кэширования, разработанная специально для ALEPIZ.

Есть периодическая очистка старых исторических данных, которая позволяет сделать размер БД близким к постоянному. Реализованы встроенная репликация и резервное копирование БД, система интеллектуального пропуска похожих данных, автоматическая ротация логов, система настройки прав ролевого доступа для пользователей и многое другое.

Сейчас ALEPIZ обслуживает одновременно более 250 000 метрик. Их количество постоянно увеличивается. Сбор данных по метрике происходит примерно раз в 3060 секунд. Исторические данные хранятся три месяца и база данных занимает около 1Тб. Для работы используется сервер с двумя процессорами Intel, по двенадцать ядер в каждом. Суммарная загрузка процессоров около 40% и зависит от количества расчетов, выполняемых ALEPIZ. Потребление памяти 64Gb. В качестве дисковой подсистемы используется RAID10 из 8 HDD 10 000 Rpms. Репликация и резервное копирование БД производится по сети на другой сервер.

Системные требования

Для работы ALEPIZ требуется компьютер архитектуры Intel x64 с установленной ОС Microsoft Windows версии не ниже Windows Server 2012 или Windows 10. После установки ALEPIZ использует 200Mb дискового пространства. Потребление оперативной памяти на сервере с 12 ядрами CPU составляет 1Gb. При меньшем количестве ядер потребление памяти будет уменьшено.

Описание возможностей

ALEPIZ позволяет осуществлять сбор и хранение данных. Отличие от многих систем мониторинга заключается в том, что сбор данных происходит по определенным условиям. Например, если сервис остановлен, не будет осуществляться сбор данных по использованию сервисом памяти и процессора.

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

Dashboard позволяет обрабатывать произошедшие событияDashboard позволяет обрабатывать произошедшие события

ALEPIZ является не только системой мониторинга, но и системой для управления инфраструктурой. Для этого существуют специальные модули - действия. Например, действием может быть запуск или остановка внешнего сервиса, редактирование файла настроек, выполнения запросов к БД или копирование файлов для обновления ПО. Можно разрабатывать собственные действия.

Действия можно объединять в задачи и запускать их в определенное время, либо в зависимости от различных условий. Например, обновление сервиса должно запускаться только если он остановлен. Таким образом можно автоматизировать управление инфраструктурой.

Описание возможностей системы есть на сайте ALEPIZ и доступно на русском языке.

Сущности системы

Чтобы получить больше информации о принципах работы системы и ее возможностях, немного погрузимся в ALEPIZ.

Коллекторы

Для сбора данных используются модули, которые называются коллекторами (collectors). Например, коллектор PING используется для проверки доступности хостов по протоколу ICMP. Коллектор SNMP необходим для сбора данных по одноименному протоколу. MSSQL служит для выполнения запросов к БД MSSQL и т.п. На момент написания статьи в ALEPIZ реализован 21 коллектор. Можно разработать собственный. Информация о разработке коллектора и средства для разработки встроены в ALEPIZ.

Counter settings служит для настройки каунтераCounter settings служит для настройки каунтера

Каунтеры

Каунтеры (counters) это коллекторы с параметрами, которые определяют, какие данные необходимо собирать. Например, для того чтобы коллектор PING начал собирать информацию, ему в качестве параметра необходимо передать имя хоста, доступность которого требуется проверять. Параметры для коллекторов настраиваются в каунтерах.

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

Активные и пассивные коллекторы. Зависимости в каунтерах

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

Например, каунтер с активным коллектором Timer генерирует данные через определенные интервалы времени. Если от него сделать зависимым каунтер с пассивным коллектором SNMP, то данные по протоколу SNMP будут собираться через определенные каунтером интервалы времени. Если от каунтера с SNMP сделать зависимым каунтер с коллектором Events generator, то в случае превышения установленного порогового значения, в Dashboard появится предупреждение о возможной проблеме.

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

Объекты

Объекты (objects) это сущность с именем. Объектом может быть хост, сервис, исполняемый файл, база данных, дата центр и т. д. Объекты могут включать другие объекты, выступая в качестве каталогов.

Object editor необходим для редактирования объектов и их привязки к каунтерамObject editor необходим для редактирования объектов и их привязки к каунтерам

Связь объектов и каунтеров

Каунтеры не могут существовать сами по себе. Каждый каунтер должен быть привязан к одному или нескольким объектам. У объектов можно настроить свойства, которые будут использовать каунтеры для сбора или генерации информации. Например, объект хост может содержать свойство IP адрес, который будет использован каунтером с коллектором PING для проверки доступности этого хоста. Каунтер с коллектором PING можно привязать к нескольким объектам- хостам и он будет собирать данные в зависимости от настроенных свойств (IP адреса) для каждого из объектов.

Действия

Действия (actions) это модули ALEPIZ, которые используются для управления как непосредственно сущностями ALEPIZ, так и внешней инфраструктурой. Например, действием может быть модуль для создания нового объекта или каунтера ALEPIZ, или для запуска и остановки сервиса Windows, или для просмотра собранной исторической информации, или данных по различным событиям и т. п.

Можно разработать собственные действия. Информация и средства для разработки встроены в ALEPIZ.

Задачи

Задачи (tasks) это несколько действий, объединенных в группу. Задачи могут запускаться вручную, или в определенное время. A так же в зависимости от состояния определенных каунтеров и даже непосредственно из каунтеров.

С помощью задач можно автоматизировать управление инфраструктурой и организовать процессы для взаимодействия между различными подразделениями организации.

Tasks maker используется для управления задачамиTasks maker используется для управления задачами

Остальные возможности

Кроме того, в ALEPIZ есть такие модули, как лаунчеры для различных способов запуска действий, средства связи для передачи информации по email, SMS и т.п. Есть встроенный процессор с набором функций для обработки полученных данных, условий в каунтерах и формирования зависимостей на основе этих условий, система обработки произошедших событий с возможностью организации рабочих процессов в организации, средства отладки и т.д. Полное описание возможностей есть на сайте или в справке по ALEPIZ на русском языке.

Заключение

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

Не обязательно использовать сразу все возможности ALEPIZ. Если у Вас небольшая инфраструктура, или в настоящее время нет потребности в автоматическом управлении, можно использовать только часть функций, например, только мониторинг. В дальнейшем у Вас будет возможность расширения и внедрения автоматизации в систему управления инфраструктурой.

Хотел бы еще раз повторить: ALEPIZ распространяется бесплатно по лицензии GPL v3. Вы можете использовать его на свое усмотрение. Я не знаю способов монетизации системы, поэтому принял решение сделать его доступным для всех.

Если Вы решили поставить систему у себя, проще всего скачать и запустить установочный пакет для ОС Microsoft Windows со страницы https://alepiz.com/help/download.pug. В этом случае установка и первичная настройка системы произойдет автоматически. ALEPIZ можно поставить даже на персональный компьютер или ноутбук под управлением Windows 10.

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

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

Спасибо за прочтение, надеюсь, ALEPIZ поможет Вам и Вашему бизнесу в достижении новых целей.

Подробнее..

Перевод Используем nftables в Red Hat Enterprise Linux 8

15.07.2020 18:16:18 | Автор: admin

Статья подготовлена в преддверии старта курса Администратор Linux




В Red Hat Enterprise Linux 8 приоритетным низкоуровневым решением является nftables. В этой статье мы поговорим о том, как начать использовать nftables. Наиболее актуальной она будет для системных администраторов и DevOps-специалистов. Там, где это имеет смысл, мы поговорим о различиях между nftables и его предшественником iptables.


Для начала необходимо отметить, что nftables это userland-утилита, nft и подсистема ядра. Внутри ядра она строится на базе подсистемы netfilter. В этой статье мы будем говорить о взаимодействии пользователя с утилитой nft.


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


Примечание: в этой статье некоторые выходные данные могут быть достаточно длинными, поэтому мы сократим или уберем бесполезные или несущественные части вывода.

Начнем


Итак, как будет выглядеть настройка nftables по-умолчанию? Давайте выясним, выведя весь набор правил.


# nft list ruleset

В результате мы получим ничего. Ладно, это не очень интересно. О чем это говорит?


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


Создание таблиц


В nftables вам понадобится создавать таблицы вручную. Таблицы должны определять семейство: ip, ip6, inet, arp, bridge или netdev. Здесь inet означает, что таблица будет обрабатывать пакеты ipv4 и ipv6. Именно это семейство мы и будем использовать в статье.


Примечание: Для тех, кто переходит с iptables, термин таблица может звучать неоднозначно. В nftables таблица просто пространство имен, ни больше, ни меньше. По сути, она представляет из себя набор цепочек, правил, наборов и иных объектов.

Давайте создадим нашу первую таблицу и перечислим набор правил.


# nft add table inet my_table# nft list rulesettable inet my_table {}

Отлично, теперь у нас есть таблица, но сама по себе она мало что дает. Давайте перейдем к цепочкам.


Создание цепочек


Цепочки объекты, которые будут содержать правила брандмауэра.


По аналогии с таблицами, цепочки также нужно создавать вручную. При создании цепочки необходимо указать, к какой таблице она относится, а также тип, хук и приоритет. В этом руководстве мы не будем ничего усложнять и используем filter, input, и priority 0 для фильтрации пакетов, предназначенных для хоста.


# nft add chain inet my_table my_filter_chain { type filter hook input priority 0 \; }

Примечание: Обратный слэш () нужен, чтобы shell не интерпретировал скобку как конец команды.

Цепочки также могут быть созданы без указания хука. Созданные таким образом цепочки эквиваленты цепочкам, созданным пользователями в iptables. Правила могут использовать операторы jump или goto для выполнения правил в цепочке. Эта механика полезна для логического разделения правил или для того, чтобы делиться подмножеством правил, которые в противном случае продублировались бы.


# nft add chain inet my_table my_utility_chain

Создание правил


Теперь, когда вы создали таблицу и цепочку, вы можете, наконец, добавить правила для брандмауэра. Давайте добавим правило для разрешения SSH.


# nft add rule inet my_table my_filter_chain tcp dport ssh accept

Здесь следует отметить, что как только мы добавили его в таблицу семейства inet, это единственное правило будет обрабатывать как пакеты IPv4, так и пакеты IPv6.


Глагол add будет добавлять правило в конец цепочки. Также вы можете использовать глагол insert, чтобы добавить правило в начало цепочки.


# nft insert rule inet my_table my_filter_chain tcp dport http accept

Мы добавили два правила, а теперь давайте посмотрим, как будет выглядеть полный набор правил.


# nft list rulesettable inet my_table {    chain my_filter_chain {    type filter hook input priority 0; policy accept;    tcp dport http accept    tcp dport ssh accept    }}

Обратите внимание, что правило http должно отрабатывать раньше правила ssh, поскольку мы использовали выше глагол insert.


Также вы можете добавить правило в произвольное место в цепочке. Есть два способа сделать это.


  1. Используйте index, чтобы указать на индекс в списке правил. Использование add добавит новое правило после указанного индекса. Если же вы используете insert, то новое правило будет добавлено перед правилом с заданным индексом. Значения индексов начинаются с 0.

# nft insert rule inet my_table my_filter_chain index 1 tcp dport nfs accept# nft list rulesettable inet my_table {    chain my_filter_chain {    type filter hook input priority 0; policy accept;    tcp dport http accept    tcp dport nfs accept    tcp dport ssh accept    }}# nft add rule inet my_table my_filter_chain index 0 tcp dport 1234 accept# nft list rulesettable inet my_table {    chain my_filter_chain {    type filter hook input priority 0; policy accept;    tcp dport http accept    tcp dport 1234 accept    tcp dport nfs accept    tcp dport ssh accept    }}

Примечание: Использование index с insert по факту эквивалентно опции iptables -I с индексом. Первое, о чем нужно помнить, так это о том, что индексы в nftables начинаются с 0. Во-вторых, индекс должен указывать на существующее правило. То есть писать "nft insert rule index 0" в пустой цепочке недопустимо.

  1. Используйте handle, чтобы указать правило, до или после которого нужно вставлять другое правило. Для вставки после используйте глагол add. Чтобы вставить до правила, используйте insert. Вы можете получить handle правил, добавив флаг handle при выводе правил.

# nft --handle list rulesettable inet my_table { # handle 21    chain my_filter_chain { # handle 1    type filter hook input priority 0; policy accept;    tcp dport http accept # handle 3    tcp dport ssh accept # handle 2    }}# nft add rule inet my_table my_filter_chain handle 3 tcp dport 1234 accept# nft insert rule inet my_table my_filter_chain handle 2 tcp dport nfs accept# nft --handle list rulesettable inet my_table { # handle 21    chain my_filter_chain { # handle 1    type filter hook input priority 0; policy accept;    tcp dport http accept # handle 3    tcp dport 1234 accept # handle 8    tcp dport nfs accept # handle 7    tcp dport ssh accept # handle 2    }}

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


Также вы можете получить handle правила во время создания, используя сразу два флага echo и handle. Правило будет выведено в CLI вместе с его handle.


# nft --echo --handle add rule inet my_table my_filter_chain udp dport 3333 acceptadd rule inet my_table my_filter_chain udp dport 3333 accept # handle 4

Примечание: старые версии nftables использовали позицию ключевого слова. С тех пор механика ключевых слов устарела и появился handle.

Удаление правил


Удаление правил выполняется с помощью handle правила по аналогии с командами add и insert выше.


Сначала нужно найти handle правила, которое вы хотите удалить.


# nft --handle list rulesettable inet my_table { # handle 21    chain my_filter_chain { # handle 1    type filter hook input priority 0; policy accept;    tcp dport http accept # handle 3    tcp dport 1234 accept # handle 8    tcp dport nfs accept # handle 7    tcp dport ssh accept # handle 2    }}

Затем используйте этот handle для удаления правила.


# nft delete rule inet my_table my_filter_chain handle 8# nft --handle list rulesettable inet my_table { # handle 21    chain my_filter_chain { # handle 1    type filter hook input priority 0; policy accept;    tcp dport http accept # handle 3    tcp dport nfs accept # handle 7    tcp dport ssh accept # handle 2    }}

Листинг правил


В примерах выше мы выводили весь список правил. Существует много других способов вывести подмножество правил.


Вывести все правила в заданной таблице.


# nft list table inet my_tabletable inet my_table {    chain my_filter_chain {        type filter hook input priority 0; policy accept;        tcp dport http accept        tcp dport nfs accept        tcp dport ssh accept    }}

Вывести правила в заданной цепочке.


# nft list chain inet my_table my_other_chaintable inet my_table {    chain my_other_chain {        udp dport 12345 log prefix "UDP-12345"    }}

Наборы


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


Анонимные наборы


Любое правило может иметь inline-наборы. Эта механика полезна для наборов, которые вы не собираетесь изменять.


Например, следующая команда будет разрешать весь трафик с 10.10.10.123 и 10.10.10.231.


# nft add rule inet my_table my_filter_chain ip saddr { 10.10.10.123, 10.10.10.231 } accept# nft list rulesettable inet my_table {    chain my_filter_chain {        type filter hook input priority 0; policy accept;        tcp dport http accept        tcp dport nfs accept        tcp dport ssh accept        ip saddr { 10.10.10.123, 10.10.10.231 } accept    }

Недостатком этого метода является то, что если вам нужно изменить набор, то нужно будет заменять и правило. Чтобы получить мутабельные наборы, нужно использовать именованные наборы.


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


# nft add rule inet my_table my_filter_chain tcp dport { http, nfs, ssh } accept

Примечание: пользователи iptables скорее всего привыкли к использованию ipset. Поскольку в nftables есть собственная нативная поддержка наборов, ipset использовать не нужно.

Именованные наборы


Nftables также поддерживает мутабельные именованные наборы. Для их создания необходимо указать тип элементов, которые будут в них содержаться. Например, типы могут быть такими: ipv4_addr, inet_service, ether_addr.


Давайте создадим пустой набор.


# nft add set inet my_table my_set { type ipv4_addr \; }# nft list setstable inet my_table {    set my_set {    type ipv4_addr    }}

Чтобы сослаться на набор в правиле используйте символ @ и имя набора после него. Следующее правило будет работать как черный список для IP-адресов в нашем наборе.


# nft insert rule inet my_table my_filter_chain ip saddr @my_set drop# nft list chain inet my_table my_filter_chaintable inet my_table {    chain my_filter_chain {    type filter hook input priority 0; policy accept;    ip saddr @my_set drop    tcp dport http accept    tcp dport nfs accept    tcp dport ssh accept    ip saddr { 10.10.10.123, 10.10.10.231 } accept    }}

Конечно, это не особо эффективно, так как в наборе пусто. Давайте добавим в него несколько элементов.


# nft add element inet my_table my_set { 10.10.10.22, 10.10.10.33 }# nft list set inet my_table my_settable inet my_table {    set my_set {    type ipv4_addr    elements = { 10.10.10.22, 10.10.10.33 }    }}

Однако попытка добавить диапазон значений приведет к ошибке.


# nft add element inet my_table my_set { 10.20.20.0-10.20.20.255 }Error: Set member cannot be range, missing interval flag on declarationadd element inet my_table my_set { 10.20.20.0-10.20.20.255 }

Чтобы использовать диапазоны в наборах, нужно создать набор с использованием флагов интервалов. Так нужно, чтобы ядро заранее знало, какой тип данных будет храниться в наборе, чтобы использовать соответствующую структуру данных.


Интервалы в наборах


В наборах также могут использовать диапазоны. Для IP-адресов это может быть крайне полезно. Для использования диапазонов, набор должен быть создан с использованием флагов интервалов.


# nft add set inet my_table my_range_set { type ipv4_addr \; flags interval \; }# nft add element inet my_table my_range_set  { 10.20.20.0/24 }# nft list set inet my_table my_range_settable inet my_table {    set my_range_set {    type ipv4_addr    flags interval    elements = { 10.20.20.0/24 }    }}

Примечание: Нотация маски сети была неявно преобразована в диапазон IP-адресов. Аналогично, мы могли бы написать 10.20.20.0-10.20.20.255 и получить тот же эффект.

Конкатенации наборов


Наборы также поддерживают агрегатные типы и совпадения. То есть элемент набора также может содержать несколько типов, а правило может использовать оператор конкатенации . при обращении к набору.


В этом примере мы сможем сопоставлять IPv4-адреса, IP-протоколы и номера портов одновременно.


# nft add set inet my_table my_concat_set  { type ipv4_addr . inet_proto . inet_service \; }# nft list set inet my_table my_concat_settable inet my_table {    set my_concat_set {    type ipv4_addr . inet_proto . inet_service    }}

Теперь мы можем добавить элементы к списку.


# nft add element inet my_table my_concat_set { 10.30.30.30 . tcp . telnet }

Как видите, символьные имена (tcp, telnet) также можно использовать при добавлении элементов набора.


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


# nft add rule inet my_table my_filter_chain ip saddr . meta l4proto . tcp dport @my_concat_set accept# nft list chain inet my_table my_filter_chaintable inet my_table {    chain my_filter_chain {    ...    ip saddr { 10.10.10.123, 10.10.10.231 } accept    meta nfproto ipv4 ip saddr . meta l4proto . tcp dport @my_concat_set accept    }}

Также стоит отметить, что конкатенация может использоваться с inline-наборами. Вот последний пример, отражающий это.


# nft add rule inet my_table my_filter_chain ip saddr . meta l4proto . udp dport { 10.30.30.30 . udp . bootps } accept

Надеюсь, теперь вы понимаете всю силу наборов nftables.


Примечание: конкатенации наборов nftables аналогичны агрегатным типам ipset, например, hash:ip,port.

Verdict Map


Verdict map это интересная функция в nftables, которая позволит вам выполнить действие, основываясь на информации в пакете. Проще говоря, они сопоставляют критерии с действиями.


Например, чтобы логически разделить набор правил, вам нужны отдельные цепочки для обработки TCP и UDP пакетов. Вы можете использовать verdict map, чтобы направлять пакеты в эти цепочки с помощью одного правила.


# nft add chain inet my_table my_tcp_chain# nft add chain inet my_table my_udp_chain# nft add rule inet my_table my_filter_chain meta l4proto vmap { tcp : jump my_tcp_chain, udp : jump my_udp_chain }# nft list chain inet my_table my_filter_chaintable inet my_table {    chain my_filter_chain {    ...    meta nfproto ipv4 ip saddr . meta l4proto . udp dport { 10.30.30.30 . udp . bootps } accept    meta l4proto vmap { tcp : jump my_tcp_chain, udp : jump my_udp_chain }    }}

Конечно, по аналогии с наборами вы можете создавать мутабельные verdict map.


# nft add map inet my_table my_vmap { type inet_proto : verdict \; }

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


Теперь вы можете использовать мутабельную verdict map в правиле.


# nft add rule inet my_table my_filter_chain meta l4proto vmap @my_vmap

Таблицы как пространства имен


Еще одна интересная вещь о таблицах в nftables это то, что они также являются полноценными пространствами имен. То есть две таблицы могут создавать цепочки, наборы и другие объекты с одинаковыми именами.


# nft add table inet table_one# nft add chain inet table_one my_chain# nft add table inet table_two# nft add chain inet table_two my_chain# nft list ruleset...table inet table_one {    chain my_chain {    }}table inet table_two {    chain my_chain {    }}

Это свойство означает, что приложения могут организовывать правила в своих собственных цепочках, не затрагивая другие приложения. В iptables приложениям было тяжело вносить изменения в брандмауэр, не влияя на другие приложения.


Однако и тут есть один нюанс. Каждый хук таблицы или цепочки можно рассматривать как независимый и отдельный брандмауэр. То есть пакет должен пройти через все, чтобы в итоге быть принятым. Если table_one принимает пакет, его все еще может отклонить table_two. Именно здесь в игру вступает приоритезация хуков. Цепочка с более низким приоритетом гарантированно будет выполнена перед цепочкой с более высоким приоритетом. Если приоритеты равны, то поведение не определено.


Сохранение и восстановление набора правил


Правила nftables можно с легкостью сохранить и восстановить. Вывод list в nft можно использовать в инструменте, чтобы провести восстановление. Именно так работает служба nftables systemd.


Сохранить набор правил


# nft list ruleset > /root/nftables.conf

Восстановить набор правил


# nft -f /root/nftables.conf

Конечно же, вы можете включить службу systemd и восстановить правила при перезагрузке. Служба читает правила из /etc/sysconfig/nftables.conf.


# systemctl enable nftables# nft list ruleset > /etc/sysconfig/nftables.conf

Примечание: некоторые дистрибутивы, включая RHEL-8, отправляют предопределенную конфигурацию nftables в /etc/nftables. Эти сэмплы часто включают в себя конфигурацию таблиц и цепочек в стиле iptables. Они часто указаны в файле /etc/sysconfig/nftables.conf, но могут быть закомментированы.

Заключение


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




Узнать подробнее о курсе Администратор Linux



Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru