我目前将 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
是一个目标延伸,而连锁政策必须是目标。手册页上是这么说的(虽然不是很清楚),但其中的一些内容是完全错误的。
该策略只能是ACCEPT
或DROP
内置链上。如果您想要拒绝所有与先前规则不匹配的数据包的效果,只需确保最后一条规则匹配所有内容并添加带有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
。