#!/bin/sh
## Firewall personalizado
## Politica DROP
## Miguel Angel Villa Gutierrez
## Este Firewall fue posible usando manuales de Internet
## Ultima actualizacion (DD-MM-AAAA) 25-10-2006
#
#
## Definimos variables
#
## Localhost
LO_IFACE="lo"
LO_IP="127.0.0.1"
#
## Internet 0
INET_IFACE="eth0"
INET_IP_RANGE="0.0.0.0/0"
#
## Red Local
# Eth0
LAN_IP_0="192.168.7.100"
LAN_IP_RANGE_0="192.168.7.1/24"
LAN_BCAST_0="192.168.0.255"
LAN_IFACE_0="eth0"
# Eth1
LAN_IP_1="192.168.1.1"
LAN_IP_RANGE_1="192.168.1.0/24"
LAN_BCAST_1="192.168.1.255"
LAN_IFACE_1="eth1"
#
## Localizacion de iptables
IPTABLES="/usr/sbin/iptables"
#
## Borrado de reglas anteriores
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z
$IPTABLES -t nat -F
#
## Politicas predeterminadas de INPUT, FORWARD y OUTPUT
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD ACCEPT
#
## NAT enmascarado, para compartir internet y redireccion interna
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_IP_RANGE_1 -j MASQUERADE
#
## Activar forwarding de paquetes (Linux no lo hace por defecto)
echo "1" > /proc/sys/net/ipv4/ip_forward
#
## Redireccionamiento de paquetes
$IPTABLES -t nat -A PREROUTING -p tcp -i $LAN_IFACE_1 --dport 80 -j REDIRECT --to-port 3128
#
#
# ----------------------------------------------------------------------------------------------
#
#
## Regas INPUT (entrada de paquetes)
#
#
### HACKING! INICIO
# Todo lo que sea icmp (ping) y que intente entrar, se descarta
# con esto bloqueamos cualquier tipo de paquetes con protocolo icmp
# evitando ataques como el del ping de la muerte, para evitar que esta regla
# cause problemas de comunicacion con algunos ISP, se permite entrada si nosotros
# iniciamos el ping primero
$IPTABLES -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# Evitamos ataques syn-flood limitando el acceso de paquetes nuevos
# desde internet a solo 4 por segundo y los demas se descartan
# Esta opcion genera Low ID en aMule
#$IPTABLES -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j DROP
#
# Se evitan paquetes tcp que sean nuevos y que no tengan el flag SYN
# es decir, hay ataques o escaneos que llegan como conexiones nuevas
# pero sin ser paquetes syn, definitivamente no nos interesan
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
#
#$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: "
#
# Rechazar paquetes fragmentados
$IPTABLES -A INPUT -p udp -f -j DROP
$IPTABLES -A INPUT -p tcp -f -j DROP
#
# (Estas son algunas recomendaciones para protegernos, pero aun no se prueban...)
#
### HACKING! FIN
#
#
# Permitimos Localhost
$IPTABLES -A INPUT -i $LO_IFACE -j ACCEPT
# Permitimos Red Local
$IPTABLES -A INPUT -i $LAN_IFACE_1 -s $LAN_IP_RANGE_1 -j ACCEPT
# Permitimos entrada (input) solo conexiones establecidas y relacionadas
$IPTABLES -A INPUT -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
# Permitimos conexiones al puerto 22 SSH
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Permitimos conexiones de entrada al puerto 80 es un servidor HTTP apache
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
# Permitimos conexiones de entrada al puerto 20 y 21 es un servidor FTP VSFTPD
$IPTABLES -A INPUT -p tcp --dport 20:21 -j ACCEPT
#$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 21 -j ACCEPT
# Lineas recomendadas por gin0 inicio
## Localizacion de iptables
# cargar estos modulos asi:
# como root
# insmod ip_nat_ftp
# insmod ip_conntrack_ftp
# Permitimos conexiones de entrada al puerto 25 y 110 es un servidor MTA POSTFIX
#$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 25 -j ACCEPT
#$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 110 -j ACCEPT
# Permitimos conexiones de entrada al puerto 3128 SQUID
$IPTABLES -A INPUT -s $LAN_IP_RANGE_1 -p tcp -m state --state NEW --dport 3128 -j ACCEPT
# Permitimos conexiones de entrada al puerto 137 y 139 tcp SAMBA
$IPTABLES -A INPUT -s $LAN_IP_RANGE_1 -p tcp -m state --state NEW --dport 137 -j ACCEPT
$IPTABLES -A INPUT -s $LAN_IP_RANGE_1 -p tcp -m state --state NEW --dport 139 -j ACCEPT
# Permitimos conexiones de entrada al puerto 53 DNS
$IPTABLES -A INPUT -s $LAN_IP_RANGE_1 -p tcp -m state --state NEW --dport 53 -j ACCEPT
$IPTABLES -A INPUT -s $LAN_IP_RANGE_1 -p udp -m state --state NEW --dport 53 -j ACCEPT
# Permitimos conexiones de entrada al puerto 68 DHCP
$IPTABLES -A INPUT -s $LAN_IP_RANGE_1 -p tcp -m state --state NEW --dport 68 -j ACCEPT
$IPTABLES -A INPUT -s $LAN_IP_RANGE_1 -p udp -m state --state NEW --dport 68 -j ACCEPT
# Permitimos conexiones de entrada al puerto 123 NTPD
$IPTABLES -A INPUT -s $LAN_IP_RANGE_1 -p tcp -m state --state NEW --dport 123 -j ACCEPT
$IPTABLES -A INPUT -s $LAN_IP_RANGE_1 -p udp -m state --state NEW --dport 123 -j ACCEPT
# Permitimos conexiones de entrada al puerto 4662 tcp, 4665, 4672 y 5674 udp aMule
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 4662 -j ACCEPT
$IPTABLES -A INPUT -p udp -m state --state NEW --dport 4665 -j ACCEPT
$IPTABLES -A INPUT -p udp -m state --state NEW --dport 4672 -j ACCEPT
$IPTABLES -A INPUT -p udp -m state --state NEW --dport 5674 -j ACCEPT
# Soluciona el problema de Low ID en aMule
#$IPTABLES -A INPUT -p tcp --dport 4662 --syn -m limit --limit 1/s --limit-burst 4 -j ACCEPT
# Permitimos conexiones de entrada al puerto 6881 tcp y udp, 6886 tcp Azureus
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 59250 -j ACCEPT
$IPTABLES -A INPUT -p udp -m state --state NEW --dport 59250 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 6886 -j ACCEPT
# DHT Firewalled (soluciona este mansaje en Azureus)
# DHT IP address dht.aelitis.com Port 6882 (Tools/Options/Plugins/Distribute DB)
# http://www.azureuswiki.com/index.php/Firewalling
$IPTABLES -I INPUT 1 -i $INET_IFACE -p tcp --tcp-flags SYN,RST,ACK SYN --dport 6882 -m state --state NEW -j ACCEPT
$IPTABLES -I INPUT 1 -i $INET_IFACE -p udp --dport 6882 -m state --state NEW -j ACCEPT
#
#
# ----------------------------------------------------------------------------------------------
#
#
## Reglas FORWARD (renvio de paquetes) (PILAS! AFECTA A LA LAN)
#
#
$IPTABLES -A FORWARD -i $LAN_IFACE_1 -s $LAN_IP_RANGE_1 -m state --state ESTABLISHED,RELATED -j ACCEPT
#$IPTABLES -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
#$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "
# Permito conexion a puerto 80 http
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 80 -j ACCEPT
# Permito conexion a puerto 443 https
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 443 -j ACCEPT
# Permito conexion a puerto 25 SMTP
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 25 -j ACCEPT
# Permito conexion a puerto 110 POP3
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 110 -j ACCEPT
# Permito conexion a puerto 20 y 21 FTP
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 20:21 -j ACCEPT
# Permito conexion a puerto 995 POP3 GMAIL
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 995 -j ACCEPT
# Permito conexion a puerto 587 SMTP GMAIL
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 587 -j ACCEPT
# Permito conexion a puerto 2095 WebMail
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 2095 -j ACCEPT
# Permito conexion a puerto 8080 Correo Remoto E.P.M
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 8080 -j ACCEPT
# Permito conexion a puerto 2082 CPanel
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 2082 -j ACCEPT
# Permito conexion a puerto 6667 IRC
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 6667 -j ACCEPT
# Permito conexion a puerto 4500 mIRC
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 45000 -j ACCEPT
# Permito conexion a puerto 5900 VNC
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 5900 -j ACCEPT
# Permito conexion a puerto 1720 GnomeMeeting, Ekiga y NetMeeting
$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 1720 -j ACCEPT
#
#
## MENSAJERIA INSTANTANEA
# Permito conexion a AOL
#$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 9898 -j ACCEPT
# Permito conexion a ICQ
#$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 5190:5193 -j ACCEPT
# Permito conexion a JABBER
#$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 5222:5223 -j ACCEPT
# Permito conexion a YAHOO! MESSENGER
#$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 5000:5010 -j ACCEPT
# Permito conexion a MSN MESSENGER
#$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 1863 -j ACCEPT
# Si se bloquea este puerto intentara salir por el 80, para evitar esto hay que bloquearlo
# en el Squid-Cache con estas dos lineas
# acl msn url_regex -i gateway.dll
# http_access deny msn
#
#
## P2P (Peer-to-peer)
# eMule / Edonkey
#$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p tcp --dport 4661:4662 -j ACCEPT
#$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p udp --dport 4665 -j ACCEPT
#$IPTABLES -A FORWARD -d $INET_IP_RANGE -s $LAN_IP_RANGE_1 -p udp --dport 4672 -j ACCEPT
#
#
# Y denegamos el resto. Si se necesita alguno, ya avisaran
iptables -A FORWARD -s $LAN_IP_RANGE_1 -i $LAN_IFACE_1 -j DROP
#
#
# ----------------------------------------------------------------------------------------------
#
#
## Reglas OUTPUT (salida de paquetes)
#
#
#$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
# Permitimos salir
# Esta reglas permiten salir del equipo (output) conexiones nuevas que nosotros solicitamos, conexiones establecidas
# y conexiones relacionadas
$IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#
#
## Imprime que inicio el script
echo "FIREWALL STARTING (iptables -L -n)"