В моем 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
.