dmesg переполнен журналами брандмауэра

dmesg переполнен журналами брандмауэра

В моем iptables есть правило, которое регистрирует отброшенные пакеты:

-A INPUT -i eth0       -j   LOG  --log-prefix "FW: " --log-level 7
-A INPUT -i eth0       -j   DROP

И у /etc/rsyslog.confменя есть еще одно правило, которое отправляет эти журналы в специальный файл /var/log/firewall.log.

:msg, contains, "FW: "                    -/var/log/firewall.log
& ~

Логи удаляются & ~немедленно, чтобы не засорять syslogдругие файлы журналов.

Это работает хорошо, за исключением того, что он переполняется dmesgжурналами брандмауэра ( /var/log/dmesgа не выводом команды dmesg).

Есть ли способ предотвратить отображение этих журналов dmesg?

решение1

Вы можете использовать NFLOGцель вместо LOG:

NFLOG
    This target provides logging of matching packets. When this  target  is  set  for  a
    rule, the Linux kernel will pass the packet to the loaded logging backend to log the
    packet. This is usually used in combination with nfnetlink_log as  logging  backend,
    which  will multicast the packet through a netlink socket to the specified multicast
    group. One or more userspace processes may subscribe to the  group  to  receive  the
    packets.  Like  LOG, this is a non-terminating target, i.e. rule traversal continues
    at the next rule.

Все, что вам нужно, это nfnetlink_logспособная программа для ведения журнала. Сообщения будут поступать туда, а процесс пользовательского пространства будет решать, регистрировать пакет или нет.

Еще один вариант, который вы можете попробовать, — это ограничить LOGправило определенным пороговым значением:

-A INPUT -i eth0 -m limit --limit 10/minutes -j LOG --log-prefix "FW: " --log-level 7
-A INPUT -i eth0 -j DROP

Это в среднем будет регистрировать 10 пакетов в минуту. Конечно, вы можете настроить это по своему усмотрению.

решение2

Если вы установили уровень журнала на 7 с помощью команды:

-A INPUT -i eth0       -j   LOG  --log-prefix "FW: " --log-level 7

Затем вы можете просто отфильтровать эти сообщения, передав пороговый уровень в dmesg:

dmesg --level=err,warn

решение3

Это может быть связано с уровнем журнала, который вы используете в iptables. Насколько я понимаю из документации rsyslog, уровни журнала следующие: "Приоритет - одно из следующих ключевых слов в порядке возрастания: debug, info, notification, warning, warn (то же, что и warning), err, error (то же, что и err), crit, alert, emerg, panic (то же, что и emerg)". А как насчет попытки указать уровень журнала в iptables, используя его имя, то есть 'notice'? Поделом мне, что я разместил сообщение без проверки, так как теперь я думаю, что проблема совсем не в этом. Я реализовал схему, похожую на описанную выше, и у меня та же проблема. Мое ядро ​​centos 7 - v3.10.0, и, по-видимому, начиная с v3.5, похоже, что журналирование ядра выполняется с помощью /dev/kmsg, и я предполагаю, что dmesg каким-то образом получает свои входные данные оттуда.

решение4

Почему вас это волнует? dmesg— это низкоуровневый инструмент для вывода последних сообщений ядра, а вы просили ядро ​​регистрировать потерянные пакеты.

Настройте систему syslog вашей системы для регистрации сообщений iptables в отдельном файле журнала от других сообщений ядра и используйте файлы журналов, которые она записывает, вместо файлов dmesg.

Связанный контент