lunes, 11 de agosto de 2008

Cómo configurar un firewall statefull y masquerading en Linux

Cómo configurar un firewall statefull y masquerading en Linux

Este artículo describe como configurar un firewall statefull y masquerading en Linux
Escrito por Werner Puschitz
www.puschitz.com

El Netfilter en el núcleo de Linux es capaz de hacer un seguimiento del paquete de red del estado y el contexto. Esto significa que Netfilter puede distinguir los paquetes asociados con una conexión de paquetes que no lo son. Por ejemplo, si usted se conecta a un servidor web con el navegador, el servidor web responde a su solicitud del navegador y Netfilter sabe que estos los paquetes de red son la respuesta a la solicitud que inició con el navegador. Con esta función puede configurar Netfilter para aceptar solo paquetes de red que forman parte de una conexón o relacionados con la iniciada por usted, e ignorar todos los demás paquetes de red.

Para aceptar los paquetes que forman parte de una conexión se puede definir la siguiente regla:

#iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

La opción '-A' es para anexar, lo que indica que la norma debe agregarse a la cadena INPUT de la tabla filter ( "Input" debe estar en letras mayúsculas).
La cadena INPUT es un punto de filtrado para el manejo de paquetes que están destinados al sistema local donde se establecen estas normas.
Como el filtro “statefull” no esta dentro de iptables definido como tal, es necesario invocar una coincidencia de extensión (match extension).
La opción '-m' le dice a Netfilter que use una coincidencia de extensión. En el ejemplo anterior he invocado el modulo de estado de coincidencia , que se carga automáticamente con la 'm'.
El modulo ipt_state también carga otros módulos del kernel:

# lsmod | grep ip ipt_state
1857 1 ip_conntrack
41369 1 ipt_state iptable_filter
2881 1 ip_tables
19521 2 ipt_state,iptable_filter


Al definir la anterior norma puede notarse que no trabaja para todas las aplicaciones. Por ejemplo, en Modo FTP activo el servidor FTP hace una conexión de retorno al puerto de datos en el lado del cliente (su nodo o cortafuegos).
Se trata de una nueva conexión que tiene que ver con la conexión que haya iniciado por la conexión al puerto 21 en el servidor FTP.
Para instruir a Netfilter a aceptar paquetes que no forman parte de una conexión establecida (ESTABLISHED), sino que forma parte de una conexión relacionada, (RELATED) se puede definir la siguiente regla:

#iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT

En el siguiente ejemplo de statefull firewall voy a crear una cadena llamada "bloque" que se encargará de las cadenas INPUT y FORWARD. La cadena FORWARD maneja los paquetes que se tramitan a través del sistema local. La cadena FORWARD permite a otros nodos de su red local a utilizar el sistema como un cortafuegos y router.

Para crear la cadena "block" , utilice la opción '-N':

#iptables -N block

También puede ser útil borrar siempre todas las reglas antes de establecer un nuevo conjunto de normas.

#iptables -F

Ejemplo

Para resumir lo visto en la introducción, los primeros comandos iptables para la construcción de un cortafuegos de estado se verían de la siguiente manera:

iptables -F
iptables -N block
iptables -A block -m state - state ESTABLISHED, RELATED -j ACCEPT


Hasta el momento hemos especificado que todos los paquetes de red establecidos y los
relacionadas deben pasar el primer filtro o regla.
Para utilizar el sistema como un servidor de seguridad y puerta de enlace para otros servidores en la red local, Netfilter necesita que se le indique aceptar todos los nuevos (NEW) paquetes de red procedentes de la red local. Una manera fácil de hacerlo es aceptar todos los nuevos paquetes de red que no son procedentes de la línea DSL "ppp0", es decir, todos los paquetes de red que provienen de la red local a través de cualquier otra interface deben ser aceptados:

iptables -F
iptables -N block
iptables -A block -m state - state ESTABLISHED, RELATED -j ACCEPT
iptables -A block -m state - state NEW -i !ppp0 -j ACCEPT


Si el módem es de cable conectado a la interfaz "eth0", es necesario sustituir "ppp0" por "eth0". La opción '-i' especifica la nueva interfaz. Dado que el sistema debe ser protegido
de la Internet, esta norma sólo acepta nuevos paquetes de red (-m state - state NEW) que no entran a través de la línea DSL (-i! Ppp0).

