
Wie kann ich /etc/syslog.conf
eine Datei konfigurieren, um Protokollinformationen iptables
in einer bestimmten Datei zu speichern?
Ich möchte diese Informationen separat speichern, damit ich einfach und schnell das Gewünschte extrahieren kann.
Antwort1
Syslog
Schauen Sie sich die Manpage für an iptables
. Dort wird ein Ziel namens angezeigt, LOG
das tun kann, was Sie wollen.
Beispiel
Stellen Sie die Protokollierungsstufe auf
LOG
4 ein.# DROP everything and Log it iptables -A INPUT -j LOG --log-level 4 iptables -A INPUT -j DROP
Konfigurieren Sie
syslog.conf
es so, dass diese Nachrichten in eine separate Datei geschrieben werden.# /etc/syslog.conf kern.warning /var/log/iptables.log
Starten Sie syslogd neu.
Debian/Ubuntu
$ sudo /etc/init.d/sysklogd restart
Fedora/CentOS/RHEL
$ sudo /etc/init.d/syslog restart
NOTIZ:Diese Art der Protokollierung nennt man feste Prioritäten. Dabei handelt es sich entweder um Zahlen oder Namen (1,2,3,4,..) oder (DEBUG, WARN, INFO, usw.).
rsyslog
Wenn Sie zufällig verwenden rsyslog
, können Sie einen eigenschaftsbasierten Filter wie folgt erstellen:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
Fügen Sie dann diesen Schalter zu Ihren iptables-Regeln hinzu, die Sie protokollieren möchten:
–log-prefix NETFILTER
Alternativ können Sie die Nachrichten auch mit diesem Typ von Eigenschaftenfilter protokollieren:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
NOTIZ:Diese zweite Methode erfordert keine Änderungen an iptables
.
Verweise
Antwort2
Dies setzt voraus, dass Ihre Firewall bereits Protokolle erstellt, wie es jede vernünftige Firewall tun sollte. Für einige Beispiele ist eine identifizierbare Meldung erforderlich, wie beispielsweise „NETFILTER“ im Beispiel von slm.
Erstellen Sie eine Datei in rsyslog.d
vim /etc/rsyslog.d/10-firewall.conf
Dies funktioniert unter CentOS 7. Ich weiß nicht, wie ich überprüfen kann, ob es von der Firewall kam, außer durch Suchen nach IN und OUT ... CentOS ist komisch. Verwenden Sie dies nicht, es sei denn, die nächste Version funktioniert nicht.
# into separate file and stop their further processing
if ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Dies funktioniert in CentOS 7 und prüft auch den Nachrichteninhalt (ersetzen Sie „Shorewall“ durch den Inhalt der Nachricht Ihrer -j LOG-Regel):
# into separate file and stop their further processing
if ($msg contains 'Shorewall') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Dies funktioniert in anderen (Ubuntu, Debian, openSUSE). Und dies ist die beste Vorgehensweise. Keine Suche nach Zeichenfolgen in der Nachricht:
# into separate file and stop their further processing
if ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then -/var/log/firewall
& ~
Und hier ist, was eine Standard-openSUSE-Maschine hat (was meiner Meinung nach jede Distribution haben sollte und fehlt) (der Unterschied scheint nur „stop“ anstelle von „& ~“ zu sein; nicht alle Systeme unterstützen beide Syntaxen):
if ($syslogfacility-text == 'kern') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
stop
}
Und vergessen Sie bei alledem nicht, auch eine logrotate.d-Datei anzulegen:
vim /etc/logrotate.d/firewall
Enthält:
/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
}