¿Cómo eliminar todas las reglas referentes a una cadena en iptables?

¿Cómo eliminar todas las reglas referentes a una cadena en iptables?

Tengo un conjunto de scripts que diseñé para monitoreo, control, etc. de la red. Una cosa que hago en estos scripts es crear una cadena de iptables como iptables -N mychain. Luego inserto reglas en las tablas principales según corresponda para llevar paquetes a mi cadena personalizada para cualquier propósito que quiera que tengan allí.

Mi pregunta es: tengo un script que realiza una "Actualización"; en otras palabras, elimina todas las reglas y comienza de nuevo. Es útil en caso de que surjan anomalías extrañas. La gente a menudo todavía administra iptables manualmente incluso si hay algo que administra parte de ellos. (Es por eso que quería que todo mi trabajo se hiciera en una mesa separada).

Si quiero borrar mi cadena, es fácil: iptables -F mychain. Pero lo que yonoLo que sé hacer es eliminar cualquier regla que haya creado y que haga referencia a esa cadena en las cadenas integradas (ENTRADA, SALIDA, etc.)

Supongamos que hubo un error en mi aplicación, o que un usuario estaba jugueteando y terminó jugando con las tablas, y de alguna manera agregó la regla a la cadena INPUT dos veces. Ahora los paquetes pasarán por la cadena dos veces: se contarán dos veces, se enrutarán dos veces, lo que sea.

La solución obvia a esto es revisar las cadenas principales y eliminar cualquier regla cuyo objetivo de salto sea mi cadena personalizada. Pero no sé cómo hacer esto.

A continuación se muestra un ejemplo de la peor situación que podríamos configurar:

iptables -N TEST
iptables -A INPUT -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST # again, for doubling error
iptables -I INPUT -p icmp -j TEST

Supongamos que un administrador sin escrúpulos o desinformado creó las tres reglas inferiores.

Así que ahora podría emitir iptables -D INPUT -j TESTy la regla que creé desaparecería. Sin embargo, esas otras reglas no se eliminarán ya que los parámetros cuando se usan -Ddeben coincidir. Entonces, incluso si elimino mi propia regla diligentemente, los paquetes podrían terminar allí más de una vez por diferentes razones.

Limpiar las cadenas principales no es necesariamente apropiado. Nuevamente, usar iptables en la línea de comando es común (lo hago yo mismo todo el tiempo), así que simplemente borre a ciegascadaLa regla podría borrar algo que alguien agregó por una buena razón, incluso si es una regla temporal.

La solución obvia es eliminar de alguna maneracualquierregla cuyo destino es la TESTcadena y eliminar esas reglas. Sin embargo, no he visto ningún comando en la página de manual de iptables que pueda lograr esto.

Lo más parecido que pude ver de cualquier usuario es iptables -S. Podría usar iptables -Sy crear un analizador para interpretar el resultado, pero esto supone un poco de trabajo extra. Me preguntaba si existe una forma más correcta de eliminar reglas mediante algún tipo de comodín. Nuevamente, elimine cualquier regla cuyo objetivo de salto sea la cadena que desee.

Una situación similar puede ocurrir si tengo una cadena de la que quiero deshacerme, pero tiene una referencia en otro lugar. Me gustaría poder averiguar dónde está esa referencia y, muy probablemente, eliminarla también.

es posible? ¿O terminaré teniendo que escribir un analizador para interpretar el iptables -Sresultado?

Respuesta1

Esto debería ser bastante sencillo. Utilice iptables-save para escribir el conjunto de reglas actual en un archivo o salida estándar, elimine cualquier elemento -j YOURCHAINy vuelva a cargar el resultado con iptables-restore

Esto es tentador de hacer como una pipa.

iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore

Sin embargo, no estoy seguro de si ejecutar guardar y restaurar simultáneamente funcionaría bien. Sería más seguro separar el guardado de la restauración. Habrá una pequeña región crítica donde se perdería una actualización intermedia del conjunto de reglas.

Respuesta2

No creo que haya una forma trivial de resolver esto aparte de recargar toda la configuración.

Quizás debería pensar en agregar una Política de caída a su cadena de esa manera, al menos si es diligente, causará problemas a los que no lo son y tal vez provoque alguna discusión.

Desde un punto de vista técnico, si va a tener que analizar la salida de varios comandos, puede que --line-num le resulte útil, pero recuerde eliminar en orden inverso (de mayor a menor) para que el índice no cambie cada vez. .

Respuesta3

Si necesita manipulaciones avanzadas iptables, una excelente biblioteca de Pythonhttp://ldx.github.io/python-iptables/puede que valga la pena echarle un vistazo. Proporciona una interfaz programática (tanto de lectura como de modificación) para netfilter. La interoperabilidad con iptablesse logra mediante el uso de las iptablesbibliotecas C ( libiptc, libxtablesy las iptablesextensiones), sin llamar al iptablesbinario ni analizar su salida.

información relacionada