#!/bin/bash
#
# Por Guimi 2006/02 - http://www.guimi.net
#
# Basado principalmente en
#+ http://www.pello.info/filez/IPTABLES_en_21_segundos.html
#+ http://www.pello.info/filez/firewall/iptables.html
#
# Para guardar las reglas
#+ iptables-save > reglas
#+ iptables-restore < reglas
#

IPTABLES=/sbin/iptables
LOCAL_HOST=192.168.0.2


echo "Limpiando FW..."
##########################################
### Limpiamos la configuracion existente
# Limpiamos (flush) las reglas
$IPTABLES -F
# Borramos 'chains' de usuario
$IPTABLES -X
# Ponemos a cero paquetes y contadores
$IPTABLES -Z
# Limpiamos las reglas de NAT
$IPTABLES -t nat -F


echo "Estableciendo politicas..."
##########################################
### Establecemos las politicas de los 'chains'
$IPTABLES -P INPUT DROP
#$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
#$IPTABLES -P FORWARD DROP
#$IPTABLES -t nat -P PREROUTING DROP
#$IPTABLES -t nat -P POSTROUTING DROP


echo "Dando permiso local..."
##########################################
### Permitimos acceso local
# Permitimos todo a interfaz localhost
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
# Permitimos todo a nuestra IP
$IPTABLES -A INPUT -s $LOCAL_HOST -j ACCEPT
$IPTABLES -A OUTPUT -d $LOCAL_HOST -j ACCEPT

# Reiteracion de permisos locales
$IPTABLES -A INPUT -i eth0 -s $LOCAL_HOST -p tcp --dport 3306 -j ACCEPT # MySQL
$IPTABLES -A INPUT -i eth0 -s $LOCAL_HOST -p tcp --dport 631 -j ACCEPT  # CUPS web
$IPTABLES -A INPUT -i eth0 -s $LOCAL_HOST -p tcp --dport 4000 -j ACCEPT # MLDonkey telnet
$IPTABLES -A INPUT -i eth0 -s $LOCAL_HOST -p tcp --dport 4080 -j ACCEPT # MLDonkey web


echo "Reglas de proteccion..."
##########################################
### Reglas de proteccion
# Anti-flooding o inundación de tramas SYN.
iptables -N syn-flood
iptables -A INPUT -i eth0 -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP

# Guardar los accesos con paquetes fragmentados, recurso utilizado para tirar
# servidores y otras maldades (bug en Apache por ejemplo)
iptables -A INPUT -i eth0 -f -j LOG --log-prefix "Fragmento! "
iptables -A INPUT -i eth0 -f -j DROP


echo "Reglas de accesos permitidos..."
##########################################
### Accesos permitidos
echo "-> DNS..."
$IPTABLES -A INPUT -s 0.0.0.0/0 -p udp -m udp --sport 53 -j ACCEPT
$IPTABLES -A OUTPUT -d 0.0.0.0/0 -p udp -m udp --dport 53 -j ACCEPT
echo "-> web..."
# Aceptamos acceso www
$IPTABLES -A INPUT -i eth0 -s 0.0.0.0/0 -p tcp -m tcp --dport 80 -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -A OUTPUT -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Permitimos que local pueda salir a la web
$IPTABLES -A INPUT -i eth0 -p tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

echo "-> ftp..."
# Permitimos que local pueda salir a FTP
$IPTABLES -A INPUT -i eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# ftp activo
$IPTABLES -A INPUT -i eth0 -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
# ftp pasivo
$IPTABLES -A INPUT -i eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

echo "-> ssh..."
# Aceptamos ssh y guardamos LOG
$IPTABLES -A INPUT -i eth0 -s 0.0.0.0/0 -p tcp -m tcp --dport ssh -j LOG --log-prefix "IPTablesFW> "
$IPTABLES -A INPUT -i eth0 -s 0.0.0.0/0 -p tcp -m tcp --dport ssh -j ACCEPT
# ...y conexiones salientes relacionadas
$IPTABLES -A OUTPUT -p tcp -m tcp --sport ssh -m state --state RELATED,ESTABLISHED -j ACCEPT

echo "-> ntpd..."
# Aceptamos conexiones ntpd
$IPTABLES -A INPUT -i eth0 -s 0.0.0.0/0 -p udp -m udp --dport 123 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -m udp --sport 123 -j ACCEPT


echo "-> mldonkey..."
##########################################
# MLDonkey
EDONKEY_PORT=4662
KAD_PORT=8443
OVERNET_PORT=5865
BITTORRENT_PORT=6882
OPENNAP_PORT=9999

## MLDonkey acting as Edonkey2000 client
$IPTABLES -A INPUT -p tcp --dport $EDONKEY_PORT -j ACCEPT
$IPTABLES -A INPUT -p udp --dport $(($EDONKEY_PORT + 4)) -j ACCEPT

## MLDonkey acting as Kad client
$IPTABLES -A INPUT -p tcp --dport $KAD_PORT -j ACCEPT
$IPTABLES -A INPUT -p udp --dport $KAD_PORT -j ACCEPT

## MLDonkey acting as Overnet client
$IPTABLES -A INPUT -p tcp --dport $OVERNET_PORT -j ACCEPT
$IPTABLES -A INPUT -p udp --dport $OVERNET_PORT -j ACCEPT

## MLDonkey acting as Edonkey2000 server
# $IPTABLES -A INPUT -p tcp --dport $(($EDONKEY_PORT - 1)) -j ACCEPT

## MLDonkey acting as BitTorrent client
$IPTABLES -A INPUT -p tcp --dport $BITTORRENT_PORT -j ACCEPT

## MLDonkey acting as OpenNap client
$IPTABLES -A INPUT -p tcp --dport $OPENNAP_PORT -j ACCEPT


echo "Reiteraciones de seguridad..."
##########################################
# Reiteraciones de seguridad
# Descartamos explicitamente algunos traficos

# MySQL
$IPTABLES -A INPUT -p tcp --dport 3306 -j DROP
# Webmin
$IPTABLES -A INPUT -p tcp --dport 10000 -j DROP
$IPTABLES -A INPUT -p udp --dport 10000 -j DROP
# PostgreSQL
$IPTABLES -A INPUT -p tcp --dport 5432 -j DROP
$IPTABLES -A INPUT -p udp --dport 5432 -j DROP
# Proxy Squid
$IPTABLES -A INPUT -p tcp --dport 3128 -j DROP
$IPTABLES -A INPUT -p udp --dport 3128 -j DROP
# Proxy Squid Transparente
$IPTABLES -A INPUT -p tcp --dport 19720:19721 -j DROP
$IPTABLES -A INPUT -p udp --dport 19720:19721 -j DROP
# PPTP - VPN
$IPTABLES -A INPUT -p tcp --dport 1723 -j DROP
$IPTABLES -A INPUT -p udp --dport 1723 -j DROP


echo "Cerrando puertos restringidos..."
##########################################
# Puertos restringidos (telnet, ftp, imap, pop3, etc.)
$IPTABLES -A INPUT -p tcp --dport 1:1024 -j DROP
$IPTABLES -A INPUT -p udp --dport 1:1024 -j DROP

echo "Configuracion FW terminada. Verifique con: iptables -L -n"


