Apache LimitExcept GET 到 IP 地址但拒绝其他 IP 的所有方法

Apache LimitExcept GET 到 IP 地址但拒绝其他 IP 的所有方法

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,AllowAllow from all覆盖任何Deny from ...

Order Deny,Allow不匹配时的默认行为是“允许”。如果删除“ Allow from all”,效果是否更接近预期?

每个部分<Directory>还继承了祖先(即较短路径)<Directory>设置,因此也<LimitExcept>适用于其他<Directory>部分。您不能简单地通过添加来撤消此操作

<Limit GET HEAD>
    Allow from all
</Limit> 

对这些,因为这也会撤消您对那里的不良 IP 地址的阻止。(但我不知道您是否需要在您的网站上撤消它。)

关于“订购/允许/拒绝”,需要记住的重要事项是:

  • 这不是像传统访问控制那样的首次匹配逻辑
  • 检查AllowDeny是否匹配
  • 哪一个获胜(AllowDeny)以及默认值是什麽都取决于Order

拥有重复的块并不是一个好主意<Directory ...>,但如果确实如此,它们将按照配置中出现的顺序进行处理。

请参阅 Apache 文档以了解完整逻辑:http://httpd.apache.org/docs/2.2/sections.html

由于您的要求不太符合简单的允许/拒绝逻辑,您应该考虑使用以下任一或两者:

  • SetEnvIfAllow 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 保存在单独的文件中,作为更具可扩展性的解决方案。

相关内容