FIREWALL BÁSICO

El siguiente es un script muy básico de iptables que puedes usar para proteger un solo
equipo conectado a Internet a través de un modem o de una línea dedicada como adsl (algo
parecido a lo que generalmente utilizamos en nuestra casa). Lo básico no es sinónimo de
inseguro, de hecho este pequeño firewall es un excelente ejemplo de la potencia de iptables,
El firewall de Linux, que con unas cuantas líneas es posible establecer un cortafuegos
bastante seguro y eficaz.
Tan solo copia y pega lo siguiente en cualquier editor, guárdalo con el nombre que gustes,
ejemplo: fw_equipo, después cambia sus permisos para que pueda ser ejecutado:
#> chmod 700 fw_equipo

y después ejecútalo: (tienes que ser root para ejecutarlo)
#> ./fw_equipo

Si no manda errores, listo, tu firewall esta protegiéndote de ataques y de accesos
indeseados.
# -------------------------------------------------------------------------------# www.adminredescauca.net
# firewall para un solo equipo conectado a través de modem o adsl
# por: Servicio Nacional de Aprendizaje SENA
# (1) se eliminan reglas previas que hubiera y cadenas definidas por el
usuario
iptables -F
iptables -X
# (2) se establecen políticas "duras" por defecto, es decir solo lo que
se autorice
# explicitamente podrá ingresar o salir del equipo
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# (3)a la interface lo (localhost) se le permite todo
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# (4) evitamos ataques syn-flood (DOS)limitando el acceso de paquetes
nuevos
# desde internet a solo 4 por segundo y los demas se descartan
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j
DROP
# (5) 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

iptables -A INPUT -m state --state ESTABLISHED. o también -L -n que con esta opción 'n' muestra los puertos en formato numérico: #> iptables -L En el segundo paso (2) establecemos las políticas del firewall. todo. hay dos tipos de políticas ACCEPT y DROP. son por mucho más seguros.ESTABLISHED. conexiones establecidas # y conexiones relacionadas. por eso las eliminamos. Localhost no se conecta de ninguna manera al exterior a la . así que tenemos que ir poniendo reglas que abran los puertos o conexiones que si queramos. iptables -A INPUT -p icmp -j DROP # (7) por ultimo las dos siguientes reglas permiten salir del equipo # (output) conexiones nuevas que nosotros solicitamos. y varios servicios que trabajan de manera local en nuestro equipo como el sistema de ventanas X. en el primer caso.# pero sin ser paquetes syn. pero valen la pena. localhost. se descarta # con esto bloqueamos cualquier tipo de paquetes con protocolo icmp # evitando ataques como el del ping de la muerte. Lo mejor en firewalls es siempre establecer políticas DROP. aunque esta regla # podria provocar problemas de comunicacion con algunos ISP.RELATED -j ACCEPT iptables -A OUTPUT -m state --state NEW. estaríamos aceptando TODO lo que entre y salga del equipo y después se tendría que negar lo que no se quiera.RELATED -j ACCEPT # -------------------------------------------------------------------------------- Explicación El paso (1) hace un Flush (borrado) de las reglas que ya hubiera. Si quieres ver que reglas tienes actualmente en tu firewall usa la opción -L. aunque esta última política en el caso de una PC con una sola tarjeta de red es innecesaria. La desventaja de crear un firewall con políticas DROP es que suelen ser más complejos de crear y mantener. muchas distribuciones se instalan con un juego previo de reglas de iptables que para este caso no nos sirven. hacen uso de este dispositivo para trabajar. asi como la opción X que permite eliminar las cadenas de reglas personalizadas. y deja entrar (input) solo conexiones establecidas # y relacionadas. absolutamente todo es prohibido de entrar o salir. o más bien esta sobrando. definitivamente no nos interesan iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP # (6) todo lo que sea icmp (ping) y que intente entrar. para los paquetes que salen del equipo OUTPUT y para paquetes que atraviesan el equipo FORWARD. con esto por default. El paso (3) es necesario e importante ya que como estamos negando todo por default eso abarca también a nuestro dispositivo de red local o virtual. Se establecen entonces para los paquetes que entran al equipo INPUT. cosa bastante tediosa e insegura.

