Apache 对 IP (X-Forwarded-For) 或有效用户的访问控制

Apache Access Control to IPs (X-Forwarded-For) or valid-user

我曾经使用 valid-user 或 ip 指令来阻止对我的 Apache 服务器的某些文件夹的访问,如下所示:

<Directory "/home/domain/public_html/secure">
    Require ip x.x.x.x
    Require ip y.y.y.y
    AuthType Basic
    AuthUserFile "/home/domain/secure/pass"
    AuthName "Authentication Required"
    Require valid-user
    Satisfy Any
</Directory>

现在,我已将我的服务器放在 F5-BIGIP 设备后面,这不会让我完全 DNAT 客户端的连接。该设备也在 Linux 服务器后面,该服务器充当网关,DNAT/SNAT 规则帽子正在相应地工作。不过,我可以通过 X-Forwarded_For 记录客户端的 IP。但是我的 Apache 指令不再起作用了。

所以我的问题是,有什么方法可以使用 Require X-Forwarded-For x.x.x.x 之类的东西吗?

我的 Apache 版本是:

[root@webserver1 ~]# apachectl -version
Server version: Apache/2.4.6 (CentOS)
Server built:   May 12 2016 1

0:27:23

提前致谢。

您应该可以执行以下操作:

SetEnvIf X-Forwarded-For x.x.x.x$ foo
SetEnvIf X-Forwarded-For y.y.y.y$ bar
...
Require env foo
Require env bar

您不能直接访问 headers 作为 require 指令的一部分,因此设置一个匹配的环境变量,并将其用作测试:

SetEnvIf X-Forwarded-For "^123\.456\.78\.9" MyAllowedIPAddress
Require env MyAllowedIPAddress

备注:

  • SetEnvIf 需要正则表达式作为测试
  • 环境变量名随便起(不要冲突!)
  • SetEnvIf 指令之后进行评估,因此如果您同时使用两者,将会造成混淆。下面是使用 的替代方法。
    <if "%{HTTP:X-Forwarded-For} == '123.456.78.9'">
          Require all granted
    </if>
    <else>
          Require all denied
    </else>