#/bin/bash
# Generic firewall for kernels 2.4/2.6
# Coded by HiDaRK <hidark@ya.com>
# Tested by kilen

help()
{
        echo
        echo "$0 [{start|stop|restart|open|close|ban|unban|list|filters|help|services}]"
        echo
        echo "   Argumento                         Descripcion"
        echo "   ----------------------------------------------"
        echo
        echo "   ***GENERALES***"
        echo "   start............................ inicia el cortafuegos"
        echo "   stop............................. detiene el cortafuegos"
        echo "   restart                           reinicia el cortafuegos"
        echo "   list {open{tcp|udp}|tcp|udp}..... Lista los puertos en uso, con"
        echo "                                     open solo lista los abiertos, se"
        echo "                                     puede seleccionar ademas el protocolo"
        echo "   filters.......................... lista los filtros aplicados "
        echo "   services......................... muestra los servicios soportados"
        echo "   panic............................ modo panico, el ordenador parece"
        echo "                                     desconectado de la red."
        echo "   normal........................... el firewall vuelve al modo normal"
        echo
        echo "   ***FILTRADO***"
        echo "   open {port proto | servicio}..... abre el puerto port en el"
        echo "                                     protocolo proto o abre los"
        echo "                                     puertos para servicio"
        echo "   close {port proto | servicio}.... cierra el puero port en el"
        echo "                                     protocolo proto o cierra los"
        echo "                                     puertos para servicio"
        echo "   ban ip........................... bloquea ips"
        echo "   unban ip......................... desbloquea ips bloqueadas"
        echo
        echo "   ***NIDS***"
        echo "   snort {on|off}................... Interactua con el NIDS snort y"
        echo "                                     banea las ips de atacantes"
        echo
        echo "   ***Ejemplos***"
        echo "   $0 start                |    $0 list open tcp"
        echo "   $0 open amule           |    $0 list open"
        echo "   $0 open 22 tcp          |    $0 list"
        echo "   $0 close 0:1024 udp     |    $0 ban 192.168.2.1"
        echo
}

services()
{
        echo
        echo "Servicios soportados: "
        echo
        echo "    Nombre                  Descripcion"
        echo "    -----------------------------------"
        echo "    nicotine                Soporte para clientes de las "
        echo "                            redes soulseek"
        echo "    amule                   Clientes del emule"
        echo "    gnomemeeting            Videoconferencias con h323"
        echo "    doom                    Juego lsdldoom"
        echo "    icmp                    permitir icmp"
        echo "    overnet/ed2k            permite overnet/ed2k"
        echo
}


start()
{
        iptables -I INPUT -s ! localhost -m state --state NEW,INVALID -j DROP
}

stop()
{
        while $(true); do
                iptables -D INPUT 1 &> /dev/null;
                if [ "$?" = 1 ]; then
                        break;
                fi
        done
}

restart()
{
        stop
        start
}

panic()
{
        iptables -I INPUT -j DROP
}

normal()
{
        iptables -D INPUT -j DROP
}


open()
{
        if [ "$1" = "amule" ]; then
                iptables -I INPUT -p udp --dport 4672 -j ACCEPT
                iptables -I INPUT -p tcp --dport 4712   -j ACCEPT
                iptables -I INPUT -p tcp --dport 4662   -j ACCEPT
        elif [ "$1" = "nicotine" ]; then
                iptables -I INPUT -p tcp --dport 2234:2238 -j ACCEPT
        elif [ "$1" = "gnomemeeting" ]; then
                iptables -I INPUT -p tcp --dport 1720 -j ACCEPT
                iptables -I INPUT -p tcp --dport 30000:30010 -j ACCEPT
                iptables -I INPUT -p udp --dport 5000:5007 -j ACCEPT
                iptables -I INPUT -p udp --dport 5010:5013 -j ACCEPT
        elif [ "$1" = "doom" ]; then
                iptables -I INPUT -p udp --dport 5029 -j ACCEPT
        elif [ "$1" = "icmp" ]; then
                iptables -I INPUT -p icmp -j ACCEPT
        elif [ "$1" = "overnet/ed2k" ]; then
                iptables -I INPUT -p tcp --dport 4663 -j ACCEPT
                iptables -I INPUT -p udp --dport 12369 -j ACCEPT
        else
                iptables -I INPUT -p $2 --dport $1 -j ACCEPT
        fi
}

