Order
我在 Apache 的 vhost 配置中正确获取指令时遇到了一些问题。
我想完全拒绝某些 IP 地址对整个虚拟主机的访问。这些 IP 地址之前已被标记为恶意。
我还想拒绝除我们的内部 IP 范围之外的所有 IP 地址的 GET 和 HEAD 以外的所有请求。
我对第一个指令感到困惑Directory
,不知道如何最好地安排它与Order
指令的关系。
这是我目前所得到的,但它似乎不起作用,所以我想得到一些关于如何最好地订购这个块的建议......
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.test.com
ServerAlias test.com
DocumentRoot /var/www/html/www.test.com
<Directory /var/www/html/www.test.com>
Options +FollowSymLinks
Order Deny,Allow
# Deny suspect IPs previously flagged
Deny from 111.111.111.111
Deny from 222.222.222.222
Deny from 333.333.333.333
# But only internal IPs can POST
<LimitExcept GET HEAD>
Deny from all
Allow from 10.10.0.0/22
</LimitExcept>
Allow from all
</Directory>
# CLI directory not web accessible
<Directory /var/www/html/www.test.com/cli>
Order Deny,Allow
Deny from all
</Directory>
# Restrict access to admin internal IPs only
<Directory /var/www/html/www.test.com/admin>
Order Deny,Allow
Deny from all
Allow from 10.10.0.0/22
</Directory>
</VirtualHost>
现在我的脑子里一片混乱,我看不清楚。有人知道该怎么做吗?
Directory
我可以对同一个目录使用多个指令吗?
那么我将拒绝恶意 IP 与拒绝除 GET 和 HEAD 之外的所有请求分开吗?
答案1
当您使用Order Deny,Allow
将Allow from all
覆盖任何Deny from ...
。
Order Deny,Allow
不匹配时的默认行为是“允许”。如果删除“ Allow from all
”,效果是否更接近预期?
每个部分<Directory>
还继承了祖先(即较短路径)<Directory>
设置,因此也<LimitExcept>
适用于其他<Directory>
部分。您不能简单地通过添加来撤消此操作
<Limit GET HEAD>
Allow from all
</Limit>
对这些,因为这也会撤消您对那里的不良 IP 地址的阻止。(但我不知道您是否需要在您的网站上撤消它。)
关于“订购/允许/拒绝”,需要记住的重要事项是:
- 这不是像传统访问控制那样的首次匹配逻辑
- 检查
Allow
和Deny
是否匹配 - 哪一个获胜(
Allow
或Deny
)以及默认值是什麽都取决于Order
。
拥有重复的块并不是一个好主意<Directory ...>
,但如果确实如此,它们将按照配置中出现的顺序进行处理。
请参阅 Apache 文档以了解完整逻辑:http://httpd.apache.org/docs/2.2/sections.html
由于您的要求不太符合简单的允许/拒绝逻辑,您应该考虑使用以下任一或两者:
SetEnvIf
和Allow from env=...
Deny from env=...
mod_rewrite
这是实现此目的的一种方法:
RewriteEngine on
RewriteCond %{REMOTE_ADDR} 1.1.1.1 [OR]
RewriteCond %{REMOTE_ADDR} 2.2.2.2 [OR]
RewriteCond %{REMOTE_ADDR} 3.3.3.3
RewriteRule . - [F]
将其放在<Virtualhost>
外部和</Directory>
容器中。如果 IP 列表很大或不稳定,您还可以使用RewriteMap
上述方法的变体将 IP 保存在单独的文件中,作为更具可扩展性的解决方案。