Risposte:
Dai un'occhiata alla pagina di manuale di iptables
. Mostra un bersaglio chiamato LOG
che può fare quello che vuoi.
Impostare il livello di registrazione LOG
su 4.
# DROP everything and Log it
iptables -A INPUT -j LOG --log-level 4
iptables -A INPUT -j DROP
Configurare syslog.conf
per scrivere questi messaggi in un file separato.
# /etc/syslog.conf
kern.warning /var/log/iptables.log
Riavvia syslogd.
Debian / Ubuntu
$ sudo /etc/init.d/sysklogd restart
Fedora / CentOS / RHEL
$ sudo /etc/init.d/syslog restart
NOTA: questo metodo di registrazione è chiamato priorità fisse. Sono numeri o nomi (1,2,3,4, ..) o (DEBUG, WARN, INFO, ecc.).
Se per caso stai usando rsyslog
, puoi creare un filtro basato sulle proprietà in questo modo:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
Quindi aggiungi l'interruttore thils alle regole di iptables che desideri registrare:
–log-prefix NETFILTER
In alternativa è possibile anche registrare i messaggi utilizzando questo tipo di filtro proprietà:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
NOTA: questo secondo metodo non richiede alcuna modifica a iptables
.
/var/log/iptables
e anche in /var/log/messages
. Voglio solo una copia di questi dati iniptables.log
Ciò presuppone che il firewall abbia già creato registri, come dovrebbe fare qualsiasi firewall sano di mente. Per alcuni esempi, richiede un messaggio identificabile, come "NETFILTER" nell'esempio di slm.
crea un file in rsyslog.d
vim /etc/rsyslog.d/10-firewall.conf
Funziona in CentOS 7. Non so come verificare che provenga dal firewall oltre a cercare IN e OUT ... CentOS è strano. Non usare questo a meno che la prossima versione non funzioni.
# into separate file and stop their further processing
if ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Funziona in CentOS 7 e verifica anche il contenuto del messaggio (sostituisci "Shorewall" con tutto ciò che hai nel messaggio della regola -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
& ~
}
Funziona in altri (Ubuntu, Debian, openSUSE). E questo è il modo migliore per farlo. Nessuna ricerca di stringhe nel messaggio:
# into separate file and stop their further processing
if ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then -/var/log/firewall
& ~
Ed ecco cosa ha una macchina openSUSE predefinita (che penso che ogni distribuzione dovrebbe avere e che manca) (la differenza sembra essere solo "stop" invece di "& ~"; non tutti i sistemi supportano entrambe le sintassi):
if ($syslogfacility-text == 'kern') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
stop
}
E per tutto quanto sopra, non dimenticare anche un file logrotate.d:
vim /etc/logrotate.d/firewall
contenente:
/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
}