Netfilter es un framework disponible en el núcleo Linux que permite interceptar y manipular paquetes de red. Dicho framework permite realizar el manejo de paquetes en diferentes estados del procesamiento. Netfilter es también el nombre que recibe el proyecto que se encarga de ofrecer herramientas libres para cortafuegos basados en Linux.
El componente más popular construido sobre Netfilter es iptables, una herramientas de cortafuegos que permite no solamente filtrar paquetes, sino también realizar traducción de direcciones de red (NAT) para IPv4 o mantener registros de log. El proyecto Netfilter no sólo ofrece componentes disponibles como módulos del núcleo sino que también ofrece herramientas de espacio de usuario y librerías.
iptables es el nombre de la herramienta de espacio de usuario mediante la cual el administrador puede definir políticas de filtrado del tráfico que circula por la red. El nombre iptables se utiliza frecuentemente de forma errónea para referirse a toda la infraestructura ofrecida por el proyecto Netfilter. Sin embargo, el proyecto ofrece otros subsistemas independientes de iptables tales como el connection tracking system o sistema de seguimiento de conexiones, o que, que permite encolar paquetes para que sean tratados desde espacio de usuario. iptables es un software disponible en prácticamente todas las distribuciones de Linux actuales.
Bueno ya que hemos revisado la historia de Iptables vamos a ver como funciona
La sintaxis es
Iptables -[tabla] -[comando] -[parametros] -[objetivo]
TABLAS
Hay tres tablas ya incorporadas, cada una de las cuales contiene ciertas cadenas predefinidas. Es posible crear nuevas tablas mediante módulos de extensión. El administrador puede crear y eliminar cadenas definidas por usuarios dentro de cualquier tabla. Inicialmente, todas las cadenas están vacías y tienen una política de destino que permite que todos los paquetes pasen sin ser bloqueados o alterados.
* filter table (Tabla de filtros) — Esta tabla es la responsable del filtrado (es decir, de bloquear o permitir que un paquete continúe su camino). Todos los paquetes pasan a través de la tabla de filtros. Contiene las siguientes cadenas predefinidas y cualquier paquete pasará por una de ellas:
- INPUT chain (Cadena de ENTRADA) — Todos los paquetes destinados a este sistema atraviesan esta cadena (y por esto se la llama algunas veces LOCAL_INPUT o ENTRADA_LOCAL)
- OUTPUT chain (Cadena de SALIDA) — Todos los paquetes creados por este sistema atraviesan esta cadena (a la que también se la conoce como LOCAL_OUTPUT o SALIDA_LOCAL)
- FORWARD chain (Cadena de REDIRECCIÓN) — Todos los paquetes que meramente pasan por este sistema para ser encaminados a su destino recorren esta cadena
* nat table (Tabla de traducción de direcciones de red) — Esta tabla es la responsable de configurar las reglas de reescritura de direcciones o de puertos de los paquetes. El primer paquete en cualquier conexión pasa a través de esta tabla; los veredictos determinan como van a reescribirse todos los paquetes de esa conexión. Contiene las siguientes cadenas redefinidas:
- PREROUTING chain (Cadena de PRERUTEO) — Los paquetes entrantes pasan a través de esta cadena antes de que se consulte la tabla de ruteo local, principalmente para DNAT (destination-NAT o traducción de direcciones de red de destino)
- POSTROUTING chain (Cadena de POSRUTEO) — Los paquetes salientes pasan por esta cadena después de haberse tomado la decisión del ruteo, principalmente para SNAT (source-NAT o traducción de direcciones de red de origen)
- OUTPUT chain (Cadena de SALIDA) — Permite hacer un DNAT limitado en paquetes generados localmente
* mangle table (Tabla de destrozo) — Esta tabla es la responsable de ajustar las opciones de los paquetes, como por ejemplo la calidad de servicio. Todos los paquetes pasan por esta tabla. Debido a que está diseñada para efectos avanzados, contiene todas las cadenas predefinidas posibles:
- PREROUTING chain (Cadena de PRERUTEO) — Todos los paquetes que logran entrar a este sistema, antes de que el ruteo decida si el paquete debe ser reenviado (cadena de REENVÍO) o si tiene destino local (cadena de ENTRADA)
- INPUT chain (Cadena de ENTRADA) — Todos los paquetes destinados para este sistema pasan a través de esta cadena
- FORWARD chain (Cadena de REDIRECCIÓN) — Todos los paquetes que exactamente pasan por este sistema pasan a través de esta cadena
- OUTPUT chain (Cadena de SALIDA) — Todos los paquetes creados en este sistema pasan a través de esta cadena
- POSTROUTING chain (Cadena de POSRUTEO) — Todos los paquetes que abandonan este sistema pasan a través de esta cadena
Además de las cadenas ya incorporadas, el usuario puede crear todas las cadenas definidas por el usuario que quiera dentro de cada tabla, las cuales permiten agrupar las reglas en forma lógica.
Cada cadena contiene una lista de reglas. Cuando un paquete se envía a una cadena, se lo compara, en orden, contra cada regla en la cadena. La regla especifica qué propiedades debe tener el paquete para que la regla coincida, como número de puerto o dirección IP. Si la regla no coincide, el procesamiento continúa con la regla siguiente. Si la regla, por el contrario, coincide con el paquete, las instrucciones de destino de las reglas se siguen (y cualquier otro procesamiento de la cadena normalmente se aborta). Algunas propiedades de los paquetes solo pueden examinarse en ciertas cadenas (por ejemplo, la interfaz de red de salida no es válida en la cadena de ENTRADA). Algunos destinos solo pueden usarse en ciertas cadenas y/o en ciertas tablas (por ejemplo, el destino SNAT solo puede usarse en la cadena de POSRUTEO de la tabla de traducción de direcciones de red).
COMANDOS
-A — añadir una o mas reglas al final de la cadena seleccionada
-D — borra la cadena
-I — inserta una o mas reglas a la cadena
-R — reemplaza la cadena
-L — lista todas las cadenas
-F — limpia todas las cadenas dadas de alta
-Z — pone a ceros los contadores de bytes y paquetes de las cadenas
-N — creamos una nueva cadena
-X — elimina la cadena
-E — cambia el nombre a la cadena
PARAMETROS
-p — protocolo
-s — origen
-d — destino
-j — brincar a
-g — ir a
-i — interfaz interna
-o — interfaz externa
-sport — puerto origen
-dport — puerto destino
OBJETIVO
ACCEPT — aceptar
DROP — desechar
REJECT — rechazar
QUEUE — encolar
RETURN — regresar
A continuación un ejemplo de un script hecho para formar un firewall a nuestra pc
#!/bin/sh ## SCRIPT de IPTABLES – ejemplo del manual de iptables ## Ejemplo de script para proteger la propia máquina echo -n Aplicando Reglas de Firewall… ## FLUSH de reglas iptables -F iptables -X iptables -Z iptables -t nat -F ## Establecemos politica por defecto iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT ## Empezamos a filtrar # El localhost se deja (por ejemplo conexiones locales a mysql) iptables -A INPUT -i lo -j ACCEPT # A nuestra IP le dejamos todo iptables -A INPUT -s 195.65.34.234 -j ACCEPT # A un colega le dejamos entrar al mysql para que mantenga la BBDD iptables -A INPUT -s 231.45.134.23 -p tcp –dport 3306 -j ACCEPT # A un diseñador le dejamos usar el FTP iptables -A INPUT -s 80.37.45.194 -p tcp –dport 20:21 -j ACCEPT # El puerto 80 de www debe estar abierto, es un servidor web. iptables -A INPUT -p tcp –dport 80 -j ACCEPT # Y el resto, lo cerramos iptables -A INPUT -p tcp –dport 20:21 -j DROP iptables -A INPUT -p tcp –dport 3306 -j DROP iptables -A INPUT -p tcp –dport 22 -j DROP iptables -A INPUT -p tcp –dport 10000 -j DROP echo » OK . Verifique que lo que se aplica con: iptables -L -n» # Fin del script