
¿Cómo puedo configurar /etc/syslog.conf
el archivo para guardar la información de registro iptables
en un archivo específico?
Quiero guardar esta información por separado, para poder extraer lo que quiero fácil y rápidamente.
Respuesta1
registro del sistema
Eche un vistazo a la página de manual para iptables
. Muestra un objetivo llamado LOG
que puede hacer lo que quieras.
Ejemplo
Establezca el nivel de registro en
LOG
4.# DROP everything and Log it iptables -A INPUT -j LOG --log-level 4 iptables -A INPUT -j DROP
Configure
syslog.conf
para escribir estos mensajes en un archivo separado.# /etc/syslog.conf kern.warning /var/log/iptables.log
Reinicie syslogd.
Debian/Ubuntu
$ sudo /etc/init.d/sysklogd restart
Fedora/CentOS/RHEL
$ sudo /etc/init.d/syslog restart
NOTA:Este método de registro se denomina prioridades fijas. Son números o nombres (1,2,3,4,...) o (DEBUG, WARN, INFO, etc.).
rsyslog
Si por casualidad estás usando rsyslog
, puedes crear un filtro basado en propiedades como este:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
Luego agregue este cambio a las reglas de iptables que desea registrar:
–log-prefix NETFILTER
Como alternativa, también puedes registrar los mensajes usando este tipo de filtro de propiedad:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
NOTA:Este segundo método no requiere ningún cambio en iptables
.
Referencias
Respuesta2
Esto supone que su firewall ya genera registros, como debería hacerlo cualquier firewall en su sano juicio. Para algunos ejemplos, requiere un mensaje identificable, como "NETFILTER" en el ejemplo de slm.
crear un archivo en rsyslog.d
vim /etc/rsyslog.d/10-firewall.conf
Esto funciona en CentOS 7. No sé cómo verificar que proviene del firewall además de buscar ENTRADA y SALIDA... CentOS es raro. No use esto a menos que la próxima versión no funcione.
# into separate file and stop their further processing
if ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Esto funciona en CentOS 7 y también verifica el contenido del mensaje (reemplace "Shorewall" con lo que tenga en el mensaje de su regla -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
& ~
}
Esto funciona en otros (Ubuntu, Debian, openSUSE). Y esta es la mejor manera de hacerlo. No buscar cadenas en el mensaje:
# into separate file and stop their further processing
if ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then -/var/log/firewall
& ~
Y esto es lo que tiene una máquina openSUSE predeterminada (que creo que todas las distribuciones deberían tener y falta) (la diferencia parece ser solo "detener" en lugar de "& ~"; no todos los sistemas admiten ambas sintaxis):
if ($syslogfacility-text == 'kern') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
stop
}
Y por todo lo anterior, no olvides también el archivo logrotate.d:
vim /etc/logrotate.d/firewall
que contiene:
/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
}