Вопрос или проблема
Сегодня nftables рекомендует использовать наборы вместо счетчиков, например, при создании динамических черных списков по IP (пример адаптирован из ман страниц версии 0.98:
set blackhole {
type ipv4_addr
flags dynamic
timeout 30m
}
set flood {
type ipv4_addr
flags dynamic
timeout 1m
}
ip saddr @blacklist drop
ct state new \
add @flood { ip saddr limit rate over 10/minute } \
add @blacklist { ip saddr } \
drop
-
Как здесь происходит выполнение операторов
add
? Второй операторadd
выполняется только когда достигается лимит на IP, указанный в первом оператореadd
, но почему? Это связано с тем, выполняет ли первый операторadd
что-то (т.е. в таблице еще нет записи)? Или это делает что-то волшебное, глядя на набор и количество созданных подключений на данный момент? -
Всегда ли выполняется
drop
? Или только после оценки второгоadd
? Почему? -
Как таблица поиска помогает отслеживать лимит? Когда я смотрю на фактическое содержание набора, я не вижу никаких подсчетов, например, новых подключений за последнюю минуту. Она просто сохраняет временную метку и делегирует фактический подсчет ядру?
-
Почему нам нужно дважды указывать интервал лимита потока (как
timeout
набора и в оператореlimit
)? Существуют ли случаи использования, когда имеет смысл использовать два разных значения? -
В документации Red Hat 7 приводится такой пример ограничителя соединений на IP:
nft add rule ip filter input ip protocol tcp ct state new, untracked limit rate over 10/minute add @denylist { ip saddr }
Мне кажется, это неверно, так как скорость указана перед add
, что означает, что она просто добавит IP в таблицу, как только достигнет 10 новых соединений в минуту с любого IP?
Буду признателен за ссылки на документацию о фактической семантике языка.
Представлю свое понимание, основанное на быстром эксперименте (документация заслуживает улучшения).
Ваше последнее правило состоит из 4 операторов, точно так, как вы разделили их на 4 строки:
ct state new \
add @flood { ip saddr limit rate over 10/minute } \
add @blacklist { ip saddr } \
drop
Операторы выполняются последовательно до тех пор, пока любой из операторов не выдаст вердикт. Первые три оператора могут выдать только вердикт continue
(они это делают, когда они решают, что пакет не соответствует их критериям). Только когда все три оператора соответствуют, выполняется оператор drop
; во всех других случаях вердикт continue
.
Чтобы понять второй оператор, нам нужно осознать, что существует две синтаксические конструкции, обе использующие выражение limit rate ...
:
- Самостоятельный оператор (
ct state new limit rate over 10/minute counter
): Это должно быть просто и хорошо документировано. - Атрибут набора: (
add @flood { ip saddr limit rate over 10/minute }
: Это адаптировано из ныне устаревшего оператораmeter
. Это расширение оператораadd
, которое делает так, чтобы операторadd
выдавал вердиктcontinue
всякий раз, когда не достигается лимит на элемент. Вы можете опустить ключевое словоover
, чтобы операторadd
выдавал вердиктcontinue
в противоположных случаях (т.е. при достижении лимита). Я не знаю технических подробностей о том, как осуществляется подсчет.
Помните, что один набор может использоваться в нескольких операторах (даже правилах). Например, если вы укажете время ожидания набора больше, чем период ссылки на скорость, элементы останутся в наборе до тех пор, пока не истечет время ожидания, и вы сможете позже проверить их наличие в другом операторе/правиле.
Я бы согласился с вашей интерпретацией примера RedHat: я предполагаю, что пример не достигает того, что указано в описании, т.е.
Блокировка IP-адресов, которые пытаются установить более десяти новых входящих TCP-соединений в течение одной минуты
Ответ или решение
nftables — это современный фреймворк для управления сетевыми пакетами в Linux, предлагающий гибкость и производительность. Он заменяет iptables, предоставляя более мощные возможности за счёт использования выражений и объектов, таких как наборы (sets) и карты (maps). В данном случае мы фокусируемся на использовании наборов в качестве замены устаревшему функционалу meter’ов для создания, например, динамических черных списков по IP-адресам.
Теория
В nftables предыдущие реализации использовали meters для ограничения частоты определённых событий. Однако, в последующих версиях рекомендуется использовать наборы (sets) с динамическими свойствами и функциональностью отсчета времени (timeout). Это связано с более оптимизированной и гибкой обработкой правил безопасности.
Прежде всего, понимание структуры и синтаксиса nftables является фундаментальным. Каждое правило (rule) в nftables состоит из серии выражений, которые применяются к сетевым пакетам. Если пакет соответствует всем условиям из правил, выполняется определённое действие. Изучение операций add в контексте данных правил помогает понять, как именно работают процессы добавления IP-адресов в наборы.
Пример
Рассмотрим пример:
set blackhole {
type ipv4_addr
flags dynamic
timeout 30m
}
set flood {
type ipv4_addr
flags dynamic
timeout 1m
}
ip saddr @blacklist drop
ct state new \
add @flood { ip saddr limit rate over 10/minute } \
add @blacklist { ip saddr } \
drop
Давайте разберём этот пример подробнее.
Объяснение работы add
В данной конструкции имеются два add-выражения. Первое add @flood { ip saddr limit rate over 10/minute }
ограничивает частоту по IP, позволяя добавлять IP в набор flood только если они превышают лимит в 10 новых соединений в минуту. Второе add add @blacklist { ip saddr }
выполняется сразу после первого, когда условие первого выполнено, добавляя IP уже в blacklist.
Весь процесс работает так: если IP-адрес превышает установленный лимит в set flood, он добавляется в set flood, и тут же выполняется следующее правило – добавление IP в blacklist, с последующей блокировкой (drop
).
Выполнение drop
Условие drop не обязательно выполняется всегда. Оно исполняется только после того, как оба условных добавления меток выполнены. Таким образом, drop происходит исключительно в результате выполнения обоих правил выше.
Применение
Главная сила использования set вместо meters кроется в гибкости и мощности, которые они предлагают, особенно в плане доступа к дополнительным условиям и зависящим переменным. Это позволяет значительно упрощать задачи администрирования и защиты сетей от несанкционированной активности.
Лимиты и временные интервалы
Чтобы детально понять, как временные интервалы и лимиты работают вместе, важно рассмотреть сами тайм-ауты. Тайм-аут 1m для flood и использование limit rate over 10/minute в правиле могут показаться дублирующими друг друга, но предлагают гибкость управления. Временной интервал serve кэш-память, а limit контролирует скорость напрямую. Например, вы можете использовать разные значения, чтобы дать системе больше времени реагировать, или ускорить очистку кэша.
Уязвимости
В представленном примере из Red Hat 7 неточность заключается именно в последовательности выполнения. Там использование limit rate
перед add
, означает добавление в denylist при превышении лимита всеми IP, а не конкретным, как оно заявлено в описании документации.
КонCLUSION
Используя nftables с наборами, администраторы получают улучшенный контроль и точность управления сетевого трафика. Эти реализованные механизмы помогают сформировать более безопасные и адаптивные политики контроля, что возможно благодаря новым возможностям, предоставляемым современными инструментами управления пакетами. Однако, как было показано с примером Red Hat, всегда важно тщательно проверять и тестировать реализуемые политики для избегания ошибок в конфигурациях.