Разница между параметрами iptables -A и -I

20

Я пытался (в течение нескольких часов) настроить iptables для разрешения DNS-запросов на мой DNS-сервер и только что обнаружил, что мои iptables продолжают блокировать доступ из-за используемой опции добавления правил. Большинство форумов предлагают правило, похожее на следующее:

iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT

Однако в моем случае мне пришлось изменить правило на insertтип, чтобы оно работало:

iptables -I INPUT -p udp -m udp --dport 53 -j ACCEPT

Я знаю, что одно правило - для добавления, а другое - для вставки, а также что означают оба термина, но не мог бы кто-нибудь объяснить разницу между ними, а также когда использовать какой вариант? Я посмотрел iptables Ubuntu, как, но не вижу там много информации.

Zishan
источник

Ответы:

24

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.)

wullxz
источник