iptables -A
добавляет правила в конец набора правил, тогда iptables -I
как правило вставляется в определенную позицию в наборе правил, как вы указали.
Просмотр записи man для iptables показывает следующее:
-I, --insert chain [rulenum] спецификация правила Вставить одно или несколько правил в выбранную цепочку в качестве заданного номера правила. Таким образом, если номер правила равен 1, правило или правила вставляются в начало цепочки. Это также значение по умолчанию, если номер правила не указан.
И вот причина, почему -I
работал на вас и -A
не работает. Если вы не предоставите руленум, ваше правило вставляется в самую первую позицию. В вашем случае это означает, что где-то в вашем наборе правил должно быть правило, запрещающее DNS-пакеты (может быть, правило, которое вообще запрещает UDP), потому что iptables обрабатывает все правила от первого до последнего, применяет первое сопоставление и останавливается.
Кстати, это также причина, по которой вы должны поместить правила, предназначенные для соответствия большинству пакетов, вверху: если вы ставите наиболее часто используемое правило в и, пакет проверяется на соответствие каждому правилу, которое может потреблять много ресурсов.
И для использования: вы можете безопасно использовать, -A
когда вы хотите добавить правило в конце или когда не имеет значения, где ваше правило будет. Если вы хотите, чтобы ваше правило находилось в определенной позиции, используйте, -I
например, следующее: iptables -I INPUT 6 -p tcp -j DROP
(это добавит инструкцию DROP для всех пакетов tcp, адресованных самому хосту в позиции 6 в наборе правил INPUT.)