PDA

Ver la versión completa : Analizador de archivos iptables



Cypress
06-03-2015, 14:03
Estimadísimos compañeros de foro, he estado trabajando en un script que comprueba errores en archivos de iptables.

Si bien algo similar se podría hacer con iptables-save and iptables-restore, en mi caso, cuento con varios archivos de iptables para varios clientes donde en el mismo, hay varios comentarios, y números de tickets que hacen referencia a los cambios, por lo que la metodología del iptables-save and iptables-restore no me pareció útil.

Por eso estuve desarrollando este script, que sin duda alguna se podría mejorar mucho, y de paso los invito al que lo desee mejorarlo.

Estuve buscando en internet y no encontre nada similar, por es decidí compartirlo con ustedes.


#! /bin/bash
## Ano : 2015
## Version : 1.0
## GPLv3
##
####
## Tenía que devolver algo a la comunidad de la que tanto he tomado! :)
####
##
############################################## Some considerations #################################
### Este script no presenta ninguna garantia
###
### El script fue probado usando OpenSuse y Ubuntu, para todos mis archivos de iptables
### En todas mis pruebas, este script funciono bien, tal vez en otros GNU/Linux no tan asi.
###
### Por favor enviar cualquier tipo de bug que encuentren, o mejora que deseen compartir.
###
### Este script no trabaja con while, aun no ha sido implementado, pero no es dificil de adaptar.
###
############################################## IMPORTAN #############################################
## Ejecuten este script usando nohup, no van a querer correr iptables -F mientras estan usando ssh
## Example: nohup ./test_filler > test_filter.out
## Para verificar los errores de manera sencilla: grep Error test_filter.out
##




PATH_FILTROS=/etc/filtros-up
BUCLE_TMP=/etc/.bucle
VARIABLES=/etc/.variables
EJECUTAR_BLOQUE=0
CONTADOR_LINEAS=0;
CANT_FOR=0;
ERRORES=/etc/.errores


# de esta forma me aseguro que el archivo está vacio y existe, hay mejores formas de hacerlo, esta es la facil.
touch $BUCLE_TMP
rm -f $BUCLE_TMP
touch $BUCLE_TMP
chmod +x $BUCLE_TMP
touch $VARIABLES
rm -f $VARIABLES
touch $VARIABLES
chmod +x $VARIABLES
touch $ERRORES
rm -f $ERRORES
touch $ERRORES


ENTRO_EN_LOOP=0
##
## Defino Variables locales como globales para la ejecucion del filtros
## Esto seguro se puede mejorar?
for VAR in `grep \= $PATH_FILTROS | grep -v ^# | grep -v LOG`; do
echo "export $VAR" >> $VARIABLES
done;
source $VARIABLES
while read LINEA; do
let CONTADOR_LINEAS=$CONTADOR_LINEAS+1;
if [ -z "`echo "$LINEA" | grep ^#`" ]; then
# Busco los for, y los mando a un archivo, para luego ejecutar como bloque
if [ -n "`echo "$LINEA" | grep "for "`" ]; then
ENTRO_EN_LOOP=1
let CANT_FOR=$CANT_FOR+1;
echo "$LINEA" >> $BUCLE_TMP
fi;
if (($ENTRO_EN_LOOP)) && [ -n "`echo "$LINEA" | grep -v "for "`" ] && [ -n "`echo "$LINEA" | grep -v done`" ]; then
echo "$LINEA" >> $BUCLE_TMP
fi;
if (($ENTRO_EN_LOOP)) && [ -n "`echo "$LINEA" | grep done`" ]; then
echo "$LINEA" >> $BUCLE_TMP
DONE=1;
let CANT_FOR=$CANT_FOR-1;

fi
if [ "$CANT_FOR" = "0" ] && (($DONE)); then
ENTRO_EN_LOOP=0
EJECUTAR_BLOQUE=1
fi;
if (($EJECUTAR_BLOQUE)); then
echo
echo "Se va a ejectuar el siguiente bloque de codigo: "
cat $BUCLE_TMP
$BUCLE_TMP

if [ "$?" != "0" ]; then
echo "------------------------------------------------"
echo
echo "Error en Linea: $CONTADOR_LINEAS"
echo "Linea: $LINEA"
echo
echo "------------------------------------------------"
fi;
ENTRO_EN_LOOP=0
EJECUTAR_BLOQUE=0;
rm -f $BUCLE_TMP
touch $BUCLE_TMP
chmod +x $BUCLE_TMP
fi;
if ! (($EJECUTAR_BLOQUE)) && ! (($ENTRO_EN_LOOP)) && ! (($DONE)); then
eval $LINEA
if [ "$?" != "0" ]; then
echo "------------------------------------------------"
echo
echo "Error en Linea: $CONTADOR_LINEAS"
echo "Linea: $LINEA"
echo
echo "------------------------------------------------"
fi;

fi;
# no recuerdo por que era esto :S
if [ "$?" != "0" ] && ! (($ENTRO_EN_LOOP)) && ! (($DONE)); then
echo "------------------------------------------------"
echo
echo "Error en Linea: $CONTADOR_LINEAS"
echo "Linea: $LINEA"
echo
echo "------------------------------------------------"
fi;
if (($DONE)); then
DONE=0;
fi;
fi;


done < $PATH_FILTROS;


Espero que les sea útil, y toda sugerencia es bienvenida.

Saludos y Gracias,
Cypress