Para registrar todos los paquetes de red que no pasan las normas anteriores, Netfilter puede ser configurado para crear registros. En el siguiente ejemplo LOG se conecta al syslogger del kernel:

iptables -F
iptables -N block
iptables -A block -m state - state ESTABLISHED, RELATED -j ACCEPT
iptables -A block -m state - state NEW -i !ppp0 -j ACCEPT
iptables -A block -j LOG


Los registros se pueden encontrar en Red Hat en /var/log/messages y en SUSE en /var/log/firewall, respectivamente.

Para tirar todos los paquetes de red que no pasan las normas que se han definido hasta ahora, el objetivo base "DROP" puede ser especificado. Esto hará que las otras conexiones de red se pierdan. Para enviar paquetes ICMP de error como respuesta, sustituir la base objetivo "DROP" por "REJECT"(rechazar).

iptables –F
iptables -N block
iptables -A block -m state - state ESTABLISHED, RELATED -j ACCEPT
iptables -A block -m state - state NEW -i!pppp0 -j ACCEPT
iptables -A block -j LOG
iptables -A block -j DROP

Ahora sólo tiene que instruir a Netfilter para saltar a la cadena "block" de la cadena INPUT:

iptables –F
iptables -N block
iptables -A block -m state - state ESTABLISHED, RELATED -j ACCEPT
iptables -A block -m state - state NEW -i!pppp0 -j ACCEPT
iptables -A block -j LOG
iptables -A block -j DROP
iptables -A INPUT -j block


Ahora compruebe el estado del cortafuegos y chequear que está trabajando.

Para una lista de las normas, debe ejecutar:
#iptables -L


Dar una dirección IP de acceso al statefull firewall


Para dar a una dirección IP el acceso al firewall del servidor, puede agregar la siguiente regla:


iptables –F
iptables -N block
iptables -A block -m state - state ESTABLISHED, RELATED -j ACCEPT
iptables -A block -m state - state NEW -i !ppp0 -j ACCEPT
iptables -A block -s xx.xx.xx.xx/32 -j ACCEPT
iptables -A block -j LOG
iptables -A block -j DROP
iptables -A INPUT -j block



Stateful Firewall and IP MasqueradingStatefull firewall y enmascaramiento IP

Enmascaramiento IP pueden utilizarse para dar a todos los servidores en una red local el acceso a Internet. Hay una sutil diferencia entre Origen NAT (SNAT) y Masquerading.
SNAT requiere una dirección específica para paquetes específicos, mientras que Masquerading también se puede utilizar con las direcciones fuentes que se les asigna dinámicamente por DHCP. Además, con Masquerading, las conexiones son olvidadas si la interfaz se cae.

Para habilitar el enmascaramiento IP, añada la siguiente norma al statefull Firewall ejemplo:

iptables –F
iptables -N block
iptables -A block -m state - state ESTABLISHED, RELATED -j ACCEPT
iptables -A block -m state - state NEW -i !ppp0 -j ACCEPT
iptables -A block -j LOG
iptables -A block -j DROP
iptables -A INPUT -j block
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE


Esta norma especifica que todos los paquetes que se van a través de "ppp0" deben cambiar la dirección IP de origen a la dirección IP del servidor de cortafuegos.
La cadena POSTROUTING se ocupa de todos los paquetes inmediatamente antes de su salida al firewall del sistema.

.Para habilitar el enmascaramiento IP también tendrá que activar en el kernel mediante el establecimiento de ip_forward a 1.
Puede hacer esto añadiendo la siguiente entrada
en
/etc/sysctl.conf:
net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1


Para tener esta configuración en vigencia inmediatamente, ejecute el comando siguiente:
# sysctl -p

NOTA: Si tiene una línea DSL y hace enmascaramiento, se recomienda añadir la siguiente norma adicional:

iptables –F
iptables -N block
iptables -A block -m state - state ESTABLISHED, RELATED -j ACCEPT
iptables -A block -m state - state NEW -i !ppp0 -j ACCEPT
iptables -A block -j LOG
iptables -A block -j DROP
iptables -A INPUT -j block
iptables -A FORWARD -p tcp –tcp-flags SYN , RST SYN -j TCPMSS - clamp-mss-to-pmtu
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Para obtener más información sobre esta norma, ver: http://en.tldp.org/HOWTO/IP-Masquerade-HOWTO/mtu-issues.html

Referencias
http://www.puschitz.com/FirewallAndRouters.shtml

No hay comentarios: