iptables -A
ajoute des règles à la fin de l'ensemble de règles tandis que iptables -I
la règle est insérée à une position spécifique dans l'ensemble de règles, comme vous l'avez souligné.
En regardant l'entrée man pour iptables, cela montre:
-I, --insert chaîne [rulenum] spécification de règle Insérez une ou plusieurs règles dans la chaîne sélectionnée comme numéro de règle donné. Ainsi, si le numéro de règle est 1, la ou les règles sont insérées en tête de chaîne. Il s'agit également de la valeur par défaut si aucun numéro de règle n'est spécifié.
Et voici la raison pour laquelle cela a -I
fonctionné pour vous et -A
non. Si vous ne fournissez aucun rulenum, votre règle est insérée à la toute première position. Cela signifie dans votre cas, que quelque part dans votre ensemble de règles, il doit y avoir une règle qui interdit les paquets DNS (peut-être une règle qui interdit UDP en général?) Car iptables traite toutes les règles de la première à la dernière, applique la première correspondance et s'arrête.
Btw, c'est aussi la raison pour laquelle vous devriez mettre les règles qui sont censées correspondre à la plupart des paquets en haut: si vous mettez la règle la plus utilisée au et, le paquet est vérifié par rapport à chaque règle qui peut consommer beaucoup de ressources.
Et pour l'utilisation: vous pouvez utiliser à bon escient -A
lorsque vous souhaitez ajouter une règle à la fin ou quand peu importe où sera votre règle. Si vous voulez que votre règle à une position spécifique, utilisez -I
comme ceci par exemple: iptables -I INPUT 6 -p tcp -j DROP
(cela ajoutera une instruction DROP pour tous les paquets tcp adressés à l'hôte lui-même à la position 6 dans l'ensemble de règles INPUT.)