Iptables, por default tiene la regla filter en modo “Aceptar todo”, es decir, que deja entrar y salir toda conexión desde o hacia nuestra PC, pero, ¿Y si deseamos loguear toda la info de conexiones hechas a nuestros servers o PCs?
Nota: El procedimiento que ahora ejecutaré es válido 100% en distribuciones Debian/Debian-based, por lo que si usted usa Slackware, Fedora, CentOS, OpenSuSe, puede que el procedimiento no sea el mismo, recomendamos leer y entender el sistema de logueo de su distribución antes de aplicar lo que más adelante se expone. También existe la posibilidad de instalarse rsyslog en su distribución, si está disponible en los repositorios, aunque en este tutorial, se explica también syslog al final.
Todo bien hasta ahora, pero, ¿Dónde vamos a loguear? Fácil, en el archivo «/var/log/firewall/iptables.log«, que no existe, hasta que lo creemos nosotros mismos…
1- Debemos crear el archivo «iptables.log» dentro de la carpeta «/var/log/firewall» que debemos crearla, pues tampoco existe.
mkdir -p /var/log/firewall/
touch /var/log/firewall/iptables.log
2- Permisos, muy importante…
chmod 600 /var/log/firewall/iptables.log
chown root:adm /var/log/firewall/iptables.log
3- Rsyslog, el demonio de logueo de Debian, lee la configuración desde «/etc/rsyslog.d«, por lo que debemos crear un archivo que yo llamaré «firewall.conf» desde el cual rsyslog, pueda interpretar lo que queremos hacer.
touch /etc/rsyslog.d/firewall.conf
Y dentro le dejamos caer suavemente el siguiente contenido:
:msg, contains, «iptables: » -/var/log/firewall/iptables.log
& ~
Ni tengo ni la menor idea, ¿qué hacen este par de líneas?
La primera línea chequea los datos logueados buscando la cadena «iptables: » y lo añade al archivo «/var/log/firewall/iptables.log«
La segunda, detiene el procesamiento de la información logueada con el patrón anterior para que no siga siendo enviada a «/var/log/messages«.
4- Rotando el fichero de logs, con logrotate.
Debemos crear dentro de «/etc/logrotate.d/» el archivo «firewall» el cual contendrá el siguiente contenido:
/var/log/firewall/iptables.log
{
rotate 7
daily
size 10M
dateext
missingok
create 600 root adm
notifempty
compress
delaycompress
postrotate
invoke-rc.d rsyslog reload > /dev/null
endscript
}
Para así poder rotar los logs 7 veces antes de borrarlos, 1 vez al día, tamaño máximo del log 10MB, comprimido, con fecha, sin dar error si el log no existe, creado como root.
5- Reiniciar, como todo final feliz xD, el demonio rsyslog:
/etc/init.d/rsyslog restart
¿Cómo probar que todo eso está trabajando?
Probemos con SSH.
Instalar OpenSSH (en caso de que no lo tengan instalado…):
apt-get install openssh-server
Antes de continuar, debemos ejecutar como root en una consola:
iptables -A INPUT -p tcp --dport 22 --syn -j LOG --log-prefix "iptables: " --log-level 4
Ejecutando esta sentencia iptables logueará info suficiente para demostrar que lo que hemos hecho no es en vano. En esta sentencia le decimos a iptables que loguée toda información que le llegue por el puerto 22. Para probar con otros servicios, solamente cambiar el número del puerto, como 3306 para MySQL, por sólo citar un ejemplo, si desea más información, lea este tutorial muy bien documentado y basado en ejemplos tipicos de las configuraciones más usadas.
SSH usa el puerto 22 por default, por lo que haremos la prueba con él. Teniendo instalado openssh, nos conectamos a él.
ssh pepe@servidor-de-prueba
Para ver los logs, con un tail resuelves ese problema:
tail -f /var/log/firewall/iptables.log
Iptables, en este ejemplo, loguea todo, día, hora, ip, mac, etc, lo que lo hace genial para monitorear nuestros servers. Una pequeña ayuda que nunca está de más.
Ahora, tomando nota de que usamos otra distro, como decía al principio, generalmente se usa rsyslog, o algún similar. Si tu distro usa syslog, para realizar el mismo ejercicio debemos editar/modificar ligeramente syslog.conf
nano /etc/syslog.conf
Añadir y guardar la siguiente línea:
kern.warning /var/log/firewall/iptables.log
Y después, ya sabes, el final feliz:
/etc/init.d/sysklogd restart
Resultado: el mismo.
Eso es todo por ahora, en próximos posts, seguiremos jugando con iptables.
Referencias:
Force iptables to log to a different file
Log iptables to a separate file with rsyslog
Iptables configuration tutorial on Fedora/RHEL systems
Cojonudo este «mini-manual» para BOFH que estais haciendo poco a poco
Gracias, poco a poco iré dando detalles y datos de iptables, que yo tuve que conocer por mi trabajo, que a veces necesitamos y están muy mal explicados en Internet, todo por el usuario… xD
Aprovecho para darte la bienvenida socio 😀
De veras tienes MUCHO que aportar, tienes conocimientos realmente avanzados de redes, sistemas, firewalls etc, así que seré (ya soy) uno de los tantos lectores que tendrás jajaja.
Saludos y bueno… ya sabes, para lo que haga falta 😀
Espero con ansias esos artículos ^^
Anda Koratsuki, no sabía que frecuentabas este blog.
Por cierto, otra variante de registrar la actividad del cortafuegos es mediante el paquete ulogd, que esta hecho por la gente del proyecto netfilter para facilitar la separación de este tipo de trazas (permite guardarlas de diferentes maneras). Es el acercamiento que suelo usar yo. Utilizarlo es fácil, por ejemplo:
iptables -A INPUT -p udp -m multiport ! --ports 53,67:68 -m state --state NEW -j ULOG --ulog-prefix "Solicitud UDP dudosa"
Tendré que darle un F5 al post, me cuadra la forma de trabajar de Ulogd, hasta de MySQL loguea el tipo :D.
Buen post, keep it up.
Hola capo, como va?
Me podrías dar una mano?
Ya que no me sale lo del tutorial, y esta mas claro que el agua, no se en que le erro