Лог iptables в отдельный файл

Автор: Admin | 04.05.2014
3 комментария | 4 323 views

Настройка журналирования iptables в отдельный файл iptables.log на Debian 7 Wheezy

Вступление
Подавляющее большинство руководств предлагают вариант внесения строки в /etc/rsyslog.conf типа:

kern.warning /var/log/iptables.log
или как и предлагаемый ниже, но с небольшими вариациями
:msg, contains, "log-prefix" -/var/log/iptables.log

Но не один у меня на Debian 7 так и не заработал. Вернее, заработал, и в обоих случаях сообщения писались в /var/log/iptables.log, но продолжали дублироваться в /var/log/messages и /var/log/syslog, что очень раздражало, и задача была незавершенной. Поэтому и решил написать об этом.

В первую очередь надо знать как iptables вообще логирует. В качестве примера взял правило которое разрешает пинги и логирует их:

iptables -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j LOG --log-prefix "Ping detected: "
iptables -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT

Теперь по событию подпадающее под это правило будет писаться такое сообщение в /var/log/messages и /var/log/syslog:

kernel: [122972.300408] Ping detected: IN=eth0 OUT= MAC=00:35:c9:36:7e:d1:00:24:5d:а6:c2:40:08:90 SRC=xxx.xxx.xxx.xxx DST=xxx.xxx.xxx.xxx LEN=60 TOS=0x00 PREC=0x00 TTL=124 ID=23020 PROTO=ICMP TYPE=8 CODE=0 ID=33602 SEQ=2462

Если попаданий в правила достаточно много, то невозможно проанализировать другие сообщения, т.к. сообщения iptables’а наводняют весь файл логов.

Сама настройка
Для избежания вышеописанного необходимо изменить критерий в префиксе сообщения, например так:

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 8 -j LOG --log-prefix "Iptables: Ping detected: "
iptables -A INPUT -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT

И создать файл /etc/rsyslog.d/iptables.conf со следующим содержанием:

echo ':msg, contains, "Iptables: " -/var/log/iptables.log' > /etc/rsyslog.d/iptables.conf
echo '& ~' >> /etc/rsyslog.d/iptables.conf

Где параметр
& ~ говорит о том что дальнейшую обработку записи производить не надо, следовательно она не попадет в другие файлы логов
"Iptables: " — log-prefix — критерий с которого начинается запись лога, чтобы rsyslog смог ее отловить и перенаправить в нужный файл. Его можно было и не менять, а оставить как есть Ping detected, но если правило не одно, то удобнее иметь общий префикс для всех правил, который и был сделан.
/var/log/iptables.log — файл в который писать лог

Перезапустить демон rsyslog:

/etc/init.d/rsyslog restart

Теперь сообщение в логе /var/log/iptables.log выглядит так:

kernel: [122972.300408] Iptables: Ping detected: IN=eth0 OUT= MAC=00:35:c9:36:7e:d1:00:24:5d:а6:c2:40:08:90 SRC=xxx.xxx.xxx.xxx DST=xxx.xxx.xxx.xxx LEN=60 TOS=0x00 PREC=0x00 TTL=124 ID=23020 PROTO=ICMP TYPE=8 CODE=0 ID=33602 SEQ=2462

Наконец iptables пишет в свой личный лог не засирая системные.


Можно пойти дальше, создав правила для разных событий и каждое событие направить в свой лог, например:

# Логировать пакеты со статусом INVALID 
$IPT -A INPUT -m state --state INVALID -j LOG --log-prefix "Iptables: Invalid packet: "
# Логировать INPUT пакеты, которые не попали ни в одно правило
$IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "Iptables: INPUT packet died: "
# Логировать FORWARD пакеты, которые не попали ни в одно правило
$IPT -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "Iptables: FORWARD packet died: "

Создать правила для ведения логирования каждого файла

mcedit /etc/rsyslog.d/iptables_invalid.conf
:msg, contains, "Iptables: Invalid packet" -/var/log/iptables_invalid.log
& ~
mcedit /etc/rsyslog.d/iptables_input.conf
:msg, contains, "Iptables: INPUT" -/var/log/iptables_input.log
& ~
mcedit /etc/rsyslog.d/iptables_forward.conf
:msg, contains, "Iptables: FORWARD" -/var/log/iptables_forward.log
& ~

Перезапустить rsyslog:

/etc/init.d/rsyslog restart

При такой конфигурации лог iptables разделен на три части и каждая пишется в свой файл.


Ротация логов Iptables

Настроить ротацию логов iptables можно создав файл /etc/logrotate.d/iptables со следующим содержимым. Для одного общего лога:

/var/log/iptables.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
    sharedscripts
}

или для раздельных логов:

/var/log/iptables_invalid.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
}

/var/log/iptables_input.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
}

/var/log/iptables_forward.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
}

Где
daily — ротировать ежедневно
rotate 30 — сохранять 30 последних ротированных файлов
compress — сжимать
missingok — отсутствие файла не является ошибкой
notifempty — не обрабатывать пустые файлы

Дабы убедиться в работоспособности, можно принудительно запустить ротацию:

logrotate -f /etc/logrotate.conf

Комментарии к посту “Лог iptables в отдельный файл

  1. Andrey

    Для ubuntu нужно учесть ещё одну тонкость, в /etc/rsyslog.d/ есть файлик 50-default.conf и если просто добавить указанные файлы iptables_*.conf в эту директорию, то они будут иметь наименьший приоритет и правил в них будут обрабатываться уже после того самого 50-… что приведёт к тому, что сообщения будут писаться в настроенные файлы и в syslog останутся. Поэтому нужно либо править 50-default.conf на сей предмет, либо называть файлы что-то типа 49-iptables_*conf. Тогда всё будет хорошо. В дебиан я не смотрел как это устроено, но подозреваю, что может быть аналогично.

  2. selivan

    Можно вместо «:msg, contains» использовать «:msg, startswith» — так по идее будет работать быстрее, тем более что мы пропускаем через этот фильтр все сообщения syslog.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *