iptables -A和-I选项之间的区别

我一直在尝试(几个小时)configurationiptables允许DNS查询到我的DNS服务器,只是发现我的iptables保持阻止访问由于我一直使用的规则添加选项。 大多数论坛build议的规则类似于以下内容:

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

然而,在我的情况下,我不得不改变规则到一个inserttypes为了它的工作:

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

我知道一个规则是为了插入,另一个是插入,还有两个术语是什么意思,但是有人可以解释两者之间的区别,以及何时使用哪个选项? 我查了一下Ubuntu的iptables怎么样,但是在那里看不到很多信息。

iptables -A在规则集的末尾添加规则,而iptables -I则按照您所指出的将规则插入到规则集的特定位置。

看着iptables的maninput显示这个:

-I, – 插入链[rulenum] rule-specification在给定的规则编号中插入选定链中的一个或多个规则。 所以,如果规则编号是1,则规则或规则被插入链的头部。 如果没有指定规则号,这也是默认值。

这就是为什么-I为你工作,而不是。 如果你不提供任何rulenum,你的规则插入在第一个位置。 这意味着在你的情况下,你的规则集中的某个地方必须有一个禁止DNS数据包的规则(也许这是一个禁止UDP的规则?),因为iptables从第一个到最后一个处理所有规则,应用第一个匹配并停止。
顺便说一句,这也是为什么你应该把规则的目的是匹配大多数数据包在顶端:如果你把最常用的规则在和,数据包检查每个规则,可能会消耗大量的资源。

而对于这个用法:当你想在最后附加一个规则或者当你的规则将在哪里并不重要时,你可以节省地使用-A 。 如果你想要你的规则在一个特定的位置,使用-I像这样,例如: iptables -I INPUT 6 -p tcp -j DROP (这将添加一个DROP语句为所有的TCP数据包发送到主机本身在位置6 INPUT规则集。)