¿Las reglas de iptables que cambian rápidamente causarán problemas?

¿Las reglas de iptables que cambian rápidamente causarán problemas?

Estoy escribiendo un script que monitorea diferentes métricas (por ejemplo, el uso del ancho de banda de la interfaz) y cambio iptableslas reglas en consecuencia. Estos cambios pueden ocurrir al menos 2 veces por segundo, hasta 4 * number of interfacespor segundo.

La cuestión es que no estoy seguro de cómo iptablesse manejan los cambios de reglas. ¿Se recompilan las cosas y el script exigirá mucho a la CPU? O qué sucede con los paquetes que aún se procesan durante el cambio de reglas; ¿los dejarán caer? Ese tipo de preocupaciones.

¿Las reglas de iptables que cambian rápidamente causarán problemas?

EDITAR: Para mi aplicación específica, todas las reglas ya están implementadas. Se trata más bien de habilitar o deshabilitar (agregar o eliminar) ciertas reglas. En otras palabras, las tablas no crecerán con el tiempo ni se volverán extremadamente grandes.

Respuesta1

¿Cómo se cambian las reglas?

¿Invocas el iptablescomando repetidamente? Eso tendrá un impacto significativo en el rendimiento, porque cómo funciona iptables:

  • Coge todas las tablas/cadenas de netfilter
  • Realice UN cambio según lo solicitado
  • Cargue todas las tablas/cadenas de netfilter nuevamente en el kernel

eso sucederá elcada uno iptablesinvocación.

La pregunta es: ¿Cuál es la naturaleza de los cambios que hacen a las reglas?

Si está agregando o eliminando reglas basadas en direcciones de origen y/o destino, debería usarlas ipseten su lugar.

Pero si está agregando o eliminando reglas, digamos porque está cambiando otros parámetros sobre la marcha (por ejemplo, cambiando ratepara que coincidan con más o menos frecuencia, cambiando los indicadores de QoS, etc.), entonces tal vez ipsetno sea adecuado para usted.

Por otro lado, si tu script realiza cambiosen masa, también considere hacerlo de esta manera:

  • Coge todas las tablas/cadenas de netfilter
    • Puede usar iptables-saveuna utilidad o, dependiendo de en qué escriba su script, tal vez haya una biblioteca que pueda hacerlo por usted.
  • Realice TODOS los cambios que desee de una sola vez
  • Cargar (confirmar) todas las tablas/cadenas de netfilter nuevamente al kernel
    • Puede usar iptables-restoreuna utilidad o similar al paso 1, use una biblioteca que pueda hacerlo por usted

EDITAR:

Ah, como las reglas ya están en la tabla, puedes usar elcoincidencia de condicionespara encenderlos/apagarlos.

Inserte -m condition --condition $NAMEen su iptablesregla.

Eso creará un archivo, /proc/net/ipt_condition/$NAME. La coincidencia se realiza correctamente si el archivo contiene 1y, en caso contrario, si el archivo contiene0

(Por supuesto, puedes utilizar la negación !para invertir la coincidencia).

Por ejemplo:

iptables -A INPUT -m condition --condition allow_880 -p tcp -m tcp --dport 880 -j ACCEPT

Para habilitar la regla:

echo 1 > /proc/net/ipt_condition/allow_880

Deshabilitar:

echo 0 > /proc/net/ipt_condition/allow_880

(Eres libre de usar el nombre que quieras, te recomiendo que sean fácilmente identificables. Hay una longitud máxima para el nombre, pero no recuerdo cuál).

Edición 1a:

Si ya ha creado la tabla, la forma más sencilla de editarla es guardar el resultado de iptables-save, editarlo (agregar las coincidencias de condiciones para las reglas que las necesitan) y luego cargar el archivo completo usando iptables-restoreoiptables-apply

Recuerde: 1 archivo de condición puede controlar más de 1 regla; no es necesario tener 1 archivo por regla, a menos que realmente lo desee así.

Editar 1b:

Como @AB mencionó en los comentarios (¡gracias!), -m conditionpuede que no sea una característica estándar para las iptables integradas de su distribución; En tal caso, probablemente necesitarás instalar un paquete adicional, por ejemplo, xtables-addons.

(Lo siento, me olvidé de esto porque estoy en Gentoo y el iptablespaquete en Gentoo simplemente sigue lo que es el kernel .config.)

Respuesta2

Nftables podría ser más adecuado en este caso. nftables está diseñado para ser más eficiente y escalable que iptables, especialmente con conjuntos de reglas complejos o modificaciones frecuentes. Proporciona un mejor rendimiento debido a su integración en el kernel de Linux y su sintaxis optimizada.

información relacionada