Las reglas que permiten a los paquetes ser filtrados por el kernel se ponen en funcionamiento ejecutando el comando iptables. Cuando use el comando iptables, debe especificar las opciones siguientes:
Packet Type — Dicta qué tipo de paquetes filtra el comando.
Packet Source/Destination — Dicta qué paquetes filtra el comando basándose en el origen o destino del paquete.
Target — Indica qué acción es tomada en paquetes que cumplen los criterios mencionados anteriormente.
Las opciones usadas con la regla dada iptables deben estar agrupadas lógicamente, basándose en el propósito y en las condiciones de la regla general, para que la regla sea válida.
Un aspecto muy potente de iptables es que se pueden utilizar múltiples tablas para decidir el destino de un paquete particular. Gracias a la naturaleza extensible de iptables, se pueden crear tablas especializadas y almacenarlas en el directorio /lib/modules/<kernel-version>/kernel/net/ipv4/netfilter/, donde <kernel-version> corresponde al número de la versión del kernel.
La tabla por defecto, llamada filter, contiene las cadenas estándard por defecto para INPUT, OUTPUT, y FORWARD. Esto es similar a las cadenas estándar que se utilizan con ipchains. Sin embargo, por defecto, iptables también incluye dos tablas adicionales que realizan tareas de filtrado específico de paquetes. La tabla nat se puede utilizar para modificar las direcciones de origen y destino grabadas en un paquete, y la tabla mangle permite alterar los paquetes de forma especializada.
Cada tabla contiene las cadenas por defecto que realizan las tareas necesarias basadas en el propósito de la tabla, aún cuando se pueden añadir nuevas cadenas a cualquier tabla.
Muchos comandos iptables tienen la siguiente estructura:
iptables [-t <table-name>] <command> <chain-name> <parameter-1> \ <option-1> <parameter-n> <option-n> |
En este ejemplo, la opción <table-name> permite al usuario seleccionar una tabla diferente a la tabla predeterminada filter a usar con el comando. La opción <command> indica una acción específica a realizar, tal como anexar o eliminar la regla especificada por la opción <chain-name>. Luego de la opción <chain-name> se encuentran un par de parámetros y opciones que definen qué pasará cuando un paquete coincide con la regla.
Cuando miramos la estructura de un comando iptables, es importante recordar que, al contrario que la mayoría de los comandos, la longitud y complejidad de un comando iptables puede cambiar en función de su propósito. Un comando simple para borrar una regla de una cadena puede ser muy corto, mientras que un comando diseñado para filtrar paquetes de una subred particular usando un conjunto de parámetros específicos y opciones puede ser mucho más largo. Al crear comandos iptables puede ser de ayuda reconocer que algunos parámetros y opciones pueden crear la necesidad de utilizar otros parámetros y opciones para especificar algo de los requisitos de la opción anterior. Para construir una regla válida, esto deberá continuar hasta que todos los parámetros y opciones que requieran otro conjunto de opciones hayan sido satisfechos.
Teclee iptables -h para ver una lista detallada de la estructura de los comandos iptables.
Los comandos le dicen a iptables que realice una tarea específica. Solamente un comando se permite por cada cadena de comandos iptables. Excepto el comando de ayuda, todos los comandos se escriben en mayúsculas.
Los comandos de iptables son los siguientes:
-A — Añade la regla iptables al final de la cadena especificada. Este es el comando utilizado para simplemente añadir una regla cuando el orden de las reglas en la cadena no importa.
-C — Verifica una regla en particular antes de añadirla en la cadena especificada por el usuario. Este comando puede ser de ayuda para construir reglas iptables complejas pidiéndole que introduzca parámetros y opciones adicionales.
-D — Borra una regla de una cadena en particular por número (como el 5 para la quinta regla de una cadena). Puede también teclear la regla entera e iptables borrará la regla en la cadena que corresponda.
-E — Renombra una cadena definida por el usuario. Esto no afecta la estructura de la tabla.
-F — Libera la cadena seleccionada, que borra cada regla de la cadena. Si no se especifica ninguna cadena, este comando libera cada regla de cada cadena,
-h — Proporciona una lista de estructuras de comandos, así como también un resúmen rápido de parámetros de comandos y opciones.
-I — Inserta una regla en una cadena en un punto especificado por un valor entero definido por el usuario. Si no se especifica ningún número, iptables colocará el comando en el tope de la cadena.
![]() | Atención |
---|---|
Tenga cuidado con cúal opción (-A o -I) es usada cuando esté añadiendo una regla. El orden de las reglas en una cadena es importante para determinar cual regla aplica a cuáles paquetes. |
-L — Lista todas las reglas de la cadena especificada tras el comando. Para ver una lista de todas las cadenas en la tabla filter por defecto. La sintaxis siguiente deberá utilizarse para ver todas la listas de todas las reglas de una cadena específica en una tabla en particular:
iptables -L <chain-name> -t <table-name> |
Opciones más potentes para el comando -L, que proporcionan números a las reglas y permiten más descripciones en las reglas, así como otros, se pueden ver en Sección 16.3.7.
-N — Crea una nueva cadena con un nombre especificado por el usuario.
-P — Configura la política por defecto para una cadena en particular de tal forma que cuando los paquetes atraviesen la cadena completa sin cumplir ninguna regla, serán enviados a un objetivo en particular, como puedan ser ACCEPT o DROP.
-R — Reemplaza una regla en una cadena particular. El número de la regla debe ser especificado después del nombre de la cadena. La primera regla en una cadena corresponde a la regla número uno.
-X — Borra una cadena especificada por el usuario. No se permite borrar ninguna de las cadenas predefinidas para cualquier tabla.
-Z — Pone ceros en los contadores de byte y de paquete en todas las cadenas de una tabla en particular.
Una vez que se especifiquen ciertos comandos iptables, incluyendo aquellos para añadir, anexar, eliminar, insertar o reemplazar reglas dentro de una cadena, se requieren parámetros para construir una regla de filtrado de paquetes.
-c Resetea los contadores de una regla en particular. Este parámetro acepta las opciones PKTS y BYTES para especificar qué contador hay que resetear.
-d — Configura el nombre de la máquina destino, dirección IP o red de un paquete que coincide con la regla. Cuando se coincida una red, los siguientes formatos de direcciones IP o máscaras de red son soportados:
N.N.N.N/M.M.M.M — Donde N.N.N.N es el rango de direcciones IP y M.M.M.M es la máscara de la red.
N.N.N.N/M — Donde N.N.N.N es el rango de direcciones IP y M es la máscara de la red.
-f Aplica esta regla sólo a los paquetes fragmentados.
Usando la opción ! después de este parámetro, únicamente los paquetes no fragmentados se tendrán en cuenta.
-i — Configura la interfaz de red entrante, tal como eth0 o ppp0. Con iptables, este parámetro opcional puede ser usado solamente con las cadenas INPUT y FORWARD cuando es usado con la tabla filter y la cadena PREROUTING con las tablas nat y mangle.
Este parámetro también soporta las siguientes opciones especiales:
! — Dice a este parámetro que no concuerde, queriendo decir esto que las interfaces especificadas se excluirán de esta regla.
+ — Un caracter tipo comodín utilizado para coincidir todas las interfaces con una cadena de caracteres particular. Por ejemplo, el parámetro -i eth+ aplicará esta regla a cualquier interfaz Ethernet pero excluirá cualquier otra interfaz, tal com ppp0.
Si el parámetro -i se utiliza sin especificar ninguna interfaz, todas las interfaces estarán afectadas por la regla.
-j — Le dice a iptables que salte a un objetivo particular cuando un paquete coincide con una regla. Los objetivos válidos a usar después de la opción -j incluye las opciones estándar, ACCEPT, DROP, QUEUE, y RETURN, así como también las opciones extendidas que están disponibles a través de los módulos cargados por defecto con el paquete RPM de Red Hat Linux iptables, como LOG, MARK, y REJECT, entre otros. Consulte la página del manual iptables para más información sobre esto y otros objetivos.
Puede también dirigir un paquete coincidiendo esta regla a una cadena definida por el usuario fuera de la cadena actual para que otras reglas puedan ser aplicadas al paquete.
Si no especifica ningún objetivo, el paquete se mueve hacia atrás en la regla sin llevar a cabo ninguna acción. A pesar de todo, el contador para esta regla se sigue incrementando en uno, a partir del momento en el que el paquete se adecua a la regla especificada.
-o — Configura la interfaz de red de salida para una regla y puede ser usada solamente con las cadenas OUTPUT y FORWARD en la tabla de filtro y la cadena POSTROUTING en las tablas nat y mangle. Estos parámetros de opciones son los mismos que aquellos de la interfaz de entrada (-i).
-p — Configura el protocolo IP para la regla, el cual puede ser icmp, tcp, udp, o all, para coincidir todos los protocolos soportados. Además, se puede usar cualquier protocolo listado en /etc/protocols. Si esta opción es omitida cuando se esté creando una regla, la opción all es la opción por defecto.
-s — Configura la fuente para un paquete particular usando la misma sintaxis que el parámetro (-d).
Diferentes protocolos de red proporcionan opciones especializadas las cuales se pueden configurar de formas específicas para coincidir un paquete particular usando ese protocolo. Por supuesto, el protocolo debe ser especificado primero con el comando iptables, mediante el uso de -p tcp <protocol-name> (donde <protocol-name> es el protocolo objetivo), para hacer las opciones disponibles para ese protocolo.
Estas opciones de identificación están disponibles en el protocolo TCP (opción -p tcp):
--dport — Configura el puerto de destino para el paquete. Use bien sea un nombre de servicio (tal como www o smtp), número de puerto, o el rango de números de puertos para configurar esta opción. Para hojear los nombres y alias de los servicios de red y los números que ellos usan, visualice el archivo /etc/services. La opción --destination-port es sinónimo con --dport.
Para especificar un rango de números de puertos, separe los dos números con dos puntos (:), tal como -p tcp --dport 3000:3200. El rango válido aceptable es 0:65535.
Use un caracter de exclamación (!) después de la opción --dport para indicar a iptables que coincida todos los paquetes que no usan el servicio de red o puerto.
--sport — Configura el puerto fuente del paquete usando las mismas opciones que --dport. La opción --source-port es sinónimo con --sport.
--syn Provoca que todos los paquetes designados de TCP, comúnmente llamados paquetes SYN, cumplan esta regla. Cualquier paquete que esté llevando un payload de datos no será tocado. Si se sitúa un punto de exclamación (!) como bandera tras la opción --syn se provoca que todos los paquetes no-SYN sean seleccionados.
--tcp-flags — Permite a los paquetes TCP packets con bits específicos o banderas, ser coincididos con una regla. La opción --tcp-flags acepta dos parámetros. El primer parámetro es la máscara, la cual configura banderas a ser examinadas en el paquete. El segundo parámetro se refiere a la bandera que se debe configurar para poder coincidir.
Las banderas posibles son:
ACK
FIN
PSH
RST
SYN
URG
ALL
NONE
Por ejemplo, una regla iptables que contiene -p tcp --tcp-flags ACK,FIN,SYN SYN tan sólo seleccionará los paquetes TCP que tengan la bandera SYN activo y las banderas ACK y FIN sin activar.
Usando el caracter de exclamación (!) después de --tcp-flags reversa el efecto de la opción de coincidencia.
--tcp-option Intenta seleccionar con opciones específicas de TCP que pueden estar activas en un paquete en particular. Esta opción se puede revertir con el punto de exclamación (!).
Estas opciones de selección están disponibles para el protocolo UDP (-p udp):
--dport — Especifica el puerto destino del paquete UDP, usando el nombre del servicio, número de puerto, o rango de números de puertos. La --destination-port que coincide la opción es sinónimo con --dport. Consulte a la opción --dport en Sección 16.3.5.1 para ver las formas de usar esta opción.
--sport — Especifica el puerto fuente de un paquete UDP, usando el nombre del servicio, número de puerto, o rango de números de puertos. La --source-port opción es sinónimo con --sport. Consulte a la --sport en Sección 16.3.5.1 para ver las formas de usar esta opción.
Estas opciones de coincidencia están disponibles para el Internet Control Message Protocol (ICMP) (-p icmp):
--icmp-type Selecciona el nombre o el número del tipo ICMP que concuerde con la regla. Se puede obtener una lista de nombres válidos ICMP tecleando el comando iptables -p icmp -h.
Opciones adicionales de coincidencia están disponibles a través de los módulos por el comando iptables. Para usar un módulo de opciones de coincidencia, cargue el módulo por nombre usando la opción -m, tal como -m <module-name> (reemplazando <module-name> con el nombre del módulo).
Un gran número de módulos están disponibles por defecto. Hasta es posible crear sus propios módulos para proporcionar funcionalidades de opciones de coincidencia adicionales.
Existen muchos módulos, pero sólo se discuten aquí los más populares.
limit module — Permite colocar un límite en cuántos paquetes son coincididos a una regla particular. Esto es especialmente beneficioso cuando se registren las coincidencias a las reglas y así una gran cantidad de paquetes coincidentes no sobrecarguen el registro del sistema con mensajes repetitivos o usen los recursos del sistema.
El módulo limit habilita las opciones siguientes:
--limit — Configura el número de coincidencias en un intervalo de tiempo, especificado con un número y un modificador de tiempo ordenados en el formato <número>/<tiempo>. Por ejemplo, si usamos --limit 5/hour sólo dejaremos que una regla sea efectiva cinco veces a la hora.
Si no se utiliza ningún número ni modificador de tiempo, se asume el siguiente valor por defecto: 3/hour.
--limit-burst — Configura un límite en el número de paquetes capaces de cumplir una regla en un determinado tiempo. Esta opción deberá ser usada junto con la opción --limit, y acepta un número para configurar el intervalo de tiempo (threshold).
Si no se especifica ningún número, tan sólo cinco paquetes serán capaces inicialmente de cumplir la regla.
módulo state — Habilita la coincidencia de estado.
El módulo state tiene las siguientes opciones:
--state — coincide un paquete con los siguientes estados de conexión:
ESTABLISHED El paquete seleccionado se asocia con otros paquetes en una conexión establecida.
INVALID El paquete seleccionado no puede ser asociado a una conexión conocida.
NEW El paquete seleccionado o bien está creando una nueva conexión o bien forma parte de una conexión de dos caminos que antes no había sido vista.
RELATED El paquete seleccionado está iniciando una nueva conexión en algún punto de la conexión existente.
Estos estados de conexión se pueden utilizar en combinación con otros separándolos mediante comas como en -m state --state INVALID, NEW.
módulo mac — Habilita la coincidencia de direcciones MAC de hardware.
El módulo mac activa las opciones siguientes:
--mac-source — Coincide una dirección MAC a la tarjeta de red que envió el paquete. Para excluir una dirección MAC de la regla, coloque un símbolo de exclamación (!) después de la opción --mac-source.
Para visualizar otras opciones disponibles a través de los módulos, consulte la página del manual de iptables.
Una vez que un paquete ha coincidido con una regla, la regla puede dirigir el paquete a un número de objetivos diferentes que deciden su suerte y, posiblemente, toman acciones adicionales. Cada cadena tiene un objetivo por defecto, el cual es usado si ninguna de las reglas en esa cadena coinciden con un paquete o si ninguna de las reglas que coinciden con el paquete especifica un objetivo.
Los siguientes son los objetivos estándar:
<user-defined-chain> — Reemplace <user-defined-chain> con el nombre de una cadena definida por el usuario dentro de la tabla. Este objetivo pasa el paquete a la cadena objetivo.
ACCEPT — Permite que el paquete se mueva hacia su destino (o hacia otra cadena, si no ha sido configurado ningún destino para seguir a esta cadena).
DROP — Deja caer el paquete sin responder al solicitante. El sistema que envia el paquete no es notificado de esta falla.
QUEUE — El paquete se pone en una cola para ser manejado por una aplicación en el espacio de usuario.
RETURN — Para la verificación del paquete contra las reglas de la cadena actual. Si el paquete con un destino RETURN cumple una regla de una cadena llamada desde otra cadena, el paquete es devuelto a la primera cadena para retomar la verificación de la regla allí donde se dejó. Si la regla RETURN se utiliza en una cadena predefinida, y el paquete no puede moverse hacia la cadena anterior, el objetivo por defecto de la cadena actual decide qué acción llevar a cabo.
Además de estos objetivos standard, se pueden usar otros más con extensiones llamadas módulos de objetivos (target modules), que trabajan de forma similar a como los hacían los módulos de las opciones de selección. Para obtener más información sobre estos módulos, mire en Sección 16.3.5.4.
Existen varios módulos extendidos de objetivos, la mayoría de los cuales tan sólo se aplicarán a tablas o situaciones específicas. Un par de estos módulos de los más populares e incluidos por defecto en Red Hat Linux serían:
LOG — Registra todos los paquetes que coinciden esta regla. Puesto que los paquetes son registrados por el kernel, el archivo /etc/syslog.conf determina dónde estas entradas de registro serán escritas. Por defecto, son colocadas en el archivo /var/log/messages.
Se pueden usar varias opciones tras el objetivo LOG para especificar la manera en la que tendrá lugar el registro:
--log-level — Configura el nivel de prioridad del registro de eventos. Una lista de los niveles de prioridad se puede encontrar en la página del manual de syslog.conf.
--log-ip-options Cualquier opción en la cabecera de un paquete IP se guarda en el registro.
--log-prefix — Coloca una cadena de hasta 29 caracteres antes de la línea de registro cuando es escrita. Esto es muy útil para la escritura de filtros de syslog para usarlos en conjunto con el registro de paquetes.
--log-tcp-options — Cualquier opción colocada en la cabecera de un paquete TCP es registrada.
--log-tcp-sequence Escribe el número de secuencia TCP del paquete en el registro del sistema.
REJECT — Envia un paquete de error de vuelta al sistema remoto y deja caer el paquete.
El objetivo REJECT acepta --reject-with <type> (donde <type> es el tipo de rechazo) el cual permite que se envie información más detallada devuelta con el paquete de error. El mensaje port-unreachable es el <tipo> de error por defecto dado si no se usa otra opción. Para una lista completa de los <tipos> de opciones que se pueden usar, consulte la página del manual de iptables.
Otras extensiones de objetivos, incluyendo muchas que son útiles para el enmascaramiento de IP usando la tabla nat o con alteración de paquetes usando la tabla mangle, se puede encontrar en la página del manual de iptables.
El comando predeterminado para listar, iptables -L, proporciona una vista muy básica de los filtros por defecto de las cadenas actuales de la tabla. Las opciones adicionales proporcionan más información:
-v Muestra la salida por pantalla, como el número de paquetes y bytes que cada cadena ha visto, el número de paquetes y bytes que cada regla ha encontrado, y qué interfaces se aplican a una regla en particular.
-x Expande los números en sus valores exactos. En un sistema ocupado, el número de paquetes y bytes vistos por una cadena en concreto o por una regla puede estar abreviado usando K (miles), M (millones), y G (billones) detrás del número. Esta opción fuerza a que se muestre el número completo.
-n Muestra las direcciones IP y los números de puertos en formato numérico, en lugar de utilizar el nombre del servidor y la red tal y como se hace por defecto.
--line-numbers Proporciona una lista de cada cadena junto con su orden numérico en la cadena. Esta opción puede ser útil cuando esté intentando borrar una regla específica en una cadena, o localizar dónde insertar una regla en una cadena.
-t — Especifica un nombre de tabla.