iptables -A
agrega reglas al final del conjunto de reglas, mientras que iptables -I
inserta la regla en una posición específica en el conjunto de reglas como ha señalado.
Mirando la entrada man para iptables se muestra esto:
-I, --insertar especificación de regla de cadena [rulenum] Inserte una o más reglas en la cadena seleccionada como el número de regla dado. Entonces, si el número de la regla es 1, la regla o las reglas se insertan en la cabeza de la cadena. Este también es el valor predeterminado si no se especifica ningún número de regla.
Y aquí está la razón por la que -I
funcionó para usted y -A
no. Si no proporciona ningún rulenum, su regla se inserta en la primera posición. Eso significa en su caso, que en algún lugar de su conjunto de reglas debe haber una regla que prohíba los paquetes DNS (¿tal vez una regla que prohíba UDP en general?) Porque iptables procesa todas las reglas desde la primera hasta la última, aplica la primera coincidencia y se detiene.
Por cierto, esa es también la razón por la que debe colocar las reglas que están destinadas a coincidir con la mayoría de los paquetes en la parte superior: si coloca la regla más utilizada en y, el paquete se compara con cada regla que puede consumir muchos recursos.
Y para el uso: puede usar de forma segura -A
cuando desee agregar una regla al final o cuando no importa dónde estará su regla. Si desea que su regla esté en una posición específica, use -I
esta opción, por ejemplo: iptables -I INPUT 6 -p tcp -j DROP
(esto agregará una instrucción DROP para todos los paquetes tcp dirigidos al host en sí en la posición 6 del conjunto de reglas INPUT).