Suricata IPS NFQueue with nDPI. Часть IV

Страницы:  1

Ответить
 

Professor Seleznov


Часть I содержит: общие сведения о suricata; требования к железу; описание режимов работы; описание, характеристики и возможности nDPI; описание движков.
Часть II содержит: установка suricata из исходных кодов.
Часть III содержит: подготовка к запуску и запуск suricata.
В этой части будет рассмотрено:
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


enabled = y
host = 192.168.124.13 # внутренний ip адрес роутера
port = 1025 # порт сервиса
Выбираем какие графики отображать

process = y
serv = n
port = n
user = n
Измените имена сетевых интерфейсов на свои:
# NET graph

max = 10
list = wan, lan

wan = Internet WAN, 0, 10000000
lan = LocalNet LAN, 0, 10000000
<\desc>
gateway = wan
<\net>
# TC graph

list = wan, lan

wan = cbq 1, sfq 10, sfq 20, sfq 30, ingress ffff
lan = cbq 1, sfq 10, sfq 20, sfq 30, ingress ffff
Здесь оставьте только те процессы, которые необходимо мониторить, например:
# PROCESS graph


0 = suricata, evebox
<\list>

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 ловит передачу телеметрии. Сделайте так, чтобы оно блокировало передачу телеметрии.-Источник
 
Loading...
Error