Apache httpd:如何从所有子网中拒绝所有,从子网中允许但从该子网中的IP拒绝?


26

我正在使用股票Apache httpd-2.2.3运行CentOS 5.5。

我已在/ server-status位置启用了mod_status。我想通过以下方式允许访问该位置:

  1. 全部拒绝
  2. 允许来自子网192.168.16.0/24
  3. 拒绝IP地址为192.168.16.100的192.168.16.100。

1&2很容易。但是,由于我“允许来自192.168.16.0/24”,是否可以拒绝来自192.168.16.100?

我试图为192.168.16.100添加一个Deny语句,但是它不起作用。这是相关的配置:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

要么:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

但是,这不会阻止访问该特定页面,如访问日志中所示:

www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "

根据mod_authz_host的手册:

允许否认

首先,评估所有Allow指令;至少一个必须匹配,否则请求被拒绝。接下来,将评估所有“拒绝”指令。如果有匹配项,则请求被拒绝

IP地址与Deny指令匹配,因此不应拒绝请求吗?

根据mod_authz_host页面上的表,此IP地址应“同时匹配允许和拒绝”,因此应应用“最终匹配控件:拒绝”规则。

    比赛允许,拒绝结果拒绝,允许结果
    仅匹配允许允许请求允许请求
    仅匹配拒绝请求被拒绝请求被拒绝
    无匹配项默认为第二个指令:拒绝默认为第二个指令:允许
    同时匹配“允许”和“拒绝最终匹配”控件:拒绝最终匹配控件:“允许”

拒绝所有192.168.16.100-由于您在此处使用“ all”,因此我希望所有IP地址都拒绝所有请求。认为这里还有其他事情。
米迦

@Michah:我也在做一个Allow from 192.168.16.0/24。据我了解的文档,192.168.16.0 / 24网络中的任何请求者IP都将匹配此Allow语句,该请求被允许。
Stefan Lasiewski 2011年

遵循上面粘贴的文档。“首先,评估所有的Allow指令;至少一个必须匹配,否则请求将被拒绝” ==>这应该与您的“从192.168.16.0/24允许”匹配,但是“下一步,所有Deny指令都是第二部分”如果有匹配项,则请求将被拒绝”,并选择“来自所有人的拒绝”,不是每个请求都与第二部分匹配并因此被拒绝?
米迦

您真的应该考虑是否要拒绝该IP地址完全访问系统或仅从httpd访问该系统。如果前者继续使用apache指令的方法。如果是后者,则应在防火墙中完成。
安德鲁·凯斯

谢谢ACase。我只想拒绝从192.168.16.100到此特定页面的访问。我希望192.168.16.100能够访问此Web服务器上的所有其他页面。
Stefan Lasiewski,2011年

Answers:


35

我还没有测试过,但我想您已经快到了。

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Deny from all不需要。实际上,它会因为所有内容都匹配all而被破坏,因此被否决了(我认为Apache试图变得聪明,做一些愚蠢的事情)。我一直觉得Apache的OrderAllowDeny指令混淆,所以总是想象的事情在一个表(摘自该文档):

匹配| 允许,拒绝结果| 拒绝,允许结果
-------------------------------------------------- -----
仅允许| 允许| 允许的
仅拒绝| 拒绝| 被拒绝
没有匹配项| 默认值:拒绝| 默认值:允许
同时匹配| 决赛:被拒绝| 决赛:允许

使用以上设置:

  • 来自192.168.16.100的请求将“同时匹配”,因此被拒绝。
  • 来自192.168.16.12的请求将获得“仅允许”,因此被允许。
  • 来自123.123.123.123的请求获得“不匹配”,因此被拒绝。

1

我可能还会考虑为此添加IPTables规则,以拒绝端口80上的单个主机,拒绝所有主机,并允许子网。

允许子网后,从特定地址设置拒绝规则应该没有问题。只需按此顺序进行即可。


我已经更新了答案。我加入了“拒绝从192.168.16.100发送”规则,但仍然允许从192.168.16.100访问
Stefan Lasiewski 2011年

我想允许从此主机访问所有其他位置。但是,我想拒绝特定位置。IPTables在这里没有帮助我。
Stefan Lasiewski 2011年

除非您告知,否则IPTables不会明确拒绝出站流量。但是,您可以拒绝来自世界和特定地址的入站流量,但都允许子网。
迈克

我认为您误会了我的要求。我只想将此访问控制应用于/ server-status,而不是整个主机。据我所知,IPtables不能轻易做到这一点。
Stefan Lasiewski 2011年

-4

可以使用php吗?如果是这样,请添加php语句以退出/重定向该特定IP地址

例:

$ deny = array(“ 111.111.111”,“ 222.222.222”,“ 333.333.333”);

if(in_array($ _SERVER ['REMOTE_ADDR'],$ deny))

{标头(“位置:http : //www.google.com/ ”);

出口();

参考:http : //perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/


2
这必须在网络服务器托管的每个页面中。该解决方案不切实际,不是您想要过滤对Web服务器访问的地方。
安德鲁·凯斯
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.