iptables/ip6tables — herramienta de administración para el filtrado de paquetes IPv4/IPv6 y NAT
SINOPSIS
iptables [-t table] {-A|-C|-D|-V} chain rule-specification
ip6tables [-t table] {-A|-C|-D|-V} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain policy
iptables [-t table] -E old-chain-name new-chain-name
rule-specification := [matches...] [target]
match := -m matchname [per-match-options]
target := -j targetname [per-target-options]
DESCRIPCIÓN
Iptables e ip6tables se utilizan para configurar, mantener e inspeccionar las tablas de reglas de filtro de paquetes IPv4 e IPv6 en el kernel de Linux. Se pueden definir varias tablas diferentes. Cada tabla contiene un número de cadenas integradas y también puede contener cadenas definidas por el usuario.
Cada cadena es una lista de reglas que pueden hacer coincidir un conjunto de paquetes. Cada regla especifica qué hacer con un paquete que coincide. Esto se denomina "objetivo", que puede ser un salto a una cadena definida por el usuario en la misma tabla.
OBJETIVOS
Una regla de firewall especifica criterios para un paquete y un objetivo. Si el paquete no coincide, se examina la siguiente regla de la cadena; si coincide, la siguiente regla se especifica mediante el valor del objetivo, que puede ser el nombre de una cadena definida por el usuario, uno de los objetivos descritos en iptables-extensions(8), o uno de los valores especiales ACCEPT, DROP o RETURN.
ACCEPT significa dejar pasar el paquete. DROP significa descartar el paquete. RETURN significa dejar de recorrer esta cadena y reanudar en la siguiente regla de la cadena anterior (que llama). Si se alcanza el final de una cadena integrada o se coincide con una regla en una cadena integrada con el objetivo RETURN, el objetivo especificado por la política de la cadena determina el destino del paquete.
TABLAS
Actualmente, existen cinco tablas independientes (las tablas que están presentes en un momento dado dependen de las opciones de configuración del kernel y de los módulos que están presentes).
-t, --table table
Esta opción especifica la tabla de coincidencia de paquetes en la que debe operar el comando. Si el kernel está configurado con la carga automática de módulos, se realizará un intento de cargar el módulo adecuado para esa tabla si aún no está presente.
Las tablas son las siguientes:
filter:
Esta es la tabla predeterminada (si no se pasa la opción -t). Contiene las cadenas integradas INPUT (para paquetes destinados a sockets locales), FORWARD (para paquetes que se enrutan a través del sistema) y OUTPUT (para paquetes generados localmente).
nat:
Esta tabla se consulta cuando se encuentra un paquete que crea una nueva conexión. Consta de cuatro cadenas integradas: PREROUTING (para alterar los paquetes tan pronto como llegan), INPUT (para alterar los paquetes destinados a sockets locales), OUTPUT (para alterar los paquetes generados localmente antes del enrutamiento) y POSTROUTING (para alterar los paquetes cuando están a punto de salir). El soporte para IPv6 NAT está disponible desde el kernel 3.7.
mangle:
Esta tabla se utiliza para la alteración especializada de paquetes. Hasta el kernel 2.4.17, tenía dos cadenas integradas: PREROUTING (para alterar los paquetes entrantes antes del enrutamiento) y OUTPUT (para alterar los paquetes generados localmente antes del enrutamiento). Desde el kernel 2.4.18, también se admiten tres cadenas integradas más: INPUT (para paquetes que llegan al sistema), FORWARD (para alterar los paquetes que se enrutan a través del sistema) y POSTROUTING (para alterar los paquetes cuando están a punto de salir).
raw:
Esta tabla se utiliza principalmente para configurar excepciones del seguimiento de la conexión en combinación con el objetivo NOTRACK. Se registra en los hooks de netfilter con mayor prioridad y, por lo tanto, se llama antes que ip_conntrack o cualquier otra tabla de IP. Proporciona las siguientes cadenas integradas: PREROUTING (para paquetes que llegan a través de cualquier interfaz de red) y OUTPUT (para paquetes generados por procesos locales).
security:
Esta tabla se utiliza para las reglas de control de acceso obligatorio (MAC), como las habilitadas por los objetivos SECMARK y CONNSECMARK. El control de acceso obligatorio es implementado por los módulos de seguridad de Linux, como SELinux. La tabla de seguridad se llama después de la tabla de filtro, lo que permite que cualquier regla de control de acceso discrecional (DAC) en la tabla de filtro entre en vigor antes de las reglas de MAC. Esta tabla proporciona las siguientes cadenas integradas: INPUT (para paquetes que llegan al sistema), OUTPUT (para alterar los paquetes generados localmente antes del enrutamiento) y FORWARD (para alterar los paquetes que se enrutan a través del sistema).
OPCIONES
Las opciones reconocidas por iptables e ip6tables se pueden dividir en varios grupos diferentes.
COMANDOS
Estas opciones especifican la acción deseada a realizar. Solo se puede especificar una de ellas en la línea de comandos, a menos que se indique lo contrario a continuación. Para las versiones largas de los nombres de los comandos y las opciones, solo debe usar suficientes letras para que iptables pueda diferenciarla de todas las demás opciones.
-A, --append chain rule-specification
Agrega una o más reglas al final de la cadena seleccionada. Cuando los nombres de origen y/o destino se resuelven en más de una dirección, se agregará una regla para cada combinación de direcciones posible.
-C, --check chain rule-specification
Comprueba si existe una regla que coincida con la especificación en la cadena seleccionada. Este comando utiliza la misma lógica que -D para encontrar una entrada coincidente, pero no altera la configuración existente de iptables y utiliza su código de salida para indicar éxito o fracaso.
-D, --delete chain rule-specification
-D, --delete chain rulenum
Eliminar una o más reglas de la cadena seleccionada. Hay dos versiones de este comando: la regla se puede especificar como un número en la cadena (comenzando en 1 para la primera regla) o una regla que coincida.
-I, --insert chain [rulenum] rule-specification
Insertar una o más reglas en la cadena seleccionada como el número de regla dado. Por lo tanto, si el número de regla es 1, la regla o las reglas se insertarán al principio de la cadena. Este también es el valor predeterminado si no se especifica ningún número de regla.
-R, --replace chain rulenum rule-specification
Reemplazar una regla en la cadena seleccionada. Si los nombres de origen y/o destino se resuelven en múltiples direcciones, el comando fallará. Las reglas se numeran comenzando en 1.
-L, --list [chain]
Listar todas las reglas en la cadena seleccionada. Si no se selecciona ninguna cadena, se listarán todas las cadenas. Como todos los demás comandos de iptables, se aplica a la tabla especificada (el filtro es el valor predeterminado), por lo que las reglas de NAT se listan mediante iptables -t nat -n -L Tenga en cuenta que a menudo se utiliza con la opción -n, para evitar búsquedas DNS inversas largas. También es legal especificar la opción -Z (zero), en cuyo caso la(s) cadena(s) se listarán y borrarán atómicamente. La salida exacta se ve afectada por los demás argumentos dados. Las reglas exactas se suprimen hasta que utilice iptables -L -v o iptables-save(8).
-S, --list-rules [chain]
Imprimir todas las reglas en la cadena seleccionada. Si no se selecciona ninguna cadena, se imprimirán todas las cadenas como iptables-save. Como todos los demás comandos de iptables, se aplica a la tabla especificada (el filtro es el valor predeterminado).
-F, --flush [chain]
Vaciar la cadena seleccionada (todas las cadenas de la tabla si no se especifica ninguna). Esto es equivalente a eliminar todas las reglas una por una.
-Z, --zero [chain [rulenum]]
Establecer en cero los contadores de paquetes y bytes en todas las cadenas, o solo en la cadena dada, o solo en la regla dada en una cadena. Es legal especificar la opción -L, --list (listar) también, para ver los contadores inmediatamente antes de que se borren. (Véase arriba).
-N, --new-chain chain
Crear una nueva cadena definida por el usuario con el nombre dado. No debe haber ningún objetivo de ese nombre ya.
-X, --delete-chain [chain]
Eliminar la cadena especificada. No debe haber ninguna referencia a la cadena. Si las hay, debe eliminar o reemplazar las reglas que hacen referencia antes de que se pueda eliminar la cadena. La cadena debe estar vacía, es decir, no contener ninguna regla. Si no se proporciona ningún argumento, eliminará todas las cadenas vacías de la tabla. Las cadenas integradas vacías solo se pueden eliminar con iptables-nft.
-P, --policy chain target
Establecer la política para la cadena integrada (no definida por el usuario) al objetivo dado. El objetivo de la política debe ser ACCEPT o DROP.
-E, --rename-chain old-chain new-chain
Renombra la cadena especificada por el usuario al nombre proporcionado por el usuario. Esto es puramente cosmético y no afecta la estructura de la tabla.
-h Ayuda. Muestra una descripción breve de la sintaxis del comando.
PARÁMETROS
Los siguientes parámetros componen una especificación de regla (tal como se utiliza en los comandos add, delete, insert, replace y append).
-4, --ipv4
Esta opción no tiene efecto en iptables e iptables-restore. Si una regla que utiliza la opción -4 se inserta con (y solo con) ip6tables-restore, se ignorará silenciosamente. Cualquier otro uso generará un error. Esta opción permite reglas IPv4 e IPv6 en un solo archivo de reglas para su uso con iptables-restore e ip6tables-restore.
-6, --ipv6
Si una regla que utiliza la opción -6 se inserta con (y solo con) iptables-restore, se ignorará silenciosamente. Cualquier otro uso generará un error. Esta opción permite reglas IPv4 e IPv6 en un solo archivo de reglas para su uso con iptables-restore e ip6tables-restore. Esta opción no tiene efecto en ip6tables e ip6tables-restore.
[!] -p, --protocol protocol
El protocolo de la regla o del paquete que se va a comprobar. El protocolo especificado puede ser tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh o la palabra clave especial "all", o puede ser un valor numérico, que representa uno de estos protocolos o uno diferente. También se permite un nombre de protocolo de /etc/protocols. Un argumento "!" antes del protocolo invierte la prueba. El número cero es equivalente a todos. "all" coincidirá con todos los protocolos y se tomará como valor predeterminado cuando se omita esta opción. Tenga en cuenta que, en ip6tables, no se permiten los encabezados de extensión IPv6, excepto esp. esp e ipv6-nonext se pueden usar con la versión 6.11 o posterior del kernel. El número cero es equivalente a todos, lo que significa que no se puede probar el campo de protocolo con el valor 0 directamente. Para coincidir con un encabezado HBH, incluso si fuera el último, no se puede usar -p 0, pero siempre se debe usar -m hbh.
[!] -s, --source address[/mask][,...]
Especificación de origen. La dirección puede ser un nombre de red, un nombre de host, una dirección IP de red (con /mask) o una dirección IP simple. Los nombres de host se resolverán una sola vez, antes de que la regla se envíe al kernel. Tenga en cuenta que especificar cualquier nombre para que se resuelva con una consulta remota, como DNS, es una mala idea. La máscara puede ser una máscara de red IPv4 (para iptables) o un número simple, que especifica el número de 1 en el lado izquierdo de la máscara de red. Por lo tanto, una máscara de iptables de 24 es equivalente a 255.255.255.0. Un argumento "!" antes de la especificación de la dirección invierte el sentido de la dirección. La bandera --src es un alias para esta opción. Se pueden especificar varias direcciones, pero esto se expandirá a varias reglas (al agregar con -A), o hará que se eliminen varias reglas (con -D).
[!] -d, --destination address[/mask][,...]
Especificación de destino. Consulte la descripción de la bandera -s (origen) para obtener una descripción detallada de la sintaxis. La bandera --dst es un alias para esta opción.
-m, --match match
Especifica una coincidencia a utilizar, es decir, un módulo de extensión que prueba una propiedad específica. El conjunto de coincidencias constituye la condición bajo la cual se invoca un objetivo. Las coincidencias se evalúan de primero a último según lo especificado en la línea de comandos y funcionan con una lógica de cortocircuito, es decir, si una extensión produce falso, la evaluación se detendrá.
-j, --jump target
Esto especifica el objetivo de la regla; es decir, qué hacer si el paquete coincide con ella. El objetivo puede ser una cadena definida por el usuario (distinta de la cadena en la que se encuentra esta regla), uno de los objetivos integrados especiales que deciden el destino del paquete de inmediato, o una extensión (vea las EXTENSIONES DE COINCIDENCIA Y OBJETIVO a continuación). Si se omite esta opción en una regla (y no se usa -g), entonces la coincidencia de la regla no tendrá ningún efecto en el destino del paquete, pero los contadores de la regla se incrementarán.
-g, --goto chain
Esto especifica que el procesamiento debe continuar en una cadena especificada por el usuario. A diferencia de la opción --jump, RETURN no continuará el procesamiento en esta cadena, sino en la cadena que nos llamó a través de --jump.
[!] -i, --in-interface name
Nombre de una interfaz a través de la cual se recibió un paquete (solo para paquetes que entran en las cadenas INPUT, FORWARD y PREROUTING). Cuando se utiliza el argumento "!" antes del nombre de la interfaz, el sentido se invierte. Si el nombre de la interfaz termina en un "+", entonces cualquier interfaz que comience con este nombre coincidirá. Si se omite esta opción, cualquier nombre de interfaz coincidirá.
[!] -o, --out-interface name
Nombre de una interfaz a través de la cual se va a enviar un paquete (para paquetes que entran en las cadenas FORWARD, OUTPUT y POSTROUTING). Cuando se utiliza el argumento "!" antes del nombre de la interfaz, el sentido se invierte. Si el nombre de la interfaz termina en un "+", entonces cualquier interfaz que comience con este nombre coincidirá. Si se omite esta opción, cualquier nombre de interfaz coincidirá.
[!] -f, --fragment
Esto significa que la regla solo se refiere a los segundos y posteriores fragmentos IPv4 de los paquetes fragmentados. Dado que no hay forma de determinar el puerto de origen o destino de un paquete de este tipo (o el tipo ICMP), dicho paquete no coincidirá con ninguna regla que especifique estos valores. Cuando el argumento "!" precede a la bandera "-f", la regla solo coincidirá con los fragmentos de encabezado o los paquetes no fragmentados. Esta opción es específica de IPv4 y no está disponible en ip6tables.
-c, --set-counters packets bytes
Esto permite al administrador inicializar los contadores de paquetes y bytes de una regla (durante las operaciones INSERT, APPEND, REPLACE).
OTRAS OPCIONES
Las siguientes opciones adicionales se pueden especificar:
-v, --verbose
Salida detallada. Esta opción hace que el comando list muestre el nombre de la interfaz, las opciones de la regla (si las hay) y las máscaras TOS. También se enumeran los contadores de paquetes y bytes, con el sufijo 'K', 'M' o 'G' para multiplicadores de 1000, 1.000.000 y 1.000.000.000 respectivamente (pero consulte la bandera -x para cambiar esto). Para agregar, insertar, eliminar y reemplazar, esto provoca que se imprima información detallada sobre la regla o reglas. Se puede especificar -v varias veces para posiblemente emitir declaraciones de depuración más detalladas: especificado dos veces, iptableslegacy mostrará la información de la tabla y las entradas en libiptc, iptables-nft mostrará las reglas en la presentación netlink (código VM). Especificado tres veces, iptables-nft también mostrará cualquier mensaje netlink enviado al kernel.
-V, --version
Muestra la versión del programa y la API del kernel utilizada.
-w, --wait [segundos]
Espera el bloqueo de xtables. Para evitar que se ejecuten varias instancias del programa simultáneamente, se realizará un intento de obtener un bloqueo exclusivo al inicio. De forma predeterminada, el programa se cerrará si no se puede obtener el bloqueo. Esta opción hará que el programa espere (indefinidamente o durante un número opcional de segundos) hasta que se pueda obtener el bloqueo exclusivo.
-n, --numeric
Salida numérica. Las direcciones IP y los números de puerto se imprimirán en formato numérico. De forma predeterminada, el programa intentará mostrarlos como nombres de host, nombres de red o servicios (cuando sea aplicable).
-x, --exact
Expande los números. Muestra el valor exacto de los contadores de paquetes y bytes, en lugar de solo el número redondeado en K (múltiplos de 1000), M (múltiplos de 1000K) o G (múltiplos de 1000M). Esta opción solo es relevante para el comando -L.
--line-numbers
Cuando se enumeran las reglas, agrega números de línea al comienzo de cada regla, que corresponden a la posición de esa regla en la cadena.
--modprobe=comando
Cuando se agregan o insertan reglas en una cadena, usa el comando para cargar cualquier módulo necesario (objetivos, extensiones de coincidencia, etc.).
ARCHIVO DE BLOQUEO
iptables usa el archivo /run/xtables.lock para tomar un bloqueo exclusivo al inicio.
La variable de entorno XTABLES_LOCKFILE se puede utilizar para anular la configuración predeterminada.
EXTENSIONES DE COINCIDENCIA Y OBJETIVO
iptables puede usar módulos de coincidencia y objetivo de paquetes extendidos. Una lista de estos está disponible en la página de manual iptables-extensions(8).
DIAGNÓSTICOS
Se imprimen varios mensajes de error en la salida de error estándar. El código de salida es 0 para un funcionamiento correcto. Los errores que parecen ser causados por parámetros de línea de comandos no válidos o mal utilizados provocan un código de salida de 2. Los errores que indican una incompatibilidad entre el kernel y el espacio de usuario provocan un código de salida de 3. Los errores que indican un problema de recursos, como un bloqueo ocupado, una asignación de memoria fallida o mensajes de error del kernel, provocan un código de salida de 4. Finalmente, otros errores provocan un código de salida de 1.
ERRORES
¿Errores? ¿Qué es esto? ;-) Bueno, es posible que desees echar un vistazo a https://bugzilla.netfilter.org/ iptables saldrá inmediatamente con un código de error de 111 si detecta que se llamó como un programa setuid-to-root. iptables no se puede usar de forma segura de esta manera porque confía en las bibliotecas compartidas (coincidencias, objetivos) cargadas en tiempo de ejecución, la ruta de búsqueda se puede establecer mediante variables de entorno.
COMPATIBILIDAD CON IPCHAINS
Este iptables es muy similar a ipchains de Rusty Russell. La principal diferencia es que las cadenas INPUT y OUTPUT solo se recorren para los paquetes que entran al host local y se originan desde el host local, respectivamente. Por lo tanto, cada paquete solo pasa por una de las tres cadenas (excepto el tráfico de bucle local, que involucra tanto las cadenas INPUT como OUTPUT); anteriormente, un paquete reenviado pasaba por las tres cadenas.
La otra diferencia principal es que -i se refiere a la interfaz de entrada; -o se refiere a la interfaz de salida, y ambas están disponibles para los paquetes que entran en la cadena FORWARD.
Las diversas formas de NAT se han separado; iptables es un filtro de paquetes puro cuando se utiliza la tabla `filter' predeterminada, con módulos de extensión opcionales. Esto debería evitar gran parte de la confusión sobre la combinación del enmascaramiento IP y el filtrado de paquetes que se veía anteriormente. Por lo tanto, las siguientes opciones se gestionan de forma diferente: -j MASQ -M -S -M -L Hay varios otros cambios en iptables.
VER TAMBIÉN
iptables-apply(8), iptables-save(8), iptables-restore(8), iptables-extensions(8),
El documento HOWTO de filtrado de paquetes detalla el uso de iptables para el filtrado de paquetes, el documento HOWTO de NAT detalla NAT, el documento HOWTO de extensiones de netfilter detalla las extensiones que no están en la distribución estándar, y el documento HOWTO de hacking de netfilter detalla los internos de netfilter. Consulte https://www.netfilter.org/.
AUTORES
Rusty Russell escribió originalmente iptables, en consulta con Michael Neuling.
Marc Boucher hizo que Rusty abandonara ipnatctl al abogar por un marco de selección de paquetes genérico en iptables, luego escribió la tabla mangle, la coincidencia de propietario, el material de marca y se dedicó a hacer cosas interesantes en todas partes.
James Morris escribió el objetivo TOS y la coincidencia tos.
Jozsef Kadlecsik escribió el objetivo REJECT.
Harald Welte escribió los objetivos ULOG y NFQUEUE, la nueva libiptc, así como las coincidencias y los objetivos TTL, DSCP, ECN.
El Equipo central de Netfilter es: Jozsef Kadlecsik, Pablo Neira Ayuso, Eric Leblond, Florian Westphal y Arturo Borrero Gonzalez. Los miembros eméritos del equipo central son: Marc Boucher, Martin Josefsson, Yasuyuki Kozakai, James Morris, Harald Welte y Rusty Russell.
La página del manual fue escrita originalmente por Herve Eychenne <_>.
VERSIÓN
Esta página del manual se aplica a iptables/ip6tables 1.8.11.