close()
{
        if [ "$1" = "amule" ]; then
                iptables -D INPUT -p udp --dport 4672 -j ACCEPT
                iptables -D INPUT -p tcp --dport 4712   -j ACCEPT
                iptables -D INPUT -p tcp --dport 4662   -j ACCEPT
        elif [ "$1" = "nicotine" ]; then
                iptables -D INPUT -p tcp --dport 2234:2238 -j ACCEPT
        elif [ "$1" = "gnomemeeting" ]; then
                iptables -D INPUT -p tcp --dport 1720 -j ACCEPT
                iptables -D INPUT -p tcp --dport 30000:30010 -j ACCEPT
                iptables -D INPUT -p udp --dport 5000:5007 -j ACCEPT
                iptables -D INPUT -p udp --dport 5010:5013 -j ACCEPT
        elif [ "$1" = "doom" ]; then
                iptables -D INPUT -p udp --dport 5029 -j ACCEPT
        elif [ "$1" = "icmp" ]; then
                iptables -D INPUT -p icmp -j ACCEPT
        elif [ "$1" = "overnet/ed2k" ]; then
                iptables -D INPUT -p tcp --dport 4663 -j ACCEPT
                iptables -D INPUT -p udp --dport 12369 -j ACCEPT
        else
                iptables -D INPUT -p $2 --dport $1 -j ACCEPT
        fi
}

ban()
{
        iptables -I INPUT -s $1 -j DROP
}

unban()
{
        iptables -D INPUT -s $1 -j DROP
}

list()
{
        if [ "$1" = "open" ]; then
                if [ "$2" = "tcp" ]; then
                        netstat -tanp | grep LISTEN
                elif [ "$2" = "udp" ]; then
                        netstat -uanp
                else
                        netstat -tuanp | grep LISTEN
                fi
        else
                if [ "$1" = "tcp" ]; then
                        netstat -tanp
                elif [ "$1" = "udp" ]; then
                        netstat -uanp
                else
                        netstat -tuanp
                fi
        fi
}


if [ $UID != 0 ]; then
        echo Necesitas ser root para ejecutar este script
        su -c $0
        exit -1
fi

case "$1" in
        help)
                help
                exit 0
                ;;
        services)
                services
                exit 0
                ;;
        start)
                echo Iniciando firewall
                start
                exit 0
                ;;
        stop)
                echo Parando firewall
                stop
                exit 0
                ;;
        restart)
                echo Reiniciando firewall
                restart
                exit 0
                ;;
        panic)
                echo Entrando en modo panico, ejecuta $0 normal para volver al estado normal
                panic
                exit 0
                ;;
        normal)
                echo Entrando en estado normal
                normal
                exit 0
                ;;
        open)
                if [ -z $2 ]; then
                        help
                        exit -1
                fi
                if [ -z $3 ]; then
                        echo Abriendo puertos para $2
                else
                        echo Abriendo puerto $2 en protocolo $3
                fi
                open $2 $3
                exit 0
                ;;
        close)
                if [ -z $2 ]; then
                        help
                        exit -1
                fi
                if [ -z $3 ]; then
                        echo Cerrando puertos de $2
                else
                        echo Cerrando puerto $2 en protocolo $3
                fi
                close $2 $3
                exit 0
                ;;
        ban)
                if [ -z $2 ]; then
                        help
                        exit -1
                fi
                echo Bloqueando ip $2
                ban $2
                exit 0
                ;;
        unban)
                if [ -z $2 ]; then
                        help
                        exit -1
                fi
                echo Desbloqueando ip $2
                unban $2
                exit 0
                ;;
        list)
                list $2 $3
                exit 0
                ;;
        filters)
                iptables -L
                exit 0
                ;;
        snort)
                echo Opcion aun no implementada
                exit 0
                ;;
        *)
                help
                exit -1
                ;;
esac