para un servidor Web por ejemplo. por lo que voy a continuar con la explicación en base a ejemplo únicamente. (5) y (6) podrían parecer redundantes o innecesarios ya que como se observa su target es DROP lo que quiere decir que si el paquete se cumple en alguna de esas tres reglas se descartará. por lo que es relativamente fácil con unas cuantas reglas configurarlo y dejarlo seguro. donde establecemos que pueden salir paquetes nuevas. como comunicaciones de chat y conexiones relacionadas a una establecida (RELATED).0/24) salgan a internet podríamos utilizar el siguiente conjunto de reglas: # iptables -t filter -A INPUT -i lo -j ACCEPT # iptables -t filter -A INPUT -m state --state RELATED. En la regla de INPUT es decir lo que entra al equipo desde Internet solo se permiten paquetes cuyo estado ya este registrado en la tabla de conexiones del kernel.1. solo se aceptará lo que previamente se haya solicitado desde nuestro equipo y que es precisamente la última regla. donde se analiza el estado de los paquetes.ESTABLISHED -j ACCEPT # iptables -t filter -A INPUT -s 192. Rutear paquetes al exterior y frenar paquetes que vengan de internet. sin importar su protocolo. Las dos últimas reglas permitirán el paso de paquetes (tal vez).1. Realmente no sobran. o un equipo Linux con funciones de NAT (que esté ubicado entre una LAN e Internet) tendría que ser un firewall muy distinto al aquí presentado. paquetes previamente establecidos (ESTABLISHED). ya que recordemos que las reglas son checadas contra los paquetes que entran o salen en un orden estrictamente secuencial a como las introducimos. Para mí una de las mejores formas de aprender es en base a los ejemplos. así que lo que hacemos es depurar los paquetes en los pasos (4). etc. Esto implica que ningún paquete que sea nuevo será permitido. Recuerda que este pequeño script es solo para un equipo que no ofrece ningún servicio al exterior.ESTABLISHED -j CCEPT . Finalmente en el paso (7) se permiten un par de reglas que forman un firewall de estado completo. que son paquetes NEW. Los pasos (4). la de OUTPUT. por ejemplo conexiones ftp que establecen conexión de control y de datos en los puertos 20 y 21. como una petición de página web. (5) y (6) para que llegan un poco más controlados a la decisión del paso (7) si son aceptados o no. por lo que es seguro simplemente decirle al firewall que acepte todo de entrada y salida que provenga de localhost.168. al Internet.0/24 -m state --state NEW -j ACCEPT # iptables -t filter -P INPUT DROP # iptables -t filter -A FORWARD -m state --state RELATED. añaden un extra de seguridad al firewall. Suponiendo que queremos denegar todos los paquetes que vengan de internet y permitir que los equipos de mi red LAN (192.168.LAN o Internet. destino.

Paso a describir en detalle qué hace cada regla: Esta regla acepta todos los paquetes que entren por la interfase de red 'lo' (la interfase de red utilizada para comunicación interna del mismo equipo: localhost).0/24 y vayan a una red que no sea 192.0/24 MASQUERADE -j Este conjunto de reglas básicamente deniega toda entrada externa y permite que los paquetes provenientes de la red local pasen a través del firewall e incluso esten dirigidos al firewall mismo.168.168. Esta regla pone la política de la cadena en DROP.1. esta regla acepta los paquetes que son enviados desde la red local hacia otra red (todos los paquetes que no van al firewall). El estado del paquete es determinado por el módulo ``state''.1. Esta regla pone como política de la regla que descarte todos los paquetes que lleguen a esta instancia. Esta regla hace lo mismo que la regla ``2'' pero con la diferencia que deja pasar los paquetes en estado ``relacionado'' o ``establecido'' que tienen como destino final una red detrás del firewall (en este caso sería la red 192.# iptables -t filter -A FORWARD -s 192.1.168. Esta regla se ubica en la tabla de ``nat'' ya que se utiliza para cambiar el encabezado de todos los paquetes que provengan de la red 192.168. Este módulo es muy útil para identificar los paquetes ``de vuelta'' (o sea paquetes que vienen como respuesta a otros originalmente enviados por nosotros).0/24 (o sea internet en este ejemplo). Al igual que la regla ``3''.0/24 sean aceptados. La política de la cadena es la última en ejecutarse (luego de que se evaluaron todas las reglas de la cadena).1. El hecho de utilizar de nuevo el módulo de estado permite que el kernel sólo acepte paquetes que considere como ``nuevos''.1. Básicamente todos los paquetes que salen de las estaciones de trabajo de la red interna y que van a internet. si un paquete llega a esta instancia entonces va a ser descartado. Está ubicada en la cadena de INPUT ya que son paquetes que únicamente pueden estar dirigidos al firewall mismo.0/24 -d \! 192. hay paquetes que se catalogan como inválidos. cuando se utiliza este módulo el kernel va manteniendo una tabla de conexiones que se han establecido en algún sentido (por ejemplo un ftp ejecutado en el firewall para bajar algo de internet). Esta regla permite que todos los paquetes de inicialización de conexión provenientes de la red 192.168.1.168.168.1.0/24). éstos últimos no van a ser aceptados por más que vengan de la red interna. Se utiliza MASQUERADE para que el kernel ponga en el campo ``origen del paquete'' la dirección pública del mismo firewall (la .0/24 -m state --state NEW -j ACCEPT # iptables -t filter -P FORWARD DROP # iptables -t nat -A POSTROUTING -s 192. Esta regla permite que todos los paquetes que estén en estado ``relacionado'' o ``establecido'' y que tengan como destino final el mismo firewall se acepten.

pero igualmente puede ser sumamente útil para firewalls que lo único que hacen es rutear paquetes al exterior y frenar paquetes que vengan de internet. es indispensable en firewalls que tienen una IP pública y dinámica). El ejemplo presentado acá está lejos de estar completo o perfecto (y ni hablar de completamente seguro. Algunos detalles interesantes del ejemplo anterior. evitando que el kernel verifique las subsiguientes reglas de la cadena. La utilización del estado NEW es útil para evitar que paquetes en estado INVALID sean aceptados.que tiene en ese momento. . Por lo tanto se logra mejor performance si se coloca esta regla al inicio de la cadena. ya que eso es algo completamente utópico :-)). La regla número uno de la cadena de FORWARD es la que más se ejecuta ya que por lo general hay muchos más paquetes considerados como ``relacionados'' o ``establecidos'' a los que se consideran ``nuevos'' (estos últimos son sólo aquellos que se envían al inicio de una conexión).