Ответы:
Загляните в справочную страницу для 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 switch в ваши правила iptables, в которые вы хотите войти:
–log-prefix NETFILTER
В качестве альтернативы вы можете также регистрировать сообщения, используя этот тип фильтра свойств:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
ПРИМЕЧАНИЕ. Этот второй метод не требует каких-либо изменений 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
}