¿Cómo puedo eliminar reglas específicas de iptables? [cerrado]
Estoy alojando servicios HTTP y HTTPS especiales en los puertos 8006 y 8007 respectivamente. Utilizo iptables para "activar" el servidor; es decir, para enrutar los puertos HTTP y HTTPS entrantes:
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8006 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8007 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8006
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8007
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8006
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-ports 8007
Esto funciona de maravilla. Sin embargo, me gustaría crear otro script que deshabilite mi servidor nuevamente; es decir, restaurar iptables al estado en el que se encontraba antes de ejecutar las líneas anteriores. Sin embargo, me cuesta entender la sintaxis para eliminar estas reglas. Lo único que parece funcionar es un lavado completo:
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
Pero eso también eliminará otras reglas de iptables que no son deseadas.
Ejecute los mismos comandos pero reemplace "-A" con "-D". Por ejemplo:
iptables -A ...
se convierte
iptables -D ...
También puedes usar el número de la regla ( --line-numbers ):
iptables -L INPUT --line-numbers
Salida de ejemplo:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere udp dpt:domain
2 ACCEPT tcp -- anywhere anywhere tcp dpt:domain
3 ACCEPT udp -- anywhere anywhere udp dpt:bootps
4 ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
Entonces, si desea eliminar la segunda regla:
iptables -D INPUT 2
Actualizar
Si usa (d) una tabla específica (por ejemplo, nat), debe agregarla al comando de eliminación (gracias a @ThorSummoner por el comentario)
sudo iptables -t nat -D PREROUTING 1
La mejor solución que me funciona sin ningún problema es la siguiente:
1. Agregue una regla temporal con algún comentario:
comment=$(cat /proc/sys/kernel/random/uuid | sed 's/\-//g')
iptables -A ..... -m comment --comment "${comment}" -j REQUIRED_ACTION
2. Cuando se agregó la regla y desea eliminarla (o todo lo que tenga este comentario), haga lo siguiente:
iptables-save | grep -v "${comment}" | iptables-restore
Por lo tanto, eliminará al 100 % todas las reglas que coincidan con el comentario $ y dejará las demás líneas intactas. Esta solución funciona durante los últimos 2 meses con aproximadamente 100 cambios de reglas por día, sin problemas. Espero que ayude
Primero enumere todas las reglas de iptables con este comando:
iptables -S
enumera como:
-A XYZ -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
Luego copie la línea deseada y simplemente reemplácela -A
con -D
para eliminarla:
iptables -D XYZ -p ...
Utilice -D
el comando, así man
lo explica la página:
-D, --delete chain rule-specification
-D, --delete chain rulenum
Delete one or more rules from the selected chain.
There are two versions of this command:
the rule can be specified as a number in the chain (starting at 1 for the first rule) or a rule to match.
Tenga en cuenta que este comando, como todos los demás comandos ( -A
, -I
) funciona en determinada tabla. Si no está trabajando en la tabla predeterminada ( filter
tabla), utilícela -t TABLENAME
para especificar esa tabla de destino.
Eliminar una regla para que coincida
iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
Nota: Esto solo elimina la primera regla coincidente. Si tiene muchas reglas que coinciden (esto puede suceder en iptables), ejecútelo varias veces.
Eliminar una regla especificada como un número
iptables -D INPUT 2
Además de contar el número, puede enumerar el número de línea con --line-number
el parámetro, por ejemplo:
iptables -t nat -nL --line-number