Короткий ответ

Без логов firewall вы лечите вслепую. Включите log на критичных правилах: drop new с WAN 203.0.113.10, drop DMZ→LAN, accept публикаций (443, VPN UDP), reject админки с WAN. Не логируйте established всего офиса. Ставьте limit/limit rate. Пишите на syslog-узел в 10.0.99.0/24. Не debug навсегда, не отключайте фильтр, чтобы «tcpdump вместо логов».

Хранение — следующая статья: логи не хранятся. Здесь — чтобы событие появилось.

Симптомы и как отличить

Инцидент: «с улицы кто-то стучал» — на FW пусто. nft list без log на drop. RouterOS filter без action=log / log=yes. tcpdump в момент работает, ретроспективы нет.

Нужно в логеНе нужно
WAN new drop 22/8291/3389каждый ACK LAN
DMZ→LAN denyDNS установленные
accept new VPN/443 (sample или каждый new)FastTrack весь NAT
invalid drop samplepayload HTTP

Отличие от IDS: firewall log — вердикт filter. IDS — сигнатура. Нужны оба, без дублирования без лимита.

Возможные причины

  1. Боялись CPU/диска — выключили всё.
  2. Логировали all, диск кончился, выключили снова.
  3. log на правиле, но syslog не слушает, /log memory 100.
  4. FastTrack: пакет не доходит до log-правила.
  5. journald volatile.
  6. Prefix есть, grep не тот.

Диагностика

sudo nft list ruleset -a | grep -n log
journalctl -k -n 50 --no-pager | grep -iE 'nft|fw-|DROP'
/ip firewall filter print where log=yes
/system logging print
/log print where topics~"firewall"

Если log=yes нет нигде — журналирования нет. Если есть, а /log пуст: topics, prefix, memory-limit, remote syslog.

Концепция pf: log на block WAN. pflog интерфейс. Не выключайте pf.

Проверьте, что время NTP верное, иначе корреляция с приложением мертва.

Решение

Минимальный набор prefix:

  • WAN-DROP — new с WAN, не совпавший с allow
  • WAN-OK-443 / WAN-OK-WG — new accept публикаций
  • DMZ-LAN-DENY
  • ADMIN-WAN-DROP — 22/8291 с WAN

Сценарий A. nftables Ubuntu

sudo cp /etc/nftables.conf /root/nftables.conf.bak.log

На drop WAN (цепь input или forward в зависимости от DNAT):

# идея в inet filter:
# iifname "ens18" ct state new limit rate 20/second burst 40 packets \
#   log prefix "WAN-DROP " flags skuid,ether counter drop

limit обязателен. flags — по необходимости, не payload.

На accept публикации:

# iifname "ens18" udp dport 51820 ct state new log prefix "WAN-OK-WG " counter accept
sudo nft -c -f /etc/nftables.conf
sudo systemctl reload nftables
sudo dmesg -T | tail

kernel ring короткая: сразу rsyslog/journal remote.

Сценарий B. RouterOS 7

Не action=log вместо drop (тогда пакет пойдёт дальше). Либо log=yes на drop, либо отдельное log-правило с тем же match выше drop — аккуратно, чтобы не принять.

/ip firewall filter add chain=input in-interface-list=WAN connection-state=new \
  action=drop log=yes log-prefix="WAN-DROP"
/ip firewall filter add chain=input in-interface-list=WAN protocol=udp dst-port=51820 \
  action=accept log=yes log-prefix="WAN-OK-WG"
/system logging action add name=remote target=remote remote=10.0.99.20 remote-port=514
/system logging add topics=firewall,!info action=remote

Подберите topics так, чтобы не улетело всё info. Сверьте документацию вашей 7.x: не включайте debug глобально.

FastTrack: для логируемых new WAN не fasttrack'айте их до log, либо log на правиле accept до FastTrack.

Сценарий C. Только counters, log по запросу

Для отладки сервиса — временный log 5-tuple как в статье про блок сервиса. Для WAN drop — постоянно с лимитом.

Сценарий D. pfSense/OPNsense концепт

На block WAN включить log. На pass WAN 443 — log new если политика IR требует. Не «log all packets». Смотрите System logs / firewall, не выдумывая CLI.

Связь с NAT: логируйте original src, см. NAT скрывает источник.

Минимальный набор prefix, который SOC реально грепает

Договоритесь о словаре: WAN-DROP, WAN-OK-WG, WAN-OK-443, DMZ-LAN-DENY, ADMIN-WAN-DROP, EGRESS-DENY. Один prefix — один смысл. Не log prefix "test " на проде. В rsyslog/journald фильтр по строке, на log01 файл по prefix.

Проверка канала: с LTE свой SYN на закрытый 8291 203.0.113.10, через минуту grep WAN-DROP на 10.0.99.20. Если dmesg есть, а remote нет — чините forward syslog, не добавляйте второй log на то же правило. Limit на log: если при своём скане prefix исчез из-за rate, поднимите чуть, не снимайте limit.

На RouterOS не заменяйте action=drop log=yes на action=log: пакет уйдёт дальше в accept leftover. FastTrack: new WAN, который хотите видеть в /log, не должен исчезать в fasttrack до log-правила. Снимок print stats + несколько строк log — достаточный пакет для тикета «фильтр молчал».

Как проверить, что проблема устранена

С LTE свой SYN на закрытый порт своего 203.0.113.10 (например 8291, если закрыт):

nc -zv -w 2 203.0.113.10 8291 || true

На FW появляется WAN-DROP с вашим LTE-адресом. С mgmt успешный WG — WAN-OK-WG. Диск не растёт мегабайтами в секунду. journalctl/log print показывают prefix.

Не сканируйте чужие хосты для генерации логов.

Если не помогло

  • Логи в kern, rsyslog не забирает kern.*.
  • Container/journalt rate-limit drop.
  • Не тот интерфейс WAN.
  • Правило log ниже FastTrack/queue.
  • Удалённый syslog недоступен из 10.0.99.0/24 — сначала локально.

Профилактика

  • Чеклист нового правила: counter есть; log есть если WAN или deny межзона.
  • Алерт: 0 firewall logs за час при ненулевом WAN traffic — сломан syslog.
  • Ревизия: лишние log без limit удалить.
  • NTP.
  • Документ prefix в runbook SOC.

FAQ

Логировать accept all LAN→WAN?

Нет. Volume убьёт смысл. Sample или только серверный egress.

log vs nflog vs ulogd

nft log в kernel syslog проще. ulogd — если уже стандарт. Не ставьте оба на тот же match без нужды.

Можно ли логировать в файл на самом FW?

Кратко да, постоянно лучше remote. Иначе компрометация FW = потеря улик.

RouterOS memory 1000 строк

Это не хранение. Remote syslog обязателен.

Не раздует ли это IDS?

Разные каналы. Можно коррелировать по времени, не копировать каждый firewall log в Suricata.