
Как настроить /etc/syslog.conf
файл, чтобы сохранить информацию журнала iptables
в определенном файле.
Я хочу сохранить эту информацию отдельно, чтобы можно было легко и быстро извлечь нужную информацию.
решение1
системный журнал
Посмотрите на страницу руководства для iptables
. Там показана цель, LOG
которая может делать то, что вы хотите.
Пример
Установите уровень ведения журнала на
LOG
4.# DROP everything and Log it iptables -A INPUT -j LOG --log-level 4 iptables -A INPUT -j DROP
Настройте
syslog.conf
запись этих сообщений в отдельный файл.# /etc/syslog.conf kern.warning /var/log/iptables.log
Перезапустите syslogd.
Дебиан/Убунту
$ sudo /etc/init.d/sysklogd restart
Fedora/CentOS/RHEL
$ sudo /etc/init.d/syslog restart
ПРИМЕЧАНИЕ:Этот метод регистрации называется фиксированными приоритетами. Это либо числа, либо имена (1,2,3,4,..) или (DEBUG, WARN, INFO и т.д.).
rsyslog
Если вы случайно используете rsyslog
, вы можете создать фильтр на основе свойств, например так:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
Затем добавьте этот параметр в правила iptables, которые вы хотите регистрировать:
–log-prefix NETFILTER
В качестве альтернативы вы также можете регистрировать сообщения, используя этот тип фильтра свойств:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
ПРИМЕЧАНИЕ:Этот второй метод не требует никаких изменений в iptables
.
Рекомендации
решение2
Это предполагает, что ваш брандмауэр уже делает логи, как и любой нормальный брандмауэр. Для некоторых примеров требуется идентифицируемое сообщение, например "NETFILTER" в примере slm.
создайте файл в rsyslog.d
vim /etc/rsyslog.d/10-firewall.conf
Это работает в CentOS 7. Я не знаю, как проверить, что это пришло из брандмауэра, кроме как поискать IN и OUT... CentOS странный. Не используйте это, если только следующая версия не перестанет работать.
# into separate file and stop their further processing
if ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Это работает в CentOS 7 и также проверяет содержимое сообщения (замените «Shorewall» на то, что указано в сообщении правила -j LOG):
# into separate file and stop their further processing
if ($msg contains 'Shorewall') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Это работает в других (Ubuntu, Debian, openSUSE). И это лучший способ сделать это. Никакого поиска строк в сообщении:
# into separate file and stop their further processing
if ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then -/var/log/firewall
& ~
А вот что есть на машине openSUSE по умолчанию (что, по моему мнению, должно быть в каждом дистрибутиве, но чего не хватает) (разница, похоже, только в «stop» вместо «& ~»; не все системы поддерживают оба синтаксиса):
if ($syslogfacility-text == 'kern') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
stop
}
И для всего вышеперечисленного не забудьте также файл logrotate.d:
vim /etc/logrotate.d/firewall
содержащий:
/var/log/firewall {
rotate 7
size 500k
postrotate
# before using this, run the command yourself to make sure
# it is right... the daemon name may vary
/usr/bin/killall -HUP rsyslogd
endscript
}