Как настроить файл syslog.conf для регистрации сообщений iptables в отдельном файле?

Как настроить файл syslog.conf для регистрации сообщений iptables в отдельном файле?

Как настроить /etc/syslog.confфайл, чтобы сохранить информацию журнала iptablesв определенном файле.

Я хочу сохранить эту информацию отдельно, чтобы можно было легко и быстро извлечь нужную информацию.

решение1

системный журнал

Посмотрите на страницу руководства для iptables. Там показана цель, LOGкоторая может делать то, что вы хотите.

Пример

  1. Установите уровень ведения журнала на LOG4.

    # DROP everything and Log it
    iptables -A INPUT -j LOG --log-level 4
    iptables -A INPUT -j DROP
    
  2. Настройте syslog.confзапись этих сообщений в отдельный файл.

    # /etc/syslog.conf
    kern.warning     /var/log/iptables.log
    
  3. Перезапустите 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
}

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