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.

Código:
#! /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