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