Часть I содержит: общие сведения о suricata; требования к железу; описание режимов работы; описание, характеристики и возможности nDPI; описание движков.

Часть II содержит: установка suricata из исходных кодов.

Часть III содержит: подготовка к запуску и запуск suricata.

Часть V содержит: подготовка к использованию.

Часть VI содержит: обзор бесплатных источников правил; использование правил; пример конфиг-файла suricata.yaml.

В этой части будет рассмотрено:

8. Примеры просмотра данных eve.json в консоли.

9. Просмотр лога, алертов и дропов через web-интерфес.

10. Простой пример использования suricata - блокировка торрентов.

11. Контроль работоспособности и используемых ресурсов.

8. Примеры просмотра данных eve.json в консоли.

Установим jq необходимую для анализа json файлов:

 sudo apt install jq

Добавьте пользователя под которым вы будете выполнять команды в группу suricata для обеспечения доступа к лог-файлам:

sudo usermod -a -G suricata user_name

Посмотреть все значения поля event_type, отсортированные по количеству появления в логе:

cat /var/log/suricata/eve.json | jq -r '.event_type' | sort | uniq -c | sort -nr

В зависимости от ваших настроек в suricata.yaml, вы можете в значении ‘.event_type’ увидеть:

alert - оповещение о срабатывании правила.

drop - оповещение о блокировке трафика.

tls - событие на уровне прикладного протокола TLS.

quic - событие на уровне прикладного протокола QUIC.

http - событие на уровне прикладного протокола HTTP.

dns - событие на уровне прикладного протокола DNS.

flow - общая статистика по каждому сетевому соединению

fileinfo - данные о переданных файлах

stats - техническая статистика производительности suricata

anomaly - зафиксированные нарушения структуры пакетов

Посмотреть данные только по конкретному типу:

cat /var/log/suricata/eve.json | jq 'select(.event_type=="alert")' | more

Или в другом формате:

grep '"event_type":"alert"' /var/log/suricata/eve.json | more

Топ 10 самых частых alert-сигнатур. Выведет количество срабатываний, номер правила и текст сообщения:

jq -r 'select(.event_type=="alert") | [.alert.signature_id, .alert.signature] | 
  @tsv' /var/log/suricata/eve.json | sort | uniq -c | sort -rn | head -n 10

Посмотреть кто и когда из клиентов попал под правило с sid:2068224:

jq -r 'select(.alert.signature_id==2068224) | [.timestamp, .src_ip, .dest_ip, .proto] | 
  @tsv' /var/log/suricata/eve.json

Посмотреть все блокировки:

grep '"event_type":"drop"' /var/log/suricata/eve.json | 
  jq -c '{timestamp, src_ip, dest_ip, reason: .drop.reason}'

'stream error' - блокировки потоков в которых suricata обнаруживает какие-либо ошибки или несоответствия при их анализе. Это не блокировки правилами.

Посмотреть строку лога с приведенной блокировкой для подробного анализа (вставьте свой timestamp):

grep '"timestamp":"2026-04-08T22:15:17.281920+0300"' /var/log/suricata/eve.json

Для подробного анализа используйте «Dadroit JSON Viewer».

Вывести tls-данные для посещенных сайтов:

jq -r 'select(.event_type=="tls") | .tls.subject' /var/log/suricata/eve.json | sort | 
  uniq -c | sort -rn

Топ-10 самых активных nDPI протоколов:

jq -r 'select(.ndpi.proto != null) | .ndpi.proto' /var/log/suricata/eve.json | sort | 
  uniq -c | sort -nr | head -n 10

Живой мониторинг через eve.json покажет, кто и какой nDPI протокол использует прямо сейчас:

tail -f /var/log/suricata/eve.json | jq -r 'select(.ndpi.proto != null) | "[\(.timestamp[11:19])] \(.src_ip) -> \(.dest_ip) | Протокол: \(.ndpi.proto) | Категория: \(.ndpi.category)"'

