Iptables |
| Tutoriales - Unix/Linux | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Describimos algunos de los comandos mas comunes.
Y finalmente, las ACCIONES que estarán siempre al final de cada regla que determinará que hacer con los paquetes afectados. Si no se especifica ninguna acción, se ejecutará la opción por defecto que cada cadena tiene asignada. Las acciones serïan:
La estructura o el esqueleto de una regla basicamente sería:
iptables -t filter -A INPUT -p tcp -dport 23 -j DROP ¿Qué nos dice esta cadena de reglas? Que en la tabla filter, la cadena input filtra los paquetes con protocolo tcp que entran por el puerto 23 (puerto asignado a telnet) y éstos son rechazados (DROP) sin ninguna notificación. Algunas consideraciones. De acuerdo con lo hemos comentado antes, podríamos escribir lo mismo de otra forma,por ej. quitando "-t filter", ya que es la tabla por defecto, además podemos cambiar el número de puerto por"telnet" que en realidad es su puerto asignado. Queda: iptables -A INPUT -p tcp -dport telnet -j DROP Si por el contrario, quisiéramos aceptar estos paquetes: iptables -A INPUT -p tcp -dport telnet -j ACCEPT O aceptamos tráfico http: iptables -A INPUT -p tcp -dport http -j ACCEPT donde también podemos especificar el interfaz de entrada (-i etho) iptables -A INPUT -i eth0 -p tcp -dport http -j ACCEPT también: iptables -A INPUT -p tcp -dport 80 -j ACCEPT Aplicando los conceptos anteriores:
sudo iptables -L se listan las actuales reglas en iptables. Si acabas de instalar un servidor, aun no tendrás normas, así que deberías ver: Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Podemos también permitir sesiones establecidas para recibir el tráfico: sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT Permitir tráfico entrante de puertos específicos Se podría empezar por el bloqueo de tráfico, pero deberías estar trabajando a través de SSH, por lo que necesitas permitir SSH antes de bloquear todo lo demás. Para permitir el tráfico SSH por el puerto por defecto (22), puedes decirle a iptables que permita a todo el tráfico TCP entrante por ese puerto. sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT Refiéndonos a la lista anterior, puedes ver que ésto le dice a iptables: Añadir esta regla a la cadena input (-A INPUT), de manera que nos fijamos en el tráfico Comprueba si el tráfico es TCP (-p tcp). Si lo es, comprueba que la entrada va al puerto SSH (--dport ssh). Si es así, acepta la entrada (-j ACCEPT). Vamos comprobar las reglas: (solo se muestra la primera linea, tu verás más) sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh Ahora, vamos a permitir todo el tráfico entrante sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT Comprobando nuestras reglas, tenemos: sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:www Tenemos permitido específicamente el tráfico tcp en los puertos ssh y web, pero como no tenemos bloqueado nada, todo el tráfico puede aun entrar.
Una vez que se toma la decisión de aceptar un paquete, ninguna regla más le afecta. Como las reglas que permiten el tráfico web y ssh vienen de antes, ya que nuestra regla de bloquear el tráfico viene después, podemos aun aceptar el tráfico que queramos. Todo lo que necesitamos hacer es poner la rela para bloquear todo el tráfico. sudo iptables -A INPUT -j DROP listamos las reglas: sudo iptables -L Y obtenemos Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:www DROP all -- anywhere anywhere Como no hemos especificado un interfaz o protocolo, cualquier tráfico de cualquier puerto en cualquier interfaz está bloqueado, excepto para web y ssh. El único problema con nuestra configuración de lejos es que incluso el puerto loopback está bloqueado. Podríamos haber escrito la regla solo para eth0 especificando -i eth0, pero, pero también podríamos añadir una regla para el loopback. Si se agrega esta regla, esta llegará muy tarde - después de que todo el tráfico sea bloqueado. Necesitamos insertar la regla antes de ésto. Dado que se trata de una gran cantidad de tráfico, la insertaremos como primera regla para que sea procesada en primer lugar sudo iptables -I INPUT 1 -i lo -j ACCEPT Listamos las reglas: sudo iptables -L Y obtenemos Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:www DROP all -- anywhere anywhere La primera y última linea parecen lo mismo, así que listaremos iptables con más detalle con la opción -v. sudo iptables -L -v Y obtenemos Chain INPUT (policy ALLOW 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo any anywhere anywhere 0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:www 0 0 DROP all -- any any anywhere anywhere Ahora puedes ver más información. Esta regla es actualmente muy importante, dado que muchos programas utilizan la interfaz loopback para comunicarse con otras. Si no permites la comunicación, podrías romper esos programas.
El propósito del Enmascaramiento IP (IP Masquerading) es permitir que máquinas con direcciones IP privadas no enrutables de una red accedan a Internet a través de la máquina que realiza el enmascaramiento. Se debe manipular el tráfico que va de su red privada con destino a Internet, para que las respuestas puedan encaminarse adecuadamente a la máquina que hizo la petición. Para ello, el núcleo debe modificar la dirección IP fuente de cada paquete de forma que las respuestas se encaminen hacia ella, en lugar de encaminarla hacia la dirección IP privada que hizo la petición, lo que resulta imposible en Internet. Linux usa Seguimiento de Conexión (Connection Tracking, conntrack) para llevar la cuenta de qué conexiones pertenencen a qué máquinas, y reencaminar adecuadamente cada paquete de retorno. El tráfico que sale de su red privada es, por consiguiente, «enmascarada» dando la sensación de que se ha originado en la máquina Ubuntu que hace de pasarela. Este proceso se denomina Compartición de Conexiones de Internet (Internet Connection Sharing) en la documentación de Microsoft. Esto se puede conseguir con una sóla regla de iptables, que puede variar ligeramente en función de la configuración de su red: sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE La orden anterior supone que su espacio de direcciones privadas es 192.168.0.0/16 y que el dispositivo que conecta con Internet es ppp0. La sintaxis se descompone de la siguiente forma: -t nat -- la regla es para ir a la tabla nat -A POSTROUTING -- la regla es para añadir (-A) a la cadena POSTROUTING -s 192.168.0.0/16 -- la regla se aplica al tráfico originado desde la dirección específica -o ppp0 -- la regla se aplica al tráfico programado para ser enrutado a través del dispositivo de red especificado -j MASQUERADE -- el tráfico que se ajuste a esta regla «saltará» («jump», -j) al destino MASQUERADE para ser manipulado como se describió anteriormente Cada cadena en la tabla de filtrado (la tabla predeterminada, y donde ocurren la mayoría de los filtrados de paquetes) tiene una política predeterminada de ACCEPT, pero si está creando un firewall además de un dispositivo de pasarela, debería establecer las políticas a DROP o REJECT, en cuyo caso necesitará habilitar su tráfico enmascarado a través de la cadena FORWARD para que la regla anterior funcione: sudo iptables -A FORWARD -s 192.168.0.0/16 -o ppp0 -j ACCEPT sudo iptables -A FORWARD -d 192.168.0.0/16 -m state --state ESTABLISHED,RELATED -i ppp0 -j ACCEPT Las órdenes anteriores permitirán todas las conexiones que vayan de su red local a Internet, así como el retorno a la máquina que las inició de todo el tráfico relacionado con esas conexiones. Hay muchas herramientas disponibles que pueden ayudarle a construir un completo firewall sin necesidad de conocer iptables en profundidad. Para los que se inclinan por una solución gráfica, Firestarter es muy popular y fácil de usar, y fwbuilder es muy potente y tiene un aspecto familiar para aquellos administradores que hayan usado herramientas comerciales de firewall como Checkpoint FireWall-1. Si prefiere una utilidad de línea de órdenes con archivos de configuración en texto plano, Shorewall es una solución muy potente para ayudarle a configurar un firewall avanzado para cualquier red. Si su red es relativamente simple, o no dispone de red, ipkungfu le proporcionará un firewall funcional con desde el principio sin necesidad de configuración, y le permitirá crear fácilmente un firewall más avanzado editando archivos de configuración sencillos y bien documentados. Otra herramienta interesante es fireflier, diseñado para ser una aplicación firewall de escritorio. Está formada por un servidor (fireflier-server) y una selección de clientes GUI (GTK o QT), y se comporta de manera muy similar a muchas aplicaciones interactivas de firewall para Windows.
LogsLos registros del firewall son esenciales para reconocer ataques, corregir problemas en las reglas de su firewall, y observar actividades inusuales en su red. Debe incluir reglas de registro en su firewall para poder activarlos, y las reglas de registro deben aparecer antes de cualquier otra regla final aplicable (una regla con un objetivo que decide el destino del paquete, como ACCEPT, DROP o REJECT). Por ejemplo,
|

El kernel Linux incluye el subsistema Netfilter, que es usado para manipular o decidir el destino del tráfico de red entre o a través de su red. Todas las soluciones firewall Linux modernas utilizan este sistema para el filtrado de paquetes. 
