为什么我不能在 iptables OUTPUT 链上使用 REJECT 策略?

为什么我不能在 iptables OUTPUT 链上使用 REJECT 策略?

我目前将 OUTPUT 链设置为 DROP。我想将其更改为 REJECT,这样我就知道是我的防火墙阻止我到达某个地方,而不是我尝试访问的任何服务出现问题(立即拒绝而不是超时)。然而,iptables 似乎并不关心这个。如果我手动编辑保存的规则文件并尝试恢复它,我会发现iptables-restore v1.4.15: Can't set policy 'REJECT' on 'OUTPUT' line 22: Bad policy name它拒绝加载规则。如果我尝试手动设置它 ( iptables -P OUTPUT REJECT),我会得到iptables: Bad policy name. Run 'dmesg' for more information.但 dmesg 中没有输出。

我已经确认适当的规则已编译到内核中,并且我已重新启动以确保它已加载:

# CONFIG_IP_NF_MATCH_TTL is not set
CONFIG_IP_NF_FILTER=y
***
CONFIG_IP_NF_TARGET_REJECT=y
***
CONFIG_IP_NF_TARGET_LOG=y
CONFIG_IP_NF_TARGET_ULOG=y

(添加星号以突出显示适用规则)

我能找到的所有内容都表明 REJECT 是有效的策略/目标(一般而言),但我找不到任何表明它对 INPUT、FORWARD 或 OUTPUT 链无效的内容。我的 Google-fu 没有帮助。我使用的是 Gentoo,如果这有什么区别的话。这里有人有任何见解吗?

答案1

REJECT是一个目标延伸,而连锁政策必须是目标。手册页上是这么说的(虽然不是很清楚),但其中的一些内容是完全错误的。

该策略只能是ACCEPTDROP内置链上。如果您想要拒绝所有与先前规则不匹配的数据包的效果,只需确保最后一条规则匹配所有内容并添加带有REJECT目标扩展名的规则即可。换句话说,添加所有相关规则后,执行iptables -t filter -A OUTPUT -j REJECT.

请参阅“可能的连锁政策是什么”主题有关详细信息,请参阅 netfilter 列表。

答案2

我找不到它的记录,但可以参考这里表示唯一允许的策略是 ACCEPT 或 DROP。通过查看可以确认这一点来源of libiptc(负责操纵规则)在第 2429 行左右,其中代码有

2429         if (strcmp(policy, LABEL_ACCEPT) == 0)
2430                 c->verdict = -NF_ACCEPT - 1;
2431         else if (strcmp(policy, LABEL_DROP) == 0)
2432                 c->verdict = -NF_DROP - 1;
2433         else {
2434                 errno = EINVAL;
2435                 return 0;
2436         }

原本的线建议最好的办法是在链的末尾添加 REJECT ,这应该是iptables -A OUTPUT -j REJECT

请注意,在此之前的代码是:

2423         if (!iptcc_is_builtin(c)) {
2424                 DEBUGP("cannot set policy of userdefinedchain `%s'\n", chain);
2425                 errno = ENOENT;
2426                 return 0;
2427         }
2428 

因此您根本无法在用户定义的链上设置策略。

答案3

REJECT没有OUTPUT意义; aREJECT将返回一个ICMP数据包这需要遍历网络。

添加一条新规则-j LOG作为最后一条规则(因此在策略之前DROP),以查看链中的内容OUTPUT

相关内容