Apache httpd:我如何拒绝所有人,允许来自子网,但拒绝来自该子网内的 IP?

Ste*_*ski 26 mod-authz-host apache-2.2

我正在运行 CentOS 5.5 和 Apache httpd-2.2.3。

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

  1. 拒绝所有人
  2. 允许来自子网 192.168.16.0/24
  3. 拒绝来自 192.168.16.0/24 子网内的 IP 192.168.16.100。

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

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

<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>
Run Code Online (Sandbox Code Playgroud)

或者:

<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>
Run Code Online (Sandbox Code Playgroud)

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

www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "
Run Code Online (Sandbox Code Playgroud)

根据mod_authz_host的手册:

允许否认

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

IP 地址匹配 Deny 指令,所以不应该拒绝请求吗?

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

    匹配允许、拒绝结果 拒绝、允许结果
    仅匹配允许请求允许请求允许
    仅匹配拒绝 请求被拒绝 请求被拒绝
    不匹配 默认为第二个指令:拒绝 默认为第二个指令:允许
    匹配允许和拒绝 最终匹配控件:拒绝 最终匹配控件:允许

phu*_*ehe 36

我还没有测试,但我想你快到了。

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  192.168.16.100
    Allow from 192.168.16.0/24
</Location>
Run Code Online (Sandbox Code Playgroud)

Deny from all不需要。事实上,它会搞砸,因为一切都会匹配all,因此被拒绝(我认为 Apache 正试图变得聪明并做一些愚蠢的事情)。我总是发现 Apache 的Order,AllowDeny指令令人困惑,所以总是在表格中可视化事物(取自docs):

匹配 | 允许,拒绝结果 | 拒绝,允许结果
-------------------------------------------------- -----
只允许 | 允许 | 允许
仅拒绝 | 拒绝 | 拒绝
不匹配 | 默认值:拒绝 | 默认值:允许
两者都匹配 | 决赛:拒绝 | 决赛:允许

使用上述设置:

  • 来自 192.168.16.100 的请求得到“两者都匹配”并因此被拒绝。
  • 来自 192.168.16.12 的请求获得“仅允许”并因此被允许。
  • 来自 123.123.123.123 的请求得到“No match”并因此被拒绝。