9. Просмотр лога, алертов и дропов через web-интерфес.

Для комфортного просмотра лог-файла eve.json установим легкую программу evebox - инструмент для управления оповещениями и событиями suricata. Сайт разработчиков: https://evebox.org/

В стандартных репозиториях дистрибутива Debian/Ubuntu пакета evebox нет. Его нужно установить из репозитория разработчиков по приведенной ими инструкции:

sudo su -
curl -fsSL https://evebox.org/files/evebox.asc -o /etc/apt/keyrings/evebox.asc 
echo "deb [signed-by=/etc/apt/keyrings/evebox.asc] https://evebox.org/files/debian stable main" | sudo tee /etc/apt/sources.list.d/evebox.list 
apt update 
apt install evebox
exit  

По умолчанию evebox настроен на использование базы данных elasticsearch. Будем использовать легкую бесплатную базу данных sqlite. Редактируем конфигурационный файл evebox /etc/evebox/evebox.yaml и изменяем его основные параметры.

Настройки в evebox.yaml
http: 
  host: "192.168.124.13"  # внутренний ip роутера 
  port: 1026 
database: 
  type: sqlite 
  retention: 
    days: 3 
input: 
  enabled: true 
  paths: - "/var/log/suricata/eve.json"

Параметр 'retention:' определяет сколько дней необходимо хранить данные (days:) и максимальный размер базы данных (size:). Можно одновременно указывать оба параметра. Не рекомендуется указывать большой срок хранения и большой размер базы данных, т.к. в ней будут продублированы данные лог-файла eve.json.

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

В suricata есть возможность настроить вывод алертов и дропов в отдельный json-файл, если вы хотите чтобы в evebox были только алерты и дропы.

Evebox работает от имени пользователя evebox. Чтобы evebox имел разрешение на чтение файла статистики suricata необходимо добавить пользователя evebox в группу suricata:

 sudo usermod -a -G suricata evebox

Редактируем файл сервиса evebox/usr/lib/systemd/system/evebox.service

Пример evebox.service
[Unit]
Description=EveBox Server
After=network.target network-online.target
Requires=network-online.target

[Service]
User=evebox
Group=evebox
ExecStart=/usr/bin/evebox server $CONFIG
Environment="CONFIG=-c /etc/evebox/evebox.yaml"
Environment=EVEBOX_DATA_DIRECTORY=/var/lib/evebox

[Install]
WantedBy=multi-user.target

Перечитаем конфиги системных служб:

 sudo systemctl daemon-reload

Включаем автозагрузку сервиса и запускаем его:

 sudo systemctl enable evebox && sudo systemctl start evebox

Обращаемся к данным eve.json через браузер: http://192.168.124.13:1026 В настройках рекомендую включить темную тему.

Events - текущие записи eve.json

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

Escalated - помещаются события выбранные для расследования.

Alerts - помещаются проверенные события, к которым применено действие archive.

Dashboards - статистика по трафику

Stats - статистика suricata. Отключена. Занимает безумно много места. Для анализа работы suricata ее можно получить с помощью 'suricatasc'.

10. Простой пример использования suricata - блокировка торрентов.

Теперь, когда есть evebox для комфортного анализа оповещений, можно приступить к тестированию блокировки торрентов. Должны быть созданы списки правил как описано в "Часть III" в пункте "7.9 Создание списка правил".

Запустите торрент-клиент на каком-нибудь компьютере локальной сети и посмотрите результат в evebox. У меня torrent трафик блокируется правилами с sid:1000000, sid:1000001 и sid:2008581.

Посмотреть блокировки в консоли:

Посмотреть сколько раз срабатывали правила блокировки:

cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="drop" and .drop.reason=="rules")
  | "\(.alert.signature_id) \(.alert.signature)"' | sort | uniq -c | sort -nr

У меня получился такой вывод:

1425 1000001  nDPI: Block BitTorrent Protocol 
  50 1000000  Block BitTorrent DHT 
  12 2008581  ET P2P BitTorrent DHT ping request

