Спосіб змусити Iptables писати в свій лог і не дублювати у системний

У замітці розповідається про налаштування журналювання iptables в окремий файл. Більшість посібників пропонують два підходи, але, на жаль, у мене на Debian вони так і не заробили. Точніше, логи писалися
/var/log/iptables.log
, але продовжували дублюватися в
/var/log/messages
та
/var/log/syslog
, що дуже дратувало і завдання була незавершеною. Знайшовши спосіб не дублювати повідомлення у системні, вирішив опублікувати отримані результати.

Початок

Сам netfilter не пише логи в принципі. Щоб він почав це робити необхідно створити правило з дією LOG. Подробиці можна подивитися в Iptables Tutorial. В якості прикладу візьму правило логування пінгів і правило дозволяє їх:
iptables-A INPUT-p ICMP --icmp-type 8-j LOG --log-prefix "Ping detected: "
iptables-A INPUT-p ICMP --icmp-type 8-j ACCEPT

Тепер події, що підпадає під це правило, буде писатися повідомлення
/var/log/messages
та
/var/log/syslog
:
kernel: [122972.300408] Ping detected IN=eth0 OUT= MAC=00:64:d9:36:7b:d7:00:24:2d:a6:e2:43:08:91 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 --icmp-type 8-j LOG --log-prefix "Iptables: Ping detected: "
iptables-A INPUT-p ICMP --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:64:d9:36:7b:d7:00:24:2d:a6:e2:43:08:91 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:
iptables-A INPUT-m state --state INVALID-j LOG --log-prefix "Iptables: Invalid packet: "
# Логировать INPUT пакети, які не потрапили ні в одне правило:
iptables-A INPUT-m limit --limit 3/minute --limit-burst 3-j LOG --log-prefix "Iptables: INPUT packet died: "
# Логировать FORWARD пакети, які не потрапили ні в одне правило:
iptables-A FORWARD-m limit --limit 3/minute --limit-burst 3-j LOG --log-prefix "Iptables: FORWARD packet died: "

Створити правила для ведення логування кожного файлу:
echo ':msg, contains, "Iptables: Invalid packet" -/var/log/iptables_invalid.log' > /etc/rsyslog.d/iptables_invalid.conf
echo '& ~' >> /etc/rsyslog.d/iptables_invalid.conf

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

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


Перезапустити 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

Працездатність тестувалася на Debian 7 і Debian 8. Так само має працювати на всіх дистрибутивах, використовують Iptables і rsyslog.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.