#!/bin/sh # # Firewall-Router con IPTABLES v1.2 # ############################################# # OBSERVACION: # en este firewall muchas cosas estan logeadas con --log-prefix. # Esto es para que una vez en ejecucion, el filtrado muestre # claramente lo que hace cada cosa. # Si os molesta solamente debeis borrar esa parte de las lineas # de filtrado. Si no quereis logear las entradas y/o salidas de # vuestro sistema, solo debeis borrar las lineas pertenecientes # al logging de cada filtrado (estan repetidas, si os fijais hay # una con la entrada de LOG y otra con el filtro). # Para mas informacion podeis dirigiros a la documentacion oficial # de Netfilter: # # -------> Linux 2.4 Packet Filtering HOWTO: # http://netfilter.samba.org/unreliable-guides/packet-filtering-HOWTO/packet-filtering-HOWTO.linuxdoc.html # # -------> Linux 2.4 NAT HOWTO: # http://netfilter.samba.org/unreliable-guides/NAT-HOWTO/NAT-HOWTO.linuxdoc.html # #----------------------------------------------------------------------- # ttyp0 - Marzo 2k2 # # ####################################### # Declaracion de variables############# ####################################### IPTABLES="/usr/sbin/iptables" EXTIP="216.90.123.45" EXTMASK="216.90.123.192/24" EXTIFACE="eth0" OUTADDR="0/0" LOCALIP="192.168.0.99" LOCALMASK="192.168.0.0/24" LOCALIFACE="eth1" GIGABIT="192.168.0.97" LOG_LEVEL="DEBUG" # Variables con direcciones especificas a enrutar EXTLAN1="1.20.41.0/24" EXTLAN2="10.10.0.0/16" EXTLAN3="195.77.75.0/24" WEBSERVER="192.168.0.45" MXSERVER="192.168.0.40" SYSADMIN="192.168.0.151" # Direcciones prohibidas reservadas por la IANA IANA_RESERVED=" 0.0.0.0/8 1.0.0.0/8 2.0.0.0/8 5.0.0.0/8 7.0.0.0/8 23.0.0.0/8 \ 27.0.0.0/8 31.0.0.0/8 36.0.0.0/8 37.0.0.0/8 39.0.0.0/8 \ 41.0.0.0/8 42.0.0.0/8 58.0.0.0/8 59.0.0.0/8 60.0.0.0/8 \ 69.0.0.0/8 70.0.0.0/8 71.0.0.0/8 72.0.0.0/8 73.0.0.0/8 \ 74.0.0.0/8 75.0.0.0/8 76.0.0.0/8 77.0.0.0/8 78.0.0.0/8 \ 79.0.0.0/8 82.0.0.0/8 84.0.0.0/8 85.0.0.0/8 86.0.0.0/8 \ 87.0.0.0/8 88.0.0.0/8 89.0.0.0/8 90.0.0.0/8 91.0.0.0/8 \ 92.0.0.0/8 93.0.0.0/8 94.0.0.0/8 95.0.0.0/8 95.0.0.0/8 \ 96.0.0.0/8 97.0.0.0/8 98.0.0.0/8 99.0.0.0/8 100.0.0.0/8 \ 101.0.0.0/8 102.0.0.0/8 103.0.0.0/8 104.0.0.0/8 105.0.0.0/8 \ 106.0.0.0/8 107.0.0.0/8 108.0.0.0/8 109.0.0.0/8 110.0.0.0/8 \ 111.0.0.0/8 112.0.0.0/8 113.0.0.0/8 114.0.0.0/8 115.0.0.0/8 \ 116.0.0.0/8 117.0.0.0/8 118.0.0.0/8 119.0.0.0/8 120.0.0.0/8 \ 121.0.0.0/8 122.0.0.0/8 123.0.0.0/8 124.0.0.0/8 125.0.0.0/8 \ 126.0.0.0/8 127.0.0.0/8 197.0.0.0/8 201.0.0.0/8 219.0.0.0/8 \ 220.0.0.0/8 221.0.0.0/8 222.0.0.0/8 223.0.0.0/8 240.0.0.0/8 \ 241.0.0.0/8 242.0.0.0/8 243.0.0.0/8 244.0.0.0/8 245.0.0.0/8 \ 246.0.0.0/8 247.0.0.0/8 248.0.0.0/8 249.0.0.0/8 250.0.0.0/8 \ 251.0.0.0/8 252.0.0.0/8 253.0.0.0/8 254.0.0.0/8 255.0.0.0/8" ######################################## # Inicializacion del firewall ########## ######################################## # Flush de las tablas principales $IPTABLES -F INPUT $IPTABLES -F OUTPUT $IPTABLES -F FORWARD # Flush de las tablas de NAT $IPTABLES -t nat -F PREROUTING $IPTABLES -t nat -F POSTROUTING $IPTABLES -t nat -F OUTPUT # Definicion de politicas por defecto (ACCEPT) $IPTABLES -P INPUT ACCEPT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -P FORWARD ACCEPT # Instalacion de los modulos necesarios para el NAT /sbin/modprobe iptable_nat /sbin/modprobe ip_conntrack_ftp /sbin/modprobe ip_conntrack_irc /sbin/modprobe ip_nat_ftp /sbin/modprobe ip_nat_irc ############################################# ### Seccion NAT ############################# ############################################# # Linea para habilitar el Source-NAT o Masquerade # $IPTABLES -t nat -A POSTROUTING -o $EXTIFACE -s $LOCALMASK -j SNAT --to-source $EXTIP echo 1 >/proc/sys/net/ipv4/ip_forward echo 1 >/proc/sys/net/ipv4/conf/all/proxy_arp # Entrada de web y correo, Destination-NAT $IPTABLES -t nat -A PREROUTING -p TCP -i $EXTIFACE --dport 80 -j DNAT --to-destination $WEBSERVER:80 $IPTABLES -t nat -A PREROUTING -p TCP -i $EXTIFACE --dport 25 -j DNAT --to-destination $MXSERVER:25 $IPTABLES -t nat -A PREROUTING -p TCP -i $EXTIFACE --dport 20 -j DNAT --to-destination $WEBSERVER:20 $IPTABLES -t nat -A PREROUTING -p TCP -i $EXTIFACE --dport 21 -j DNAT --to-destination $WEBSERVER:21 ############################################ ############################################ # Seccion de filtrado ###################### ############################################ # Por orden logico, primero aceptamos las cosas concretas, y luego cerramos todo el resto ######################################## ## Conexiones que aceptamos ## a la misma maquina # Entrada de SSH $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport 22 -m limit --limit 5/m -j LOG --log-prefix "SSH Input: " --log-level DEBUG $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport 22 -j ACCEPT # Entrada de FTP (logged) y FTP-DATA $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport 21 -m limit --limit 5/m -j LOG --log-prefix "FTP Input: " --log-level DEBUG $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport 21 -j ACCEPT $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport 20 -j ACCEPT #################################### # Denegacion de todo lo que provenga # de una IP reservada por la IANA for NET in $IANA_RESERVED; do $IPTABLES -A INPUT -s $NET -m limit --limit 5/minute -j LOG --log-level $LOG_LEVEL --log-prefix "IANA reserverd DROP: " $IPTABLES -A INPUT -s $NET -j DROP done ######################################## # Denegacion de todo lo que PROVENGA DE # IP's reservadas para redes privadas # de clase A, B, D y E diferentes de # la nuestra ## Clase A $IPTABLES -A INPUT -s 10.0.0.0/8 -m limit --limit 5/minute -j LOG --log-level $LOG_LEVEL --log-prefix "A reserved DROP: " $IPTABLES -A INPUT -s 10.0.0.0/8 -j DROP ## Clase B $IPTABLES -A INPUT -s 172.26.0.0/16 -m limit --limit 5/minute -j LOG --log-level $LOG_LEVEL --log-prefix "B reserved DROP:" $IPTABLES -A INPUT -s 172.26.0.0/16 -j DROP ## Clase D $IPTABLES -A INPUT -s 224.0.0.0/4 -m limit --limit 5/minute -j LOG --log-level $LOG_LEVEL --log-prefix "D reserved DROP:" $IPTABLES -A INPUT -s 224.0.0.0/4 -j DROP ## Clase E $IPTABLES -A INPUT -s 240.0.0.0/5 -m limit --limit 5/minute -j LOG --log-level $LOG_LEVEL --log-prefix "E reserved DROP:" $IPTABLES -A INPUT -s 240.0.0.0/5 -j DROP ######################################## # Denegacion de todo lo que SE DIRIJA A # IP's reservadas para redes privadas # de clase A, B, D y E diferentes de # la nuestra ## Clase A $IPTABLES -A INPUT -d 10.0.0.0/8 -m limit --limit 5/minute -j LOG --log-level $LOG_LEVEL --log-prefix "A reserved DROP: " $IPTABLES -A INPUT -d 10.0.0.0/8 -j DROP ## Clase B $IPTABLES -A INPUT -d 172.26.0.0/16 -m limit --limit 5/minute -j LOG --log-level $LOG_LEVEL --log-prefix "B reserved DROP:" $IPTABLES -A INPUT -d 172.26.0.0/16 -j DROP ## Clase D $IPTABLES -A INPUT -d 224.0.0.0/4 -m limit --limit 5/minute -j LOG --log-level $LOG_LEVEL --log-prefix "D reserved DROP:" $IPTABLES -A INPUT -d 224.0.0.0/4 -j DROP ## Clase E $IPTABLES -A INPUT -d 240.0.0.0/5 -m limit --limit 5/minute -j LOG --log-level $LOG_LEVEL --log-prefix "E reserved DROP:" $IPTABLES -A INPUT -d 240.0.0.0/5 -j DROP ###################################### # Denegacion de paquetes no destinados # a la red interna $IPTABLES -A OUTPUT -o $LOCALIFACE -d ! $LOCALMASK -m limit --limit 5/minute -j LOG --log-level $LOG_LEVEL --log-prefix "NOT-INTERNAL:" $IPTABLES -A OUTPUT -o $LOCALIFACE -d ! $LOCALMASK -j DROP #################################### # Rechazo de las peticiones de Ident #(para evitar perdidas de tiempo) $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR --dport 113 -j LOG -m limit --limit 5/m --log-prefix "Ident Query REJECT: " --log-level $LOG_LEVEL $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR --dport 113 -j REJECT ############################################ # Lineas de cerrado de puertos privilegiados $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport :1023 -j LOG -m limit --limit 5/m --log-prefix "TCP privileged ports DROP:" --log-level $LOG_LEVEL $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport :1023 -j DROP $IPTABLES -A INPUT -p UDP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport :1023 -j LOG -m limit --limit 5/m --log-prefix "UDP privileged ports DROP:" --log-level $LOG_LEVEL $IPTABLES -A INPUT -p UDP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport :1023 -j DROP ############################ # Cierre del puerto de MySQL $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport 3306 -j LOG -m limit --limit 5/m --log-prefix "MySQL query DROP: " --log-level $LOG_LEVEL $IPTABLES -A INPUT -p TCP -i $EXTIFACE -s $OUTADDR -d $EXTIP --dport 3306 -j DROP ##################################### # Denegacion de entrada de ICMP # de tipo 8 y 13, y salida de # ICMP de tipo 0 y 14 (echo request, # timestamp request, echo reply # y timestamp reply) $IPTABLES -A INPUT -p ICMP --icmp-type echo-request -i $EXTIFACE -j LOG -m limit --limit 5/m --log-prefix "Echo-Request DROP: " --log-level $LOG_LEVEL $IPTABLES -A INPUT -p ICMP --icmp-type timestamp-request -i $EXTIFACE -j LOG -m limit --limit 5/m --log-prefix "Timestamp-Request DROP: " --log-level $LOG_LEVEL $IPTABLES -A INPUT -p ICMP --icmp-type echo-request -i $EXTIFACE -j DROP $IPTABLES -A INPUT -p ICMP --icmp-type timestamp-request -i $EXTIFACE -j DROP $IPTABLES -A INPUT -p ICMP --icmp-type 30 -i $EXTIFACE -j LOG -m limit --limit 5/m --log-prefix "Traceroute DROP: " --log-level $LOG_LEVEL $IPTABLES -A INPUT -p ICMP --icmp-type 30 -i $EXTIFACE -j DROP $IPTABLES -A OUTPUT -p ICMP --icmp-type echo-reply -o $EXTIFACE -j DROP $IPTABLES -A OUTPUT -p ICMP --icmp-type timestamp-reply -o $EXTIFACE -j DROP ################################################ # Denegacion de entrada de paquetes fragmentados $IPTABLES -A INPUT -i $EXTIFACE -f -j DROP ########################################### # Denegacion de establecimiento de conexion # si el paquete que la pide no es SYN $IPTABLES -A INPUT -i $EXTIFACE -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not SYN:" $IPTABLES -A INPUT -i $EXTIFACE -p tcp ! --syn -m state --state NEW -j DROP