#!/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 -m state --state NEW --dport 20 -j ACCEPT $IPTABLES -A INPUT -p tcp -m state --state NEW --dport 21 -j ACCEPT # 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)"