![Apache httpd:我如何才能拒绝所有内容、允许子网内容但拒绝该子网内的 IP 内容?](https://linux22.com/image/542405/Apache%20httpd%EF%BC%9A%E6%88%91%E5%A6%82%E4%BD%95%E6%89%8D%E8%83%BD%E6%8B%92%E7%BB%9D%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9%E3%80%81%E5%85%81%E8%AE%B8%E5%AD%90%E7%BD%91%E5%86%85%E5%AE%B9%E4%BD%86%E6%8B%92%E7%BB%9D%E8%AF%A5%E5%AD%90%E7%BD%91%E5%86%85%E7%9A%84%20IP%20%E5%86%85%E5%AE%B9%EF%BC%9F.png)
我正在运行带有原装 Apache httpd-2.2.3 的 CentOS 5.5。
我已经启用mod_status在位置 /server-status。我希望以下列方式允许访问此单个位置:
- 全部拒绝
- 允许来自子网 192.168.16.0/24
- 拒绝来自 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 添加 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 指令;至少有一个必须匹配,否则请求将被拒绝。接下来,评估所有 Deny 指令。如果有任何匹配,则请求将被拒绝
该 IP 地址与 Deny 指令匹配,那么不应该拒绝该请求吗?
根据 mod_authz_host 页面上的表格,此 IP 地址应该“匹配允许和拒绝”,因此应该应用“最终匹配控制:拒绝”规则。
匹配 允许、拒绝结果 拒绝、允许结果 匹配 仅允许 请求允许 请求允许 匹配 仅拒绝 请求被拒绝 请求被拒绝 无匹配 默认为第二条指令:拒绝 默认为第二条指令:允许 匹配允许和拒绝 最终匹配控制:拒绝 最终匹配控制:允许
答案1
我还没有测试过,但我认为你已经快完成了。
<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 的Order
、Allow
和Deny
指令令人困惑,所以总是在表格中可视化事物(取自文档):
匹配 | 允许、拒绝结果 | 拒绝、允许结果 ------------------------------------------------------- 仅允许 | 允许 | 允许 仅拒绝 | 已拒绝 | 已拒绝 无匹配 | 默认:拒绝 | 默认:允许 双方匹配 | 最终匹配:拒绝 | 最终匹配:允许
使用上述设置:
- 来自 192.168.16.100 的请求被“匹配两者”并因此被拒绝。
- 来自 192.168.16.12 的请求被“仅允许”并因此被允许。
- 来自 123.123.123.123 的请求显示“不匹配”,因此被拒绝。
答案2
我可能还会考虑添加 IPTables 规则,以拒绝端口 80 上的单个主机、拒绝所有主机,并允许子网。
允许子网后,设置来自特定地址的拒绝规则应该没有问题。只需按顺序进行即可。
答案3
您可以使用 php 吗?如果可以,请添加一个 php 语句以退出/重定向该特定 IP 地址
例子:
$deny = 数组("111.111.111", "222.222.222", "333.333.333");
如果 (in_array ($_SERVER['REMOTE_ADDR'], $deny))
{ 标题(“位置:http://www.google.com/");
出口();
参考: http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/