Если вы не меняли порядок правил в /etc/suricata/rules/local.rules и порядок просмотра файлов с правилами в конфиг-файле suricata /etc/suricata/suricata.yaml, то данные сверяются с правилами в следующем порядке: 1 - 1000000, 2 - 1000001, 3 - 2008581.

Правила'drop' проверяются до первого совпадения. Если данные совпали с шаблоном указанным в каком-либо правиле, то проверка прекращается. Приведенные цифры статистики сработавших правил означают, что хоть правило 1000000 (содержит шаблон протокола bittorrent-dht парсера suricata) и указано первым, оно заблокировало всего 3% пакетов. А правило 1000001, содержащее шаблон протокола bittorrent-dht библиотеки nDPI заблокировало 96% пакетов. Вот в этом и заключается преимущество использования библиотеки nDPI и, значит, все мучения при установке и настройке вручную были не зря.

Посмотрите уведомления о блокировках в evebox. Вы увидите, что правило, блокирующее торренты с использованием возможностей nDPI понимает:

  • bittorrent-dht протокол;

  • использование торрент-клиентами протокола http;

  • трафик торрент-клиентов в протоколах tcp и udp при передаче данных с/на произвольные адреса и порты!

Нужно всего то 2-3 правила suricata, чтобы заблокировать торрент трафик, что является практически невыполнимой задачей при использовании только классического firewall.

Посмотреть кто из клиентов попал под правило с sid:1000000 с выводом количества блокировок:

jq -r 'select(.alert.signature_id==1000000) | [.src_ip, .dest_ip, .proto] | @tsv' \
/var/log/suricata/eve.json | sort | uniq -c | sort -rn

11. Контроль работоспособности и используемых ресурсов.

Я использую легкую программу monitorix для анализа загрузки процессора и использования оперативной памяти. Она показывает все необходимые данные на графиках и использует минимальные ресурсы.

Установка:

sudo apt install monitorix

Отредактируйте конфиг-файл /etc/monitorix/monitorix.conf.

Настройки в monitorix.conf
<httpd_builtin>
    enabled = y
    host = 192.168.124.13  # внутренний ip адрес роутера 
    port = 1025            # порт сервиса

Выбираем какие графики отображать
<graph_enable>
    process         = y
    serv            = n
    port            = n
    user            = n

Измените имена сетевых интерфейсов на свои:
# NET graph
<net>
    max = 10
    list = wan, lan                  
    <desc>
        wan = Internet WAN, 0, 10000000
        lan = LocalNet LAN, 0, 10000000
    <\desc>
    gateway = wan
<\net>

# TC graph
<tc>
    list = wan, lan
    <desc> 
        wan = cbq 1, sfq 10, sfq 20, sfq 30, ingress ffff 
        lan = cbq 1, sfq 10, sfq 20, sfq 30, ingress ffff

Здесь оставьте только те процессы, которые необходимо мониторить, например:
# PROCESS graph
<process>
    <list>
        0 = suricata, evebox
    <\list>
    <desc>
         suricata = suricata 
         evebox = evebox
    <\desc>

Перегружаем сервис:

 sudo systemctl restart  monitorix

Ждем некоторое время для наполнения данными и смотрим статистику: http://192.168.124.13:1025/monitorix/ Основные показатели - сколько suricata использует памяти и насколько нагружает процессор.

Посмотреть в консоли:

 ps aux | grep -E "USER|suricata"

Посмотреть пиковое значение используемой памяти:

sudo journalctl -u suricata | grep "memory peak"

Значения может не быть в журнале, если suricata работает недолго. В выводе может быть указано значение "memory swap peak". Оно показывает сколько оперативной памяти не хватает программе для нормальной работы.

Количество переходов в режим Emergency - самый главный показатель здоровья suricata:

suricatasc -c dump-counters | jq -r '"Входов в режим Emergency: \(.message.flow.emerg_mode_entered)"'

