Відповіді:
Погляньте на сторінку 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
}