Eliminar una cadena de iptables con todas sus reglas


31

Tengo una cadena adjunta con muchas reglas como:

> :i_XXXXX_i - [0:0]
> -A INPUT -s 282.202.203.83/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.62.253/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.60.62/32 -j i_XXXXX_i 
> -A INPUT -s 224.93.27.235/32 -j i_XXXXX_i 
> -A OUTPUT -d 282.202.203.83/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.62.253/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.60.62/32 -j i_XXXXX_i 
> -A OUTPUT -d 224.93.27.235/32 -j i_XXXXX_i

cuando trato de eliminar esta cadena con:

iptables -X XXXX

pero recibí un error como (intenté iptables -F XXXXX antes):

iptables: demasiados enlaces.

¿Hay una manera fácil de eliminar la cadena con un comando?


2
No he visto iptables barf así antes cuando intentaba enjuagar.
Tom O'Connor

Simplemente curioso ... ¿ cuántas reglas son "muchas"?
Ladadadada

1
2 muchos es que muchos :) si trato de eliminar las reglas primero, será similar a hacerlo muchas veces: iptables -D SALIDA -d XXX / 32 -j i_XXXXX_i
Timy

3
Pruebe esto:iptables-save | grep -v i_XXXXX_i | iptables-restore
Steven Monday,

@StevenMonday por qué no escribir como respuesta, esta es la más útil (alternativa hacerlo a través de un archivo y editar un archivo). Lo único que no elimina son las tablas completas ("en bruto" de todos modos)
nhed

Respuestas:


38

No puede eliminar cadenas cuando las reglas con '-j CHAINTODELETE' hacen referencia a ellas. Averigüe qué hace referencia a su cadena (el enlace) y elimínelo. Además, enjuague y luego mate.

-F, --flush [cadena]

Vaciar la cadena seleccionada (todas las cadenas en la tabla si no se da ninguna). Esto es equivalente a eliminar todas las reglas una por una.

-X, --delete-chain [cadena]

Eliminar la cadena opcional definida por el usuario especificada. No debe haber referencias a la cadena. Si es así, debe eliminar o reemplazar las reglas de referencia antes de que se pueda eliminar la cadena. La cadena debe estar vacía, es decir, no debe contener ninguna regla. Si no se proporciona ningún argumento, intentará eliminar todas las cadenas no integradas en la tabla.


Solo quiero encontrar una manera de eliminar la cadena (tiene muchas reglas de referencia '-j CHAINTODELETE') directamente, pero a partir de su respuesta, parece imposible :(
timy

1
El comentario de @timy StevenMonday eliminará de una sola pasada cualquier referencia a la cadena. Quizás no sea ideal, pero muy cerca.
Jeff Ferland el

12

Esto es potencialmente fuera de tema, ¡pero es lo que hice después de encontrar esta publicación! Para algunos casos de uso, la opción iptables -D puede ser útil. Dado que le permite borrar las reglas de referencia agregadas mediante programación con -A (si sabe con precisión cómo las agregó).

P.ej

    iptables -N MYCHAIN
    iptables -A INPUT -i interface -j MYCHAIN
    iptables -A MYCHAIN -j ACCEPT

se puede revertir con

   iptables -D INPUT -i interface -j MYCHAIN
   iptables --flush MYCHAIN
   iptables -X MYCHAIN

8

Necesita dos pasos, pero esto lo hace en un solo comando.

Cree un archivo y colóquelo en él.

# Empty the entire filter table
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

Guarde el archivo como "borrar todas las reglas". Ahora, haz este comando:

iptables-restore < clear-all-rules

Ahora puede borrarlo en cualquier momento con solo un comando.


1
+1 Esta es en realidad la forma más rápida de comenzar con una configuración fw limpia.
dr01

6

Aquí hay un plan alternativo. Implica tres comandos, no uno, pero con suerte, debería funcionar.

Volcar su iptablesconjunto de reglas a un archivo:

iptables-save > /tmp/iptables.txt

Elimine TODOS los usos de (y referencias a) la cadena infractora:

sed -i '/i_XXXXX_i/d' /tmp/iptables.txt

Luego vuelva a cargar el conjunto de reglas:

iptables-restore < /tmp/iptables.txt && rm /tmp/iptables.txt

0

Algo en este sentido los pondrá a todos en una sola línea sin quitar iptables de ninguna manera.

for chain in `iptables -L |grep i_XXXXX_i|awk '{ print $2 }'`; do iptables -X $chain; done

0

En el archivo man de iptables hay una opción -S

S, --list-rules [cadena] Imprime todas las reglas en la cadena seleccionada. Si no se selecciona ninguna cadena, todas las cadenas se imprimen como iptables-save. Al igual que cualquier otro comando de iptables, se aplica a la tabla especificada (el filtro es el predeterminado).

Mediante el uso iptables -S | grep <CHAINNAMEHERE>. Por ejemplo:

root @ root: ~ # iptables -S | grep TRAFFICLOG

-N TRAFFICLOG

-A ADELANTE -i eth0 -j TRAFFICLOG

entonces puede ver qué reglas bloquean la eliminación de la cadena de la tabla. Revise cada regla (excepto la iptables -N <CHAINNAMEHERE>y elimine la regla usando la -Dopción

-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 para que coincida.

Por ejemplo iptables -D FORWARD -i eth0 -j TRAFFICLOG. Después de haber eliminado cada regla para su ras cadena de la cadena con la -Fopción iptables -F <CHAINNAMEHERE>.

-F, --flush [cadena] Vacia la cadena seleccionada (todas las cadenas de la tabla si no se proporciona ninguna). Esto es equivalente a eliminar todas las reglas una por una.

Luego elimine su cadena con la -Xopción,iptables -X <CHAINNAMEHERE>

-X, --delete-chain [cadena] Eliminar la cadena opcional definida por el usuario especificada. No debe haber referencias a la cadena. Si es así, debe eliminar o reemplazar las reglas de referencia antes de que se pueda eliminar la cadena. La cadena debe estar vacía, es decir, no debe contener ninguna regla. Si no se proporciona ningún argumento, intentará eliminar todas las cadenas no integradas en la tabla.

Iptables es un conjunto de herramientas complicado, por lo que se necesita un tutorial ideal. Puedes probar uno en www.iptables.info


0

Esto escupirá cadenas y las eliminará

for i in $(iptables -S | awk '{print $2}' | uniq ); do iptables -F $i && iptables -Z $i && iptables -X $i  ; done

0

He descubierto que puede eliminar las reglas y la cadena editando el archivo de reglas en /etc/iptables/rules.v4. Si elimina la cadena no deseada en este archivo y luego vuelve a cargar iptables, ya no debería ver la cadena al hacer una iptables -L.


Este archivo existe solo en ciertas distribuciones de Linux, y luego solo en ciertas versiones de ciertas distribuciones de Linux.
Michael Hampton
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.