Emergency mode (аварийный режим) в suricata — это механизм самосохранения, который включается автоматически, когда движок перестает справляться с потоком трафика и его внутренние очереди переполняются. Т.е. если пакетов приходит больше, чем suricata успевает обработать, она переходит в «аварийный режим», чтобы не упасть и не забить всю память системы.

Когда лимит свободных слотов в очередях (flow или packet) достигает критически низкого порога, suricata выполняет:

  • Агрессивную очистку памяти: suricata начинает моментально закрывать старые или неактивные соединения (flows), чтобы освободить место для новых пакетов.

  • Сокращение таймаутов: время ожидания завершения TCP/UDP сессий резко уменьшается (в десятки раз). Например, если обычный таймаут для TCP — 300 секунд, в режиме Emergency он может упасть до 2 секунд.

  • Смену приоритетов: движок перестает глубоко анализировать «зависшие» соединения, отдавая все ресурсы на обработку свежего трафика.

Если были переходы в аварийный режим, то количество этих переходов покажет насколько ваш конфиг-файл не соответствует нагрузке сети. Еще один способ посмотреть насколько плохи дела и понять какая часть данных не была обработана можно получив информацию из файла /proc/net/netfilter/nfnetlink_queue.

Низкоуровневый контроль за очередями:

В файле /proc/net/netfilter/nfnetlink_queue содержится информация об очередях netfilter в пользовательском пространстве (если это используется). Каждая строка описывает очередь. Очереди, на которые не было подписок из пространства пользователя, не показываются.

# sudo cat /proc/net/netfilter/nfnetlink_queue

		 0  11909          0 2 65531     0     0    36054  1
		 1  2648202259     0 2 65531     0     0     7406  1
колонки: 1    2            3 4   5       6     7       8   9

Колонки каждой строки:

  1. Идентификатор очереди. Совпадает с указанным в параметрах --queue-num или --queue-balance для цели NFQUEUE.

  2. Номер процесса подписанного на очередь (для первого идентификатора очереди).

  3. Количество пакетов, находящихся сейчас в очереди и ожидающих обработки приложением.

  4. Режим копирования очереди. 1 - только метаданные; 2 - также копировать в пространство пользователя данные полезной нагрузки.

  5. Диапазон копирования. Т.е. не более скольких байт полезной нагрузки пакета должно быть скопировано в пространство пользователя.

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

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

  8. Последовательный номер. Поле отображает ID самого нового пакета в очереди. Т.е. показывает количество обработанных пакетов.

  9. Номер существует только для совместимости и всегда равен 1.

Если значения колонок 6 или 7 больше нуля, то необходимо увеличить параметр конфиг-файла 'max-pending-packets' и/или увеличить количество потоков анализа данных 'workers', если ресурсы процессора позволяют.

Для серьезного анализа возникших проблем включите вывод статистики. Можно включить вывод в отдельный файл stats.log и в eve.json. Уменьшите интервал вывода, если необходимо (не рекомендуется устанавливать его менее 5 секунд). Так же статистику работы suricata можно получить выполнив:

 sudo suricatasc -c dump-counters

Использование скриптов.

За основу для получения информации о suricata можете взять представленные скрипты:

suricata_check - Выводит расширенную информацию. В секции "Использование памяти и ошибки" выводит для указанных режимов обработки данных: заданный буфер памяти; сколько памяти используется; сколько было отброшено пакетов (dp) и потоков (df) при исчерпании выделенного буфера памяти. Для nfnetlink_queue выводит колонки 1,6,7,8. В конце выводит все потоки suricata для анализа их распределения по ядрам процессора - колонка 'PSR'.

suricata_check_memuse - Выводит информацию об используемой памяти и ошибки.

suricata_check_memuse_tolog - Выводит только данные об используемой памяти и ошибки. Используйте для ведения лога при поиске проблем. Для быстрого получения информации о проблемах используйте: # grep -m 1 -B 8 "e: 1" suricata_check_memuse.log

