Netfilter
| Netfilter | ||
|---|---|---|
| Informacion general | ||
| Tipo de programa | firewall por Linux (nucleo) | |
| Licencia | GNU General Public License | |
| Informacion tecnica | ||
| Programado en | C | |
| Enlaces | ||
Netfilter (o Proyecto Netfilter) es una comunidad de desarrolladores de software e ingenieros conocidos principalmente por el framework disponible en el nucleo de Linux que permite interceptar y manipular paquetes de red. Dicho framework permite interactuar con paquetes en diferentes etapas del procesamiento dentro del sistema operativo, ofreciendo funcionalidades de cortafuegos y otras utilidades relacionadas. Netfilter es el nombre que recibe el proyecto de comunidad y tambien el conjunto de herramientas software.
Las utilidades o componentes mas populares en el contexto de Netfilter son nftables e iptables, herramientas de cortafuegos que permiten no solamente filtrar paquetes, sino tambien realizar traduccion de direcciones de red (NAT) para IPv4 o mantener registros de log. El proyecto Netfilter no solo ofrece componentes disponibles como modulos del nucleo sino que tambien ofrece herramientas de espacio de usuario y librerias.
La herramienta nftables (e iptables) son las utilidades de espacio de usuario mediante las cuales los administradores pueden definir politicas de filtrado del trafico que circula por la red. El nombre iptables se utiliza frecuentemente de forma erronea 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, que permite encolar paquetes para que sean tratados desde espacio de usuario. iptables es un software disponible en practicamente todas las distribuciones de Linux actuales.
Historia
[editar]El proyecto Netfilter/iptables comenzo en 1998 con Rusty Russell, tambien autor del proyecto que lo precedio, ipchains. A medida que el proyecto fue creciendo, fundo el Netfilter Core Team (o simplemente el coreteam) en 1999, que se trata del grupo de personas que se encarga directamente del desarrollo y mantenimiento del proyecto. El software que ellos produjeron (al que llamaremos netfilter de aqui en adelante) esta disponible en virtud de la licencia GPL (GNU General Public License), y fue incorporado al nucleo Linux 2.3 en marzo de 2000. En agosto de 2003, Harald Welte fue designado lider del coreteam.
Antes de iptables, los programas mas usados para crear cortafuegos en Linux eran ipchains en el nucleo Linux 2.2 e ipfwadm en el nucleo Linux 2.0, que a su vez se basaba en ipfw de BSD. Tanto ipchains como ipfwadm alteran el codigo de red para poder manipular los paquetes, ya que no existia un framework general para el manejo de paquetes hasta la aparicion de netfilter. iptables mantiene la idea basica introducida en Linux con ipfwadm: listas de reglas en las que se determina que campos de la cabecera de un paquete deben ser evaluados y que hacer con ese paquete si los campos de la cabecera coinciden con los criterios de la regla. ipchains agrega el concepto de cadenas de reglas (chains) e iptables extendio esto a la idea de tablas: se consultaba una tabla para decidir si habia que NAT-ear un paquete, y se consultaba otra para decidir como filtrar un paquete. Adicionalmente, se modificaron los tres puntos en los que se realiza el filtrado en el viaje de un paquete, de modo que un paquete pase solo por un punto de filtrado.
Mientras que ipchains e ipfwadm combinan filtrado de paquetes y NAT (especificamente tres tipos de NAT, llamados masquerading o enmascaramiento de IP, port forwarding o redireccionamiento de puertos, y redirection o redireccion), netfilter hace posible por su parte separar las operaciones sobre los paquetes en tres partes: packet filtering (filtrado de paquetes), connection tracking (seguimiento de conexiones) y Network Address Translation (NAT o traduccion de direcciones de red). Cada parte se conecta a las herramientas de netfilter en diferentes puntos para acceder a los paquetes. Los subsistemas de seguimiento de conexiones y NAT son mas generales y poderosos que los que realizaban ipchains e ipfwadm.
Esta division permite a iptables, a su vez, usar la informacion que la capa de seguimiento de conexiones ha determinado acerca del paquete: esta informacion estaba antes asociada a NAT. Esto hace a iptables superior a ipchains, ya que tiene la habilidad de monitorizar el estado de una conexion y redirigir, modificar o detener los paquetes de datos basados en el estado de la conexion y no solamente por el origen, destino o contenido del paquete. Un cortafuegos que utilice iptables de este modo se llama cortafuegos stateful, contrario a ipchains que solo permite crear un cortafuegos stateless (excepto en casos muy limitados). Podemos decir entonces que ipchains no esta al tanto del contexto completo en el cual un paquete surge, mientras que iptables si y por lo tanto iptables puede hacer mejores decisiones sobre el futuro de los paquetes y las conexiones.
iptables, el subsistema NAT y el subsistema de seguimiento de conexiones son tambien extensibles, y muchas extensiones ya estan incluidas en el paquete basico de iptables, tal como la extension ya mencionada que permite la consulta del estado de la conexion. Extensiones adicionales se distribuyen junto a la utilidad iptables, como parches al codigo fuente del nucleo junto con una herramienta llamada patch-o-matic que permite aplicar los parches.
Una version de iptables para IPv6 ya fue escrita, llamada ip6tables al igual que la herramienta de administracion.
Resumen de operacion
[editar]iptables permite al administrador del sistema definir reglas acerca de que hacer con los paquetes de red. Las reglas se agrupan en cadenas: cada cadena es una lista ordenada de reglas. Las cadenas se agrupan en tablas: cada tabla esta asociada con un tipo diferente de procesamiento de paquetes.
Cada regla determina que paquetes coinciden con los criterios establecidos en la regla (match) y un objetivo que indica que hacer con el paquete si este es seleccionado segun los criterios de la regla. Cada paquete de red que llega a una computadora o que se envia desde una computadora recorre por lo menos una cadena y cada regla de esa cadena se comprueba con el paquete. Si la regla cumple con el datagrama, el recorrido se detiene y el destino de la regla dicta lo que se debe hacer con el paquete. Si el paquete alcanza el fin de una cadena predefinida sin haberse correspondido con ninguna regla de la cadena, la politica de destino de la cadena dicta que hacer con el paquete. Si el paquete alcanza el fin de una cadena definida por el usuario sin haber cumplido ninguna regla de la cadena o si la cadena definida por el usuario esta vacia, el recorrido continua en la cadena que hizo la llamada (lo que se denomina implicit target RETURN o RETORNO de destino implicito). Solo las cadenas predefinidas tienen politicas.
En iptables, las reglas se agrupan en cadenas. Una cadena es un conjunto de reglas para paquetes IP, que determinan lo que se debe hacer con ellos. Cada regla puede desechar el paquete de la cadena (cortocircuito), con lo cual otras cadenas no seran consideradas. Una cadena puede contener un enlace a otra cadena: si el paquete pasa a traves de esa cadena entera o si cumple una regla de destino de retorno, va a continuar en la primera cadena. No hay un limite respecto de cuan anidadas pueden estar las cadenas. Hay tres cadenas basicas (INPUT, OUTPUT y FORWARD: ENTRADA, SALIDA y REENVIO) y el usuario puede crear tantas como desee. Una regla puede ser simplemente un puntero a una cadena.
Tablas
[editar]Hay tres tablas ya incorporadas, cada una de las cuales contiene ciertas cadenas predefinidas. Es posible crear nuevas tablas mediante modulos de extension. El administrador puede crear y eliminar cadenas definidas por usuarios dentro de cualquier tabla. Inicialmente, todas las cadenas estan vacias y tienen una politica 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 continue su camino). Todos los paquetes pasan a traves de la tabla de filtros. Contiene las siguientes cadenas predefinidas y cualquier paquete pasara 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 tambien se la conoce como LOCAL_OUTPUT o SALIDA_LOCAL)
- FORWARD chain (Cadena de REDIRECCION) -- Todos los paquetes que meramente pasan por este sistema para ser encaminados a su destino recorren esta cadena
- nat table (Tabla de traduccion 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 conexion pasa a traves de esta tabla; los veredictos determinan como van a reescribirse todos los paquetes de esa conexion. Contiene las siguientes cadenas predefinidas:
- PREROUTING chain (Cadena de PRERUTEO) -- Los paquetes entrantes pasan a traves de esta cadena antes de que se consulte la tabla de ruteo local, principalmente para DNAT (destination-NAT o traduccion de direcciones de red de destino)
- POSTROUTING chain (Cadena de POSRUTEO) -- Los paquetes salientes pasan por esta cadena despues de haberse tomado la decision del ruteo, principalmente para SNAT (source-NAT o traduccion de direcciones de red de origen)
- OUTPUT chain (Cadena de SALIDA) -- Permite hacer un DNAT limitado en paquetes generados localmente
- INPUT chain (Cadena de ENTRADA) -- Permite hacer un DNAT limitado en paquetes destinados al sistema
- 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 esta disenada 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 REDIRECCION) o si tiene destino local (cadena de ENTRADA)
- INPUT chain (Cadena de ENTRADA) -- Todos los paquetes destinados para este sistema pasan a traves de esta cadena
- FORWARD chain (Cadena de REDIRECCION) -- Todos los paquetes que exactamente pasan por este sistema pasan a traves de esta cadena
- OUTPUT chain (Cadena de SALIDA) -- Todos los paquetes creados en este sistema pasan a traves de esta cadena
- POSTROUTING chain (Cadena de POSRUTEO) -- Todos los paquetes que abandonan este sistema pasan a traves de esta cadena
Ademas 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 logica.
Cada cadena contiene una lista de reglas. Cuando un paquete se envia a una cadena, se lo compara, en orden, contra cada regla en la cadena. La regla determina que propiedades debe tener el paquete para que la regla coincida, como numero de puerto o direccion IP. Si la regla no coincide, el procesamiento continua 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 valida 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 traduccion de direcciones de red).
Destinos de reglas
[editar]El destino de una regla puede ser el nombre de una cadena definida por el usuario o uno de los destinos ya incorporados ACCEPT, DROP, QUEUE, o RETURN (aceptar, descartar, encolar o retornar, respectivamente). Cuando un destino es el nombre de una cadena definida por el usuario, al paquete se lo dirige a esa cadena para que sea procesado (tal como ocurre con una llamada a una subrutina en un lenguaje de programacion). Si el paquete consigue atravesar la cadena definida por el usuario sin que ninguna de las reglas de esa cadena actue sobre el, el procesamiento del paquete continua donde habia quedado en la cadena actual. Estas llamadas entre cadenas se pueden anidar hasta cualquier nivel deseado.
Existen los siguientes destinos ya incorporados:
- ACCEPT (aceptar)
- Este destino hace que netfilter acepte el paquete. El significado de esto depende de cual sea la cadena realizando esta aceptacion. Un paquete que se acepta en la cadena de ENTRADA se le permite ser recibido por el sistema (host), un paquete que se acepta en la cadena de SALIDA se le permite abandonar el sistema y un paquete que se acepta en la cadena de REDIRECCION se le permite ser encaminado (routing) a traves del sistema.
- DROP (descartar)
- Este destino hace que netfilter descarte el paquete sin ningun otro tipo de procesamiento. El paquete simplemente desaparece sin ningun tipo de indicacion al sistema o aplicacion de origen, de que fue descartado en el sistema de destino. Esto se refleja en el sistema que envia el paquete a menudo, como un communication timeout (alcance del maximo tiempo de espera en la comunicacion), lo que puede causar confusion, aunque el descarte de paquetes entrantes no deseados se considera a veces una buena politica de seguridad, pues no da ni siquiera el indicio a un posible atacante de que el sistema destino existe.
- QUEUE (encolar)
- Este destino hace que el paquete sea enviado a una cola en el espacio de usuario. Una aplicacion puede usar la biblioteca libipq, tambien parte del proyecto netfilter/iptables, para alterar el paquete. Si no hay ninguna aplicacion que lea la cola, este destino es equivalente a DROP.
- RETURN (retorno)
- Hace que el paquete en cuestion deje de circular por la cadena en cuya regla se ejecuto el destino RETURN. Si dicha cadena es una subcadena de otra, el paquete continuara por la cadena superior como si nada hubiera pasado. Si por el contrario la cadena es una cadena principal (por ejemplo la cadena INPUT), al paquete se le aplicara la politica por defecto de la cadena en cuestion (ACCEPT, DROP o similar).
Hay muchos destinos de extension disponibles. Algunos de los mas comunes son:
- REJECT (rechazo)
- Este destino tiene el mismo efecto que 'DROP', salvo que envia un paquete de error a quien envio originalmente. Se usa principalmente en las cadenas de ENTRADA y de REDIRECCION de la tabla de filtrado. El tipo de paquete se puede controlar a traves del parametro '--reject-with'. Un paquete de rechazo puede indicar explicitamente que la conexion ha sido filtrada (un paquete ICMP filtrado administrativamente por conexion), aunque la mayoria de los usuarios prefieren que el paquete indique simplemente que la computadora no acepta ese tipo de conexion (tal paquete sera un paquete tcp-reset para conexiones TCP denegadas, un icmp-port-unreachable para sesiones UDP denegadas o un icmp-protocol-unreachable para paquetes no TCP y no UDP). Si no se agrega el parametro '--reject-with', el paquete de rechazo por defecto es siempre icmp-port-unreachable.
- LOG (bitacora)
- Este destino lleva un log o bitacora del paquete. Puede usarse en cualquier cadena en cualquier tabla, y muchas veces se usa para debuggear (analisis de fallos, como ser la verificacion de que paquetes estan siendo descartados).
- ULOG
- Este destino lleva un log o bitacora del paquete, pero no de la misma manera que el destino LOG. El destino LOG le envia informacion al log del nucleo, pero ULOG hace multidifusion de los paquetes que coincidan con esta regla a traves de un socket netlink, de manera que programas del espacio de usuario puedan recibir este paquete conectandose al socket.
- DNAT
- Este destino hace que la direccion (y opcionalmente el puerto) de destino del paquete sean reescritos para traduccion de direccion de red. Mediante la opcion '--to-destination' debe indicarse el destino a usar. Esto es valido solamente en las cadenas de SALIDA y PRERUTEO dentro de la tabla de nat. Esta decision se recuerda para todos los paquetes futuros que pertenecen a la misma conexion y las respuestas tendran su direccion y puerto de origen cambiados al original (es decir, la inversa de este paquete).
- SNAT
- Este destino hace que la direccion (y opcionalmente el puerto) de origen del paquete sean reescritos para traduccion de direccion de red. Mediante la opcion '--to-source' debe indicarse el origen a usar. Esto es valido solamente en la cadena de POSRUTEO dentro de la tabla de nat y, como DNAT, se recuerda para todos los paquetes que pertenecen a la misma conexion.
- MASQUERADE
- Esta es una forma especial, restringida de SNAT para direcciones IP dinamicas, como las que proveen la mayoria de los proveedores de servicios de Internet (ISPs) para modems o linea de abonado digital (DSL). En vez de cambiar la regla de SNAT cada vez que la direccion IP cambia, se calcula la direccion IP de origen a la cual hacer NAT fijandose en la direccion IP de la interfaz de salida cuando un paquete coincide con esta regla. Adicionalmente, recuerda cuales conexiones usan MASQUERADE y si la direccion de la interfaz cambia (por ejemplo, por reconectarse al ISP), todas las conexiones que hacen NAT a la direccion vieja se olvidan.
Diagramas
[editar]Los siguientes diagramas pueden resultar de utilidad para entender mejor como es que un paquete recorre las tablas y cadenas del nucleo de netfilter:
- https://commons.wikimedia.org/wiki/File:Diagrama_linux_netfilter_iptables.png
- https://commons.wikimedia.org/wiki/File:Netfilter-packet-flow.svg
- http://www.shorewall.net/images/Netfilter.png
- https://archive.today/20130103103429/dmiessler.com/images/DM_NF.PNG
Seguimiento de conexiones
[editar]Una de las caracteristicas de importancia que esta construida por encima del framework de netfilter es el seguimiento de conexiones (connection tracking). El seguimiento de conexiones le permite al nucleo llevar cuenta de todas las conexiones o sesiones logicas de red y de este modo relacionar todos los paquetes que pueden llegar a formar parte de esa conexion. La traduccion de direccion de red (NAT) depende de esta informacion para traducir todos los paquetes relacionados de la misma manera e iptables puede usar esta informacion para actuar como un cortafuegos stateful.
El seguimiento de conexiones clasifica cada paquete en uno de cuatro estados:
- NEW (nuevo)
- Intentando crear una conexion nueva.
- ESTABLISHED (establecido)
- Parte de una conexion ya existente.
- RELATED (relacionado)
- Relacionada, aunque no realmente parte de una conexion existente.
- INVALID (invalido)
- No es parte de una conexion existente e incapaz de crear una conexion nueva.
Un caso comun seria que el primer paquete que el cortafuegos ve se clasificara como NEW, la respuesta se clasificara como ESTABLISHED y un error ICMP seria RELATED. Un paquete de error ICMP que no coincide con una conexion conocida sera INVALID.
El estado de la conexion es completamente independiente de cualquier estado de TCP. Si la terminal (host) responde con un paquete SYN ACK para senalar una conexion TCP entrante nueva, la conexion TCP misma no se establece, pero la conexion a la que se le hace el seguimiento si se establece. Este paquete 'coincidira el estado ESTABLISHED.
Sin embargo, una conexion a la que se le hace el seguimiento de un protocolo sin estado como UDP tiene un estado de conexion.
Es mas, mediante el uso de modulo que pueden agregarse, al seguimiento de conexion se le puede dar conocimiento de los protocolos de la capa de aplicacion y asi que entienda que dos o mas conexiones distintas estan "relacionadas". Por ejemplo, considerese el protocolo FTP. Se establece una conexion de control, pero cada vez que se transfiere informacion, se establece otra conexion para que la transfiera. Si se carga el modulo nf_conntrack_ftp, el primer paquete de una conexion de datos FTP se clasificara como RELATED en lugar de NEW, ya que logicamente es parte de una conexion existente.
iptables puede usar la informacion del seguimiento de conexiones para conseguir hacer reglas de filtrado de paquetes mas potentes y mas faciles de manejar. La extension de "estado" le permite a las reglas de iptables que examinen la clasificacion de seguimiento de conexion para un paquete. Por ejemplo, una regla puede permitir el paso solo a paquetes NEW desde dentro del cortafuegos hacia afuera, pero permitir paquetes RELATED y ESTABLISHED en ambas direcciones. Esto permite el paso de paquetes de respuesta normales desde el exterior (ESTABLISHED), pero no permite que lleguen conexiones nuevas desde el exterior al interior. Sin embargo, si una conexion de datos FTP necesita llegar desde el exterior del cortafuegos hacia el interior, sera permitido, porque el paquete se clasificara correctamente como RELATED para la conexion de control FTP, en vez de NEW.
iptables
[editar]iptables es una aplicacion en espacio de usuario que le permite a un administrador de sistema configurar las tablas, cadenas y reglas de netfilter (descritas mas arriba). Debido a que iptables requiere privilegios elevados para operar, el unico que puede ejecutarlo es el superusuario. En la mayoria de los sistemas Linux, iptables esta instalado como /sbin/iptables. La sintaxis detallada del comando iptables esta documentada en su pagina de man, la cual puede verse tecleando el comando "man iptables" desde la linea de comandos.
Opciones comunes
[editar]En cada una de las formas de invocacion de iptables que se muestra a continuacion, las siguientes opciones comunes estan disponibles:
- -t tabla
- Hace que el comando se aplique a la tabla especificada. Si esta opcion se omite, el comando se aplica a la tabla filter por defecto.
- -v
- Produce una salida con detalles (del ingles, verbose).
- -n
- Produce una salida numerica (es decir, numeros de puerto en lugar de nombres de servicio y direcciones IP en lugar de nombres de dominio).
- --line-numbers
- Cuando se listan reglas, agrega numeros de linea al comienzo de cada regla, correspondientes a la posicion de esa regla en su cadena.
Especificaciones de las reglas
[editar]La mayoria de las formas de comandos de iptables requieren que se les indiquen una especificacion de reglas, que es usada para comparar un subconjunto particular del trafico de paquetes de red procesados por una cadena. La especificacion de regla incluye tambien un destino que determina que hacer con paquetes que son comparados por la regla. Las siguientes opciones se usan (frecuentemente combinadas unas con otras) para crear especificaciones de reglas.
- -j destino
- --jump destino
- Determina el destino de una regla. El destino es el nombre de una cadena definida por el usuario (creada usando la opcion -N, uno de los destinos ya incorporados, ACCEPT, DROP, QUEUE, o RETURN, o un destino de extension, como REJECT, LOG, DNAT, o SNAT. Si esta opcion es omitida en una regla, entonces el comparado de la regla no tendra efecto en el destino de un paquete, pero los contadores en la regla se incrementaran.
- -i [!] in-interface
- --in-interface [!] in-interface
- Nombre de una interfaz a traves de la cual un paquete va a ser recibido (solo para paquetes entrando en las cadenas de INPUT, FORWARD y PREROUTING). Cuando se usa el argumento '!' antes del nombre de la interfaz, el significado se invierte. Si el nombre de la interfaz termina con '+', entonces cualquier interfaz que comience con este nombre sera comparada. Si esta opcion se omite, se comparara todo nombre de interfaz.
- -o [!] out-interface
- --out-interface [!] out-interface
- Nombre de una interfaz a traves de la cual un paquete va a ser enviado (para paquetes entrando en las cadenas de FORWARD, OUTPUT y POSTROUTING). Cuando se usa el argumento '!' antes del nombre de la interfaz, el significado se invierte. Si el nombre de la interfaz termina con '+', entonces cualquier interfaz que comience con este nombre sera comparada. Si esta opcion se omite, se comparara todo nombre de interfaz.
- -p [!] protocol
- --protocol [!] protocol
- Compara paquetes del nombre de protocolo especificado. Si '!' precede el nombre de protocolo, se comparan todos los paquetes que no son el protocolo especificado. Nombres de protocolo validos son icmp, udp, tcp... Una lista de todos los protocolos validos puede encontrarse en el archivo /etc/protocols.
- -s [!] origen[/prefijo]
- --source [!] origen[/prefijo]
- Compara paquetes IP viniendo de la direccion de origen especificada. La direccion de origen puede ser una direccion IP, una direccion IP con un prefijo de red asociado, o un nombre de terminal (hostname). Si '!' precede al origen, se comparan todos los paquetes que no vienen del origen especificado.
- -d [!] destino[/prefijo]
- --destination [!] destino[/prefijo]
- Compara paquetes IP yendo a la direccion de destino especificada. La direccion de destino puede ser una direccion IP, una direccion IP con un prefijo de red asociado, o un nombre de terminal (hostname). Si '!' precede al origen, se seleccionan todos los paquetes que no van al destino especificado.
- --destination-port [!] [puerto[[:puerto]]
- --dport [!] [puerto[[:puerto]]
- aplica a paquetes TCP o UDP (dependiendo del argumento a la opcion -p) destinados a los puertos o rango de puertos (cuando se usa la forma puerto:puerto) especificados. Si '!' precede la especificacion de puertos, coinciden todos los paquetes TCP o UDP que no estan destinados a los puertos o rango de puertos especificados.
- --source-port [!] [puerto[[:puerto]]
- --sport [!] [puerto[[:puerto]]
- Selecciona paquetes TCP o UDP (dependiendo del argumento a la opcion -p) que vienen de los puertos o rango de puertos (cuando se usa la forma puerto:puerto) especificados. Si '!' precede la especificacion de puertos, se seleccionan todos los paquetes TCP o UDP que no vienen de los puertos o rango de puertos especificados.
- --tcp-flags [!] mask comp
- Selecciona paquetes TCP que tienen marcadas o desmarcadas ciertas banderas del protocolo TCP. El primer argumento determina las banderas a examinar en cada paquete TCP, escritas en una lista separada por comas (no se permiten espacios). El segundo argumento es otra lista separada por comas de banderas que deben estar marcadas dentro de las que se debe examinar. Estas banderas son: SYN, ACK, FIN, RST, URG, PSH, ALL, y NONE. Por lo tanto, la opcion "--tcp-flags SYN, ACK, FIN, RST SYN" solo va a aplicarse a paquetes con la bandera SYN marcada y las banderas ACK, FIN y RST desmarcadas.
- [!] --syn
- Aplica a paquetes TCP que tienen la bandera SYN marcada y las banderas ACK, FIN y RST desmarcadas. Estos paquetes son los que se usan para iniciar conexiones TCP. Al bloquear tales paquetes en la cadena de INPUT, se previenen conexiones TCP entrantes, pero conexiones TCP salientes no seran afectadas. Esta opcion puede combinarse con otras, como --source, para bloquear o dejar pasar conexiones TCP entrantes solo de ciertas terminales o redes. Esta opcion es equivalente a "--tcp-flags SYN, RST, ACK SYN". Si '!' precede a --syn, el significado de la opcion se invierte.
Invocacion
[editar]El comando iptables tiene las siguientes formas de invocacion. Items entre llaves, {...|...|...}, son requeridos, pero solo se puede indicar uno de los items separados por '|'. Items entre corchetes, [...], son opcionales.
iptables { -A | --append | -D | --delete } cadena especificacion-de-regla [ opciones ]Esta forma de invocacion del comando agrega (-A o --append) o elimina (-D o --delete) una regla de la cadena especificada. Por ejemplo, para agregar una regla a la cadena de INPUT en la tabla filter (la tabla por defecto cuando la opcion -t no se incluye) que descarte todos los paquetes UDP, usamos este comando:
- iptables -A INPUT -p udp -j DROP
Para borrar la regla agregada por el comando anterior, usamos este comando:
- iptables -D INPUT -p udp -j DROP
El comando anterior borra en verdad la primera regla de la cadena de INPUT que coincida con la especificacion de regla "-p udp -j DROP". Si hay varias reglas identicas en la cadena, solo se borra la primera regla que concuerde.
iptables { -R | --replace | -I | --insert } cadena numregla especificacion-de-regla [ opciones ]Esta forma de invocacion del comando reemplaza (-R o --replace) una regla existente o inserta (-I o --insert) una regla nueva en la cadena especificada. De hecho, para reemplazar la cuarta regla en la cadena de INPUT por una regla que descarte todos los paquetes ICMP, usamos este comando:
- iptables -R INPUT 4 -p icmp -j DROP
Para insertar una regla nueva en el segundo lugar de la cadena de OUTPUT que descarte todo el trafico TCP dirigido al puerto 80 en cualquier terminal, usamos este comando:
- iptables -I OUTPUT 2 -p tcp --dport 80 -j DROP
Esta forma de invocacion del comando elimina una regla del indice numerico especificado en la cadena especificada. Las reglas se numeran comenzando desde 1. Por ejemplo, para eliminar la tercera regla de la cadena FORWARD, usamos este comando:
- iptables -D FORWARD 3
Esta forma de invocacion del comando se usa para listar las reglas en una cadena (-L o --list), tirar (es decir, eliminar) todas las reglas de una cadena (-F o --flush), o para poner en cero el byte y los contadores de paquetes de una cadena (-Z o --zero). Si no se define ninguna cadena, la operacion se realiza para todas las cadenas. Por ejemplo, para listar las reglas en la cadena de OUTPUT, usamos este comando:
- iptables -L OUTPUT
Para tirar todas las cadenas, usamos este comando:
- iptables -F
Para poner en cero el byte y los contadores de paquetes de la cadena de PREROUTING en la tabla nat, usamos este comando:
- iptables -t nat -Z PREROUTING
iptables { -X | --delete-chain } [ cadena ]
Esta forma de invocacion del comando se usa para crear (-N o --new-chain) una cadena definida por el usuario nueva o para eliminar (-X o --delete-chain) una cadena definida por el usuario existente. Si no se define ninguna cadena con las opciones -X o --delete-chain, se eliminan todas las cadenas definidas por el usuario. No es posible eliminar cadenas ya incorporadas, como ser las cadenas de INPUT o OUTPUT en la tabla filter.
iptables { -P | --policy } cadena destinoEsta forma de invocacion del comando se usa para especificar la politica de destino para una cadena. De hecho, para especificar la politica de destino para la cadena de INPUT en DROP, usamos este comando:
- iptables -P INPUT DROP
Esta forma de invocacion del comando se usa para renombrar una cadena definida por el usuario.
Ejemplos
[editar]Estos son ejemplos de uso cotidiano en algun Firewall o cortafuegos.
Firewall con iptables
[editar]Para generar este script con iptables, se deben seguir los siguientes pasos:
- Se crea un archivo de texto con un editor de texto plano cualquiera, como vi, emacs o nano, entre muchisimos otros. A este archivo se lo llama, por ejemplo, iptables_ipt
- Se le da permiso de ejecucion mediante el comando chmod u+x o tambien chmod 700 iptables_ipt.
- Se ejecuta desde la linea de comandos ./iptables_ipt
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate NEW ! -i eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A FORWARD -i eth1 -o eth1 -j REJECT
iptables -P INPUT DROP
iptables -P FORWARD DROP
echo "Firewall Activado"
Para este ejemplo, eth0 es la puerta local, y eth1 es la puerta de enlace a Internet. Puede ademas agregarse bloqueo de puertos especificos, como por ejemplo:
iptables -A INPUT -p tcp --dport 25 -j DROP # smtp filtrado# Corroboramos con nmap los puertos y nos dira algo parecido
$sudo nmap -sT "nuestra IP"
* 22/tcp filtered ssh *
* 25/tcp filtered smtp *
Filtrado de puertos
[editar]Para filtrar un puerto especifico, como el 22 o 443, el codigo recomendable seria el siguiente:
sudo iptables -t filter -I INPUT -p tcp --dport 22 -j DROPsudo iptables -t filter -I INPUT -p tcp --dport 443 -j DROP
Ejemplos de reglas comunes
[editar]Transformar en enrutador
echo 1 > /proc/sys/net/ipv4/ip_forwardRe-enviar trafico dirigido hacia al puerto 80/tcp hacia el puerto 3128/tcp - proxy transparente Proxy#Proxies transparentes
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128NOTA: Recuerde configurar la opcion respectiva en el proxy-cache para interceptar los paquetes re-enviados hacia el puerto 3128/tcp del proxy por iptables
Permitir el paso del trafico hacia el puerto 443/tcp a traves del enrutador Linux
iptables -A INPUT -i eth0 -s 192.168.0.0/24 -p tcp --dport 443 --sport 1024:65535 --dport 443 -m state --state NEW -j ACCEPTiptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -d 0/0 -p tcp --dport 443 --sport 1024:65535 -m state --state NEW -j ACCEPT
iptables -A FORWARD -o eth0 -i eth1 -s 0/0 -d 192.168.0.0/24 -p tcp --sport 443 --dport 1024:65535 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp --dport 443 --sport 1024:65535 -m state --state NEW -j ACCEPT
Vaciado de Reglas
iptables -t filter -Fiptables -t nat -F
iptables -t mangle -F
iptables -t raw -F
Contadores a cero
iptables -t filter -Ziptables -t nat -Z
iptables -t mangle -Z
iptables -t raw -Z
Politica por defecto Aceptar todo el trafico
iptables -P INPUT ACCEPTiptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
Politica por defecto Descartar todo el trafico
iptables -P INPUT DROPiptables -P OUTPUT DROP
iptables -P FORWARD DROP
Aceptar trafico de sesiones nuevas
iptables -A INPUT -i eth0 -d 192.168.0.1 -s 192.168.0.18 -p tcp --dport 22 --sport 1024:65535 -m state --state NEW -j ACCEPTiptables -A INPUT -i eth0 -d 192.168.0.1 -s 192.168.0.18 -p tcp --dport 80 --sport 1024:65535 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eth0 -d 192.168.0.1 -s 192.168.0.18 -p tcp --dport 443 --sport 1024:65535 -m state --state NEW -j ACCEPT
Aceptar trafico de sesiones establecidas o trafico relacionado con las sesiones establecidas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Hacer NAT
iptables -t nat -A POSTROUTING -s {RED ORIGEN} -d 0/0 -j MASQUERADEEnlaces externos
[editar]- Wikimedia Commons alberga una categoria multimedia sobre Netfilter.
- (en ingles) Pagina oficial del proyecto Netfilter/iptables
- Link al tema en ingles
- Frontends (opcionales):
- https://web.archive.org/web/20200105122514/http://shorewall.net/ - Shorewall
- http://firehol.sourceforge.net/ - FireHOL
- https://web.archive.org/web/20081210035025/http://www.fwbuilder.org/ - Firewall Builder (GUI)
- https://web.archive.org/web/20070702000654/http://www.fs-security.com/ - Firestarter (GUI)
- http://dag.wieers.com/home-made/dwall/ - Dwall
- http://www.solsoft.com/netfilterone - NetfilterOne (GUI)
- http://kmyfirewall.sourceforge.net/ - KMyFirewall (GUI)
- http://www.simonzone.com/software/guarddog/ - Guarddog (GUI)
- https://web.archive.org/web/20100110055458/http://weblog.tinixtech.com.ar/ - Programming Iptables.
- https://web.archive.org/web/20150922101343/http://www.hacktimes.com/detecci_n_control_y_contenci_n_de_tr_fico_innecesa/ - Deteccion, control y contencion de trafico innecesario con Iptables
- http://www.tutorial-es.com/seguridad/sistema/39-seguridad-con-reglas-iptables-firewall (enlace roto disponible en Internet Archive; vease el historial, la primera version y la ultima). - Seguridad con reglas Iptables
- http://fedoraproject.org/wiki/SystemConfig/firewall - Systems config firewall incluido con Fedora y RedHat Enterprise Linux
- http://es.tldp.org/Manuales-LuCAS/doc-iptables-firewall/doc-iptables-firewall.pdf - Manual iptables con ejemplos