iptables -A
acrescenta regras no final do conjunto de regras, enquanto iptables -I
insere a regra em uma posição específica no conjunto de regras, conforme você apontou.
Olhando para a entrada man do iptables, mostra isso:
-I, --insert chain [rulenum] rule-specification Insert one or more rules in the selected chain as the given rule number. So, if the rule number is 1, the rule or rules are inserted at the head of the chain. This is also the default if no rule number is specified.
E aqui está o motivo pelo qual -I
funcionou para você e -A
não. Se você não fornecer nenhum rulenum, sua regra será inserida na primeira posição. Isso significa que no seu caso, em algum lugar do seu conjunto de regras, deve haver uma regra que proíba os pacotes DNS (talvez uma regra que proíba o UDP em geral?) Porque o iptables processa todas as regras do primeiro ao último, aplica a primeira correspondência e pára. br>
Btw, essa também é a razão pela qual você deve colocar as regras que se destinam a corresponder à maioria dos pacotes no topo: se você colocar a regra mais usada no e, o pacote é verificado em cada regra, o que pode consumir muitos recursos. / p>
E para o uso: você pode usar muito bem o -A
quando quiser anexar uma regra no final ou quando não importar qual será a regra. Se você quiser sua regra em uma posição específica, use -I
como este, por exemplo: iptables -I INPUT 6 -p tcp -j DROP
(isso adicionará uma instrução DROP para todos os pacotes tcp endereçados ao próprio host na posição 6 no conjunto de regras INPUT.)