我的 iptables 防火墙遇到了一个奇怪的问题:如果我设置了两个连续的相同规则,第一个是ACCEPT
,第二个是DENY
,则传入的数据包会被拒绝(并记录为这样)。
为什么传入的数据包被第一条规则忽略,却被第二条规则捕获?
fwbuilder 视图在这里:
这是iptables
转储:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
In_RULE_0 all -- 0.0.0.0/0 0.0.0.0/0 state NEW
In_RULE_1 all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
In_RULE_0 all -- 0.0.0.0/0 0.0.0.0/0 state NEW
In_RULE_1 all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
Chain In_RULE_0 (2 references)
target prot opt source destination
LOG all -- 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 6 prefix "FW RULE 0 -- ACCEPT "
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain In_RULE_1 (2 references)
target prot opt source destination
LOG all -- 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 6 prefix "FW RULE 1 -- DENY "
DROP all -- 0.0.0.0/0 0.0.0.0/0
我也尝试ACCEPT
单独使用该规则,但没有成功。
我看到的唯一区别是DENY
规则不是state NEW
,但对于我已经配置且运行正常的数十个防火墙来说,规则是相同的。
答案1
您需要知道:带有-I
iptables 选项的规则会将规则放在列表的开头;带有-A
选项的规则会将规则放在列表的末尾。
就你的情况而言:我认为你可能在两个(几乎相同的) iptables 规则中都使用了“-I”,第二条规则会插入到列表开头的第一条规则之前,因此你创建了一个规则列表,其规则顺序如下:
match -s x.x.x.x action DROP
match -s x.x.x.x action ACCEPT
由于您的数据包同时匹配这两条规则,因此实际操作表(驻留在 RAM 中)顺序中的第一个 ( DROP
) 将生效。该顺序与 iptable 配置文件中的顺序无关。
交换顺序,结果就会有所不同。
答案2
好的,我找到了。结果发现我的 FW 完全没问题,但虚拟主机配置错误。我没有遇到任何错误,但不允许使用 iptables。当我允许它时,FW 开始运行……难怪我们无法在 iptables 级别找到错误……感谢大家的帮助 :)
答案3
当您使用时,您的 iptablesIn_RULE_0
仅适用于新连接state NEW
。
它也设置在您的 FORWARD 链(通过服务器的数据包)上,而不是您的 INPUT 链(到服务器的数据包)上。
你是如何测试的?你正在 ping 服务器的某个特定接口吗?
您能否发布完整的输出:
iptables -vnL
尝试以下规则来记录 INPUT 链上的流量(ping 服务器接口)
iptables -I INPUT 1 -j In_RULE_0