Вопрос или проблема
Я использую nftables v0.9.6 и базу данных geoip для блокировки входящего трафика из определенных стран. Например, у меня есть в цепочке:
meta mark 0x0000033a drop comment "блокировать трафик из Великобритании"
Теперь я хотел бы считать, записывать и блокировать трафик. Я думаю, что мне следует добавить эти инструкции (плюс определение именованного счетчика):
meta mark 0x0000033a counter name "drop_gb" log prefix "drop_gb:" drop comment "блокировать трафик из Великобритании"
Честно говоря, я не пробовал это, но я уверен, что это сработает 🙂 К сожалению, я застрял на следующем шаге: я хотел бы добавить ограничение на действие логирования, чтобы избежать заполнения диска лог-файлами (особенно на небольших встроенных платформах) в случае длительной атаки.
Обычно я добавляю инструкцию limit rate 120/minute burst 300 packets
перед командой log, как в:
meta mark 0x0000033a counter name "drop_gb" limit rate 120/minute burst 300 packets log prefix "drop_gb:" drop comment "блокировать трафик из Великобритании"
но я думаю, что в этом случае я получу (нежелательный) побочный эффект, что также действие drop будет “ограничено”!
Я имею в виду, что согласно вышеуказанному правилу только записанный трафик будет заблокирован, что приведет к странному результату, что трафик свыше порога (сильная атака) не будет заблокирован. Я прав?
Мне бы хотелось сохранить подход «однострочника», чтобы сделать правила более читаемыми (их много и они сгенерированы скриптом): есть ли способ добиться “ограниченного” логирования с “полной” блокировкой пакетов?
Спасибо!
С.
Ответ или решение
Для настройки nftables с целью ведения учета, логирования и блокировки трафика из определенных стран, вы правильно подметили, что вам необходимо использовать комбинацию счетчиков и ограничений на логирование. Рассмотрим, как это реализовать в одном правиле, сохранив при этом логику полной блокировки пакетов вне зависимости от нагрузки на логи.
При добавлении правила, блокирующего трафик, с учётом логирования и ограничения количества событий, вы можете столкнуться с необходимостью избежать ограничения на действие «drop». Как вы правильно заметили, если мы применим ограничение напрямую перед логированием, то трафик будет блокироваться только после выполнения условия ограничения.
Чтобы избежать ненужного ограничения для операции "drop", вы можете реализовать отдельные правила с использованием подсетей и специального фильтра для логирования. Примеры правил заданы ниже, дающие возможность вести учёт и логировать только части трафика, превышающие лимит, без влияния на блокировку:
# Создаем таблицу и цепочку, если они еще не существуют
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0; }
# Добавляем правило для учета и логирования
nft add rule inet filter input meta mark 0x0000033a counter name "drop_gb" log prefix "drop_gb:" limit rate 120/minute burst 300 packets
# Правило для блокировки
nft add rule inet filter input meta mark 0x0000033a drop comment "block traffic from GB"
Данное решение включает два отдельных правила:
-
Первое правило с использованием
limit
, которое ограничивает логирование и при превышении порога будет блокировать записи в логи. Оно будет считывать метку и логировать информацию о пакете, с последующей блокировкой превышающих лимит записей. -
Второе правило, которое будет обрабатывать трафик, уже превышающий лимиты логирования, и всегда блокировать входящие соединения с установленной меткой.
Таким образом, вы получаете эффективный механизм, позволяющий вести учет и ограничивать логирование, при этом не ограничивая блокировку самого трафика. Этот подход также сохраняет читаемость вашей конфигурации, так как все действия сведены к двум логически отдельным правилам.
Обратите внимание, что стандартное логирование может быть подвержено нагрузке, и вам стоит регулярно контролировать системные журналы, чтобы избежать переполнения диска даже при использовании данных правил.