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


11

我目前将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上,如果有什么不同的话。这里有人有见识吗?


您可以显示有问题的iptables规则吗?
bahamat 2012年

Answers:


15

REJECT目标扩展,而连锁店政策必须是目标。手册页上说(虽然还不是很清楚),但是其中一些内容显然是错误的。

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

有关更多详细信息,请参见netfilter列表上的“可能的链策略是什么”线程


这是有道理的,最后的通用REJECT应该可以工作。出于好奇,目标扩展定义是否在某个地方相当明显,而我只是想念它,还是该文献记载不充分的位之一?
ND怪胎

1
阅读整个手册页,很明显REJECT是目标扩展,但是手册页长,因此倾向于使用“ TL; DR”。这也意味着DROP,ACCEPT 和QUEUE是有效的策略目标;从当前代码来看,QUEUE不是!
StarNamer 2012年

4

我找不到文档,但是这里的参考表明唯一允许的策略是ACCEPTor DROP。这是通过观察确认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 

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


该线程中的命令不正确;-p用于根据协议进行匹配;他的意思是-A像我的回答所说。
肖恩·高夫

那很有趣。我的好奇心想知道背后是否有原因,或者这仅仅是事情的原因,可能是出于简单的缘故(简单的代码毕竟意味着更少的漏洞点)。如果我什至是一个温和的开发人员,我可能会很想在本地对其进行破解,但是由于我不是,并且鉴于它是安全性的一部分,所以我不会去碰它。
ND怪胎

2

REJECTOUTPUT是没有意义的; a REJECT将返回需要遍历网络的ICMP数据包

添加一条新-j LOG规则作为最后一条规则(因此在该规则之前DROP),以查看在OUTPUT链中起什么作用的。


1
REJECTICMP数据包不能在lo接口上返回吗?我同意a LOG对于进行故障排除很有用,但是我真正希望的是一种提醒我“哦,是的...那可能是我的DROPiptables默认值阻止了”的方法,而不是5分钟故障排除方法,请同事访问XYZ服务器 意识到这可能是本地的,这是我最常用的方法,因为我通常的工作日很少碰到我还没有开过孔的事情。当然,也许我需要更好地记住这一点,但是扁平化REJECT更加明显。
ND怪胎

我不认为出于多种原因,您都不希望该ethX接口在该接口上生成流量lo。他们非常独立。您可以轻松地将链条应用于一个而不是另一个。
亚伦·马拉斯科
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.