Odpowiedzi:
Zajrzyj na stronę podręcznika użytkownika iptables
. Pokazuje cel zwany, LOG
który może robić, co chcesz.
Ustaw poziom rejestrowania na LOG
4.
# DROP everything and Log it
iptables -A INPUT -j LOG --log-level 4
iptables -A INPUT -j DROP
Skonfiguruj, syslog.conf
aby zapisywać te wiadomości w osobnym pliku.
# /etc/syslog.conf
kern.warning /var/log/iptables.log
Uruchom ponownie syslogd.
Debian / Ubuntu
$ sudo /etc/init.d/sysklogd restart
Fedora / CentOS / RHEL
$ sudo /etc/init.d/syslog restart
UWAGA: Ta metoda rejestrowania nazywa się stałymi priorytetami. Są to liczby lub imiona (1,2,3,4, ..) lub (DEBUG, WARN, INFO itp.).
Jeśli przypadkiem używasz rsyslog
, możesz utworzyć filtr oparty na właściwościach, taki jak:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
Następnie dodaj przełącznik Thils do reguł iptables, które chcesz zalogować:
–log-prefix NETFILTER
Alternatywnie można również rejestrować wiadomości przy użyciu tego typu filtru właściwości:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
UWAGA: Ta druga metoda nie wymaga żadnych zmian w iptables
.
/var/log/iptables
i również w /var/log/messages
. Chcę tylko jedną kopię z tych danych wiptables.log
Zakłada się, że zapora już tworzy dzienniki, jak każda rozsądna zapora ogniowa. W niektórych przykładach wymaga rozpoznawalnego komunikatu, takiego jak „NETFILTER” w przykładzie slm.
utwórz plik w rsyslog.d
vim /etc/rsyslog.d/10-firewall.conf
Działa to w CentOS 7. Nie wiem, jak zweryfikować, że pochodzi z zapory, oprócz szukania IN i OUT ... CentOS jest dziwny. Nie używaj tego, chyba że następna wersja nie działa.
# into separate file and stop their further processing
if ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Działa to w CentOS 7 i sprawdza również zawartość wiadomości (zamień „Shorewall” na cokolwiek, co masz w wiadomości reguły -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
& ~
}
Działa to w innych (Ubuntu, Debian, openSUSE). I to jest najlepszy sposób, aby to zrobić. Brak wyszukiwania ciągów w wiadomości:
# into separate file and stop their further processing
if ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then -/var/log/firewall
& ~
I oto, co ma domyślna maszyna openSUSE (którą, jak sądzę, powinna mieć i której brakuje każda dystrybucja) (różnica wydaje się być tylko „stop” zamiast „& ~”; nie wszystkie systemy obsługują obie składnie):
if ($syslogfacility-text == 'kern') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
stop
}
Poza tym nie zapomnij też pliku logrotate.d:
vim /etc/logrotate.d/firewall
zawierający:
/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
}