Skip to content

protect/optimize: лог анти-скана 5/сек против journald SystemMaxUse=300M — на публичной ноде журнал живёт меньше суток #35

Closed

Description

@jestivald

Что происходит

Два дефолта тулкита, заданные ОДНИМ И ТЕМ ЖЕ модульным набором, конфликтуют по объёму:

  • protect.sh:675 логирует анти-скан с лимитом 5 записей в секунду:
    ... ct state new limit rate 5/second log prefix "[na portscan] " level info
  • optimize.sh («journald (ограничение логов)») ставит SystemMaxUse=300M.

5/с — это до 432 000 строк в сутки (~50 МБ). На ноде, которую активно сканируют, [na portscan] вытесняет из journald всё остальное, и глубина журнала падает ниже суток. Разбор любого инцидента старше вчерашнего дня становится невозможен — а на Debian 13 minimal, где нет ни rsyslog, ни wtmp, journald это ЕДИНСТВЕННЫЙ источник истории входов.

Наблюдалось

2026-09-02, флот из 8 хостов (v4.0.1, SystemMaxUse=300M везде, все ребутнуты 31.08 ~18:30 UTC):

хост [na portscan] строк за буту журнал самая старая запись
cdn1 (CDN-origin, публичный :443) 405 822 291.8M 2026-09-01 09:50 (≈20 ч)
nl1 (selfsteal) 357 659 286.7M 2026-09-01 11:55 (≈17 ч)
ru1 160 100 289.0M 2026-08-29
панель 128 970 281.8M 2026-08-27
it1 20 460 178.0M 2026-08-03
fr1 14 932 202.1M 2026-07-27
us1 (хостер режет всё, кроме 22/80/443/8443) 167 28.9M 2026-07-27

Зависимость прямая: чем доступнее нода снаружи, тем короче её память. На us1, где скан до порта просто не доходит, журнал живёт месяц с лишним при том же кап-лимите.

Почему это именно дефект тулкита, а не «так и надо»

Оба параметра ставит тулкит, и он же обещает в diagnose сенсоры по логам. Сейчас он одной рукой включает поток на 50 МБ/сутки, другой ограничивает хранилище тремя сотнями мегабайт — и не предупреждает, что вместе это даёт ретеншен меньше суток. Оператор узнаёт об этом, только когда лезет за историей и не находит её.

Предлагаемый фикс

  1. Понизить дефолт лога анти-скана до 5/minute (или 1/second с burst) — для «увидеть, что скан идёт», этого более чем достаточно: сам бан работает по счётчикам сета, а не по строкам лога. Вынести в knob PORTSCAN_LOG_RATE (по аналогии с уже существующими PORTSCAN_RATE/PORTSCAN_BURST).
  2. Считать бюджет журнала: при ENABLE_PORTSCAN_BAN=1 оценить PORTSCAN_LOG_RATE × 86400 × ~120 Б и, если это больше ~30 % от SystemMaxUse, печатать warn с обоими числами и предложением поднять кап или снизить рейт.
  3. Сенсор в diagnose: «журнал вмещает менее N часов» (по разнице между самой старой записью и now) — сейчас есть только сенсор лог-флуда по объёму, а ретеншен во времени, который и важен для форензики, не измеряется.

Activity

  1. jestivald commented on Sep 2, 2026

    @jestivald
    OwnerAuthor

    Подтверждаю на втором флоте (4 Remnawave-ноды, Ubuntu/Debian с rsyslog, v4.0.1, ребут 31.08) — там
    у этого же потока есть второй приёмник, который капом journald не ограничен вообще.

    [na portscan] попадает не только в journald, но и в /var/log/kern.log через rsyslog, а его
    пакетная станса — weekly без maxsize:

    нода [na portscan] за 24 ч kern.log
    de01 76 892 —
    fl01 74 941 58 МБ за ~2 суток
    most01 49 027 —
    ch01 8 820 —

    Источник потока — распределённый скан с AS209334 (85.217.140.0/24, 85.217.149.0/24): ~50 адресов
    по ~4 хита в час каждый. Каждый по отдельности ниже порога PORTSCAN_RATE=15/мин, поэтому
    ban-once не срабатывает ни на одном (autoban_v4 пуст), а лог пишется на все.

    Из этого два следствия к предложенному фиксу:

    1. Понижение PORTSCAN_LOG_RATE лечит оба приёмника сразу — это аргумент за пункт 1, а не только за
      подъём SystemMaxUse.
    2. Собственная ротация тулкита эту нагрузку не покрывает по построению: дефолтный
      NA_LOG_PATHS="/var/log/nginx/*.log /var/log/remnanode/*.log" на Remnawave-ноде не существует
      (nginx не ставится, remnanode пишет в docker json-file), а растёт kern.log, который принадлежит
      чужой стансе. То есть на целевом для тулкита типе ноды фича ротации не защищает ни одного реально
      растущего файла. Возможно, дефолт стоит расширить до /var/log/kern.log /var/log/syslog с
      явной уступкой rsyslog'у и предупреждением (см. optimize: уступив маски чужой стансе, тулкит не создаёт свою и рапортует зелёным — diagnose показывает ✔ ротацию, которой нет #40).
  2. jestivald commented on Sep 2, 2026

    @jestivald
    OwnerAuthor

    Исправлено в v4.1 (PR #42, merge 427b13f): https://github.com/jestivald/node-accelerator/releases/tag/v4.1 — разбор в CHANGELOG, секция v4.1.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions