我已经尝试(花了几个小时)配置 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
我知道一条规则用于附加,另一条规则用于插入,也知道这两个术语的含义,但有人能解释一下这两者之间的区别以及何时使用哪个选项吗?我查了一下 Ubuntu 的 iptables 如何使用,但没有看到太多信息。
答案1
iptables -A
在规则集的末尾附加规则,而iptables -I
像您所指出的那样将规则插入到规则集中的特定位置。
查看 iptables 的 man 条目显示以下内容:
-I, --insert chain [rulenum] rule-specification 根据给定的规则编号在选定链中插入一个或多个规则。因此,如果规则编号为 1,则规则将插入链的开头。如果未指定规则编号,这也是默认设置。
-I
这就是为什么对你有用而对你没用的原因-A
。如果你不提供任何规则号,你的规则将被插入到第一个位置。这意味着在你的例子中,你的规则集中的某个地方一定有一个禁止 DNS 数据包的规则(也许是一个通常禁止 UDP 的规则?),因为 iptables 会从第一个到最后一个处理所有规则,应用第一个匹配并停止。
顺便说一句,这也是为什么你应该把那些旨在匹配大多数数据包的规则放在顶部的原因:如果你把最常用的规则放在顶部,数据包就会根据每个规则进行检查,这可能会消耗大量资源。
至于用法:-A
当您想要在末尾附加规则或规则位于何处并不重要时,您可以安全使用。如果您希望将规则置于特定位置,请-I
像这样使用:(iptables -I INPUT 6 -p tcp -j DROP
这将在 INPUT 规则集中的位置 6 上为发往主机本身的所有 tcp 数据包添加 DROP 语句。)