Відповіді:
Погляньте на сторінку man для 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.
Debian / Ubuntu
$ sudo /etc/init.d/sysklogd restart
Fedora / CentOS / RHEL
$ sudo /etc/init.d/syslog restart
ПРИМІТКА. Цей спосіб ведення журналу називається фіксованими пріоритетами. Це або числа, або імена (1,2,3,4, ..) або (DEBUG, WARN, INFO тощо).
Якщо випадково ви користуєтесь rsyslog, ви можете створити фільтр на основі властивості так:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
Потім додайте перемикач thils до правил iptables, які ви бажаєте увійти:
–log-prefix NETFILTER
Як альтернативу, ви також можете записати повідомлення за допомогою цього типу фільтра властивостей:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
ПРИМІТКА. Цей 2-й метод не потребує змін iptables.
/var/log/iptablesа також в /var/log/messages. Я хочу лише одну копію цих даних уiptables.log
Це передбачає, що ваш брандмауер вже робить журнали, як і будь-який здоровий брандмауер. Для деяких прикладів воно вимагає ідентифікуючого повідомлення, наприклад "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 (що, на мою думку, у кожного дистрибутива має бути, і його немає) (різниця здається лише "стоп" замість "& ~"; не всі системи підтримують обидва синтаксиси):
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
}