suricata_check
#!/usr/bin/sh
#20260416
# Для v.8.0.4
/usr/bin/suricatasc -c dump-counters > /tmp/dump-counters
/usr/bin/suricatasc -c memcap-list > /tmp/memcap-list

/usr/bin/jq -rs '"Время работы: \(.[0].message.uptime / 3600 | floor) ч \(.[0].message.uptime % 3600 / 60 | floor) мин",
"Запущена: \(.[0].message.detect.engines[0].last_reload)",
"Загружено правил: \(.[0].message.detect.engines[0].rules_loaded)",
"Сработавших правил: \(.[0].message.detect.alert)",
"Использование памяти и ошибки:",
(.[1].message[0].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.tcp.ssn_memcap.drop_packet) as $dp | (.[0].message.exception_policy.tcp.ssn_memcap.drop_flow) as $df |
"   stream:     memcap:  \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp) df: \($dp)",
(.[1].message[1].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.reassembly_memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.tcp.reassembly.drop_packet) as $dp | (.[0].message.exception_policy.tcp.reassembly.drop_flow) as $df |
"   reassembly: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp) df: \($dp)",
(.[1].message[2].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.flow.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.flow.memcap.drop_packet) as $dp |
"   flow:       memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp)",
(.[1].message[5].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.defrag.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.defrag.memcap.drop_packet) as $dp |
"   defrag:     memcap:  \($cap)MB, memuse: \($use)MB     -  \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp)",
(.[1].message[4].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.http.byterange.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
"   HTTP-Range: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%",
(.[1].message[6].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.ippair.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
"   ippair:     memcap:  \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%",
(.[1].message[7].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.host.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
"   host:       memcap:  \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%",
"Accepted ядром: \(.[0].message.ips.accepted)",
"Rejected ядром: \(.[0].message.ips.rejected)",
"Replaced ядром: \(.[0].message.ips.replaced)",
"Blocked ядром: \(.[0].message.ips.blocked)",
(select(.[0].message.ips.drop_reason.decode_error > 0) |
"   Ошибок при попытке декодирования пакетов: \(.[0].message.ips.drop_reason.decode_error)"),
(select(.[0].message.ips.drop_reason.defrag_error > 0) |
"   Ошибок при попытке собрать фрагментированный пакет: \(.[0].message.ips.drop_reason.defrag_error)"),
(select(.[0].message.ips.drop_reason.defrag_memcap > 0) |
"   Отброшеных из-за исчерпания памяти, выделенной на дефрагментацию: \(.[0].message.ips.drop_reason.defrag_memcap)"),
(select(.[0].message.ips.drop_reason.flow_memcap > 0) |
 "   Отброшеных из-за переполнения таблица потоков (Flow table: \(.[0].message.ips.drop_reason.flow_memcap)"),
(select(.[0].message.ips.drop_reason.flow_drop > 0) |
"   Отброшеных из-за специфических настроек управления потоками: \(.[0].message.ips.drop_reason.flow_drop)"),
(select(.[0].message.ips.drop_reason.applayer_error > 0) |
"   Ошибок при попытке разбора парсерами: \(.[0].message.ips.drop_reason.applayer_error)"),
(select(.[0].message.ips.drop_reason.applayer_memcap > 0) |
"   Отброшеных из-за превышения лимита памяти для анализа парсеров): \(.[0].message.ips.drop_reason.applayer_memcap)"),
(select(.[0].message.ips.drop_reason.rules > 0) |
"   Заблокированных правилами с действием drop: \(.[0].message.ips.drop_reason.rules)"),
(select(.[0].message.ips.drop_reason.threshold_detection_filter > 0) |
"   Отброшенных из-за сработавшего ограничения частоты (threshold): \(.[0].message.ips.drop_reason.threshold_detection_filter)"),
(select(.[0].message.ips.drop_reason.stream_error > 0) |
"   Отброшенных из-за ошибок TCP-стека (напр. некорректный размер окна): \(.[0].message.ips.drop_reason.stream_error)"),
(select(.[0].message.ips.drop_reason.stream_memcap > 0) |
"   Отброшенных из-за исчерпания памяти, выделенной для анализа потоков: \(.[0].message.ips.drop_reason.stream_memcap)"),
(select(.[0].message.ips.drop_reason.stream_midstream > 0) |
"   Пакетов пришедших «посреди» сессии, которую Suricata не видела с самого начала: \(.[0].message.ips.drop_reason.stream_midstream)"),
(select(.[0].message.ips.drop_reason.stream_reassembly > 0) |
"   Ошибок при попытке собрать данные из разных TCP-сегментов в один поток: \(.[0].message.ips.drop_reason.stream_reassembly)"),
(select(.[0].message.ips.drop_reason.stream_urgent > 0) |
"   Блокировок пакетов с установленным флагом TCP Urgent: \(.[0].message.ips.drop_reason.stream_urgent)"),
(select(.[0].message.ips.drop_reason.nfq_error > 0) | "   Ошибок взаимодействия с очередью NFQUEUE: \(.[0].message.ips.drop_reason.nfq_error)"),
(select(.[0].message.ips.drop_reason.tunnel_packet_drop > 0) |
"   Проблем с инкапсулированным трафиком (VXLAN, GRE, IPsec и т.д.): \(.[0].message.ips.drop_reason.tunnel_packet_drop)"),
(select(.[0].message.ips.drop_reason.default_packet_policy > 0) |
"   Пакет был отброшен из-за default_packet_policy: \(.[0].message.ips.drop_reason.default_packet_policy)"),
(select(.[0].message.ips.drop_reason.default_app_policy > 0) |
"   Пакет был отброшен из-за default_app_policy: \(.[0].message.ips.drop_reason.default_app_policy)"),
(select(.[0].message.ips.drop_reason.pre_stream_hook > 0) |
"   Пакет был отброшен движком реорганизации потоков (Stream Engine): \(.[0].message.ips.drop_reason.pre_stream_hook)"),
(select(.[0].message.ips.drop_reason.pre_flow_hook > 0) |
"   Пакет отброшен при создании или обновлении записи о потоке: \(.[0].message.ips.drop_reason.pre_flow_hook)"),
"Декодировано пакетов: \(.[0].message.decoder.pkts)",
"   tcp: \(.[0].message.decoder.tcp)",
"   udp: \(.[0].message.decoder.udp)",
"Ошибок декодирования: \(.[0].message.decoder.invalid)",
"Разрывов в TCP-потоках: \(.[0].message.tcp.reassembly_gap)",
"Потоков в памяти: \(.[0].message.flow.active)",
"Входов в режим Emergency: \(.[0].message.flow.emerg_mode_entered)"'  /tmp/dump-counters /tmp/memcap-list
/usr/bin/echo "Размер буфера сокета netlink (ядра):" `/usr/bin/grep "setting nfnl bufsize" /var/log/suricata/suricata.log | /usr/bin/tail -n 1 | /usr/bin/awk '{ print $12/1024 }'` "КБ"
/usr/bin/echo "Размер буфера сокета suricata (приложения):" `/usr/bin/grep "setting queue length" /var/log/suricata/suricata.log | /usr/bin/tail -n 1 | /usr/bin/awk '{ print $12/1024 }'` "КБ"
/usr/bin/echo
/usr/bin/echo "Содержание nfnetlink_queue:"
/usr/bin/cat /proc/net/netfilter/nfnetlink_queue | awk '{ print $1,"  "  $6,"  "  $7,"  "  $8}'
/usr/bin/echo
/usr/bin/ps -T -p $(pgrep -f /usr/bin/suricata) -o pid,tid,%cpu,%mem,vsz,rss,ni,pri,stat,psr,comm
/usr/bin/echo
suricata_check_memuse
#!/usr/bin/sh
#20260416
/usr/bin/suricatasc -c dump-counters > /tmp/dump-counters
/usr/bin/suricatasc -c memcap-list > /tmp/memcap-list

/usr/bin/jq -rs '"Использование памяти и ошибки:",
(.[1].message[0].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.tcp.ssn_memcap.drop_packet) as $dp | (.[0].message.exception_policy.tcp.ssn_memcap.drop_flow) as $df |
"   stream:     memcap:  \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp) df: \($dp)",
(.[1].message[1].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.reassembly_memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.tcp.reassembly.drop_packet) as $dp | (.[0].message.exception_policy.tcp.reassembly.drop_flow) as $df |
"   reassembly: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp) df: \($dp)",
(.[1].message[2].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.flow.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.flow.memcap.drop_packet) as $dp |
"   flow:       memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp)",
(.[1].message[5].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.defrag.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.defrag.memcap.drop_packet) as $dp |
"   defrag:     memcap:  \($cap)MB, memuse: \($use)MB     -  \(($use / $cap * 10000 | round) / 100)%; mpol dp: \($dp)",
(.[1].message[4].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.http.byterange.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
"   HTTP-Range: memcap: \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%",
(.[1].message[6].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.ippair.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
"   ippair:     memcap:  \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%",
(.[1].message[7].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.host.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
"   host:       memcap:  \($cap)MB, memuse: \($use)MB - \(($use / $cap * 10000 | round) / 100)%",
"Входов в режим Emergency: \(.[0].message.flow.emerg_mode_entered)"'  /tmp/dump-counters /tmp/memcap-list
/usr/bin/echo
suricata_check_memuse_tolog
#!/usr/bin/sh
#20260416
/usr/bin/suricatasc -c dump-counters > /tmp/dump-counters
/usr/bin/suricatasc -c memcap-list > /tmp/memcap-list
/usr/bin/date +"%d.%m.%y %H:%M:%S"
/usr/bin/jq -rs '
(.[1].message[0].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.tcp.ssn_memcap.drop_packet) as $dp | (.[0].message.exception_policy.tcp.ssn_memcap.drop_flow) as $df |
"s: \($cap) \($use) \(($use / $cap * 10000 | round) / 100) \($dp) \($dp)",
(.[1].message[1].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.tcp.reassembly_memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.tcp.reassembly.drop_packet) as $dp | (.[0].message.exception_policy.tcp.reassembly.drop_flow) as $df |
"r: \($cap) \($use) \(($use / $cap * 10000 | round) / 100) \($dp) \($dp)",
(.[1].message[2].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.flow.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.flow.memcap.drop_packet) as $dp |
"f: \($cap) \($use) \(($use / $cap * 10000 | round) / 100) \($dp)",
(.[1].message[5].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.defrag.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
(.[0].message.exception_policy.defrag.memcap.drop_packet) as $dp |
"d: \($cap) \($use) \(($use / $cap * 10000 | round) / 100) \($dp)",
(.[1].message[4].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.http.byterange.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
"h: \($cap) \($use) \(($use / $cap * 10000 | round) / 100)",
(.[1].message[6].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.ippair.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
"i: \($cap) \($use) \(($use / $cap * 10000 | round) / 100)",
(.[1].message[7].value | gsub("[^0-9.]"; "") | tonumber) as $cap | ((.[0].message.host.memuse / 1024 / 1024 * 10000 | round) / 10000) as $use |
"h: \($cap) \($use) \(($use / $cap * 10000 | round) / 100)",
"e: \(.[0].message.flow.emerg_mode_entered)"'  /tmp/dump-counters /tmp/memcap-list
/usr/bin/echo

Если все работает без проблем, то не забудьте удалить флаг 'bypass' из правил nftables/iptables пересылающих трафик suricata.

Правило 2068224 ловит передачу телеметрии. Сделайте так, чтобы оно блокировало передачу телеметрии.