Wac*_*Get 2 linux apache cloudflare
我使用 .htaccess 文件将目录访问权限限制为某些 IP 地址,如下所示:
AuthType Basic
AuthName "Protected"
<RequireAny>
Require ip 1.2.3.4
</RequireAny>
Run Code Online (Sandbox Code Playgroud)
这在正常的服务器设置中工作正常,但是当使用 Cloudflare 作为 WAF 代理时,它停止工作,因为服务器接收通过 Cloudflare 的 IP 代理的所有请求。
作为一种解决方法,可以使用“X-Forwarded-For”标头来识别客户端的“真实”IP 地址,因为 Cloudflare 将其与其所有请求一起传递:
AuthType Basic
AuthName "Protected"
SetEnvIf X-Forwarded-For 1.2.3.4$ allowed
<RequireAny>
Require env allowed
</RequireAny>
Run Code Online (Sandbox Code Playgroud)
这是一种安全的方法,还是在使用 Cloudflare 时有更好/更安全的方法来限制 Apache 中客户端 IP 的访问?
根据IETF RFC 2616,第4.2节,头部可容纳一个逗号分隔值的列表,这是的情况下X-Forwarded-For作为 CloudFlare的使用它。
如果 X-Forwarded-For 标头已存在于 Cloudflare 的请求中,Cloudflare 会将 HTTP 代理的 IP 地址附加到标头:
Run Code Online (Sandbox Code Playgroud)Example: X-Forwarded-For: 203.0.113.1,198.51.100.101,198.51.100.102在上面的示例中,203.0.113.1 是原始访问者 IP 地址,198.51.100.101 和 198.51.100.102 是通过 X-Forwarded-For 标头提供给 Cloudflare 的代理服务器 IP 地址。
习惯上将最左边的 IP 作为真实 IP,但情况并非总是如此。
如果你这样做,你应该检查一个与你的 IP 匹配的正则表达式
SetEnvIf X-Forwarded-For ^1\.2\.3\.4 allowed
Run Code Online (Sandbox Code Playgroud)
(最左边的 IP,转义点)
Cloudflare 还会发送标头cf-connecting-ip(这意味着是在发送到您的机器之前命中 cloudflare 的最后一个 IP),我宁愿使用该标头。
这是一种安全的方法,还是在使用 Cloudflare 时有更好/更安全的方法来限制 Apache 中客户端 IP 的访问?
有一个问题。在这种情况下,您告诉 Apache:
“我们在中间有 cloudflare,所以不是你告诉访问者 IP 的本地方式,而是让我们看看这个自定义标头”。
可以伪造该自定义标头。绝对地。因此,您还应该说:
“当且仅当请求来自 Cloudflare IP 时,此自定义标头应被视为可靠”。
最后,您应该使用mod_remoteip而不是手动构建 SetEnvIf 规则。
基本上:
# /etc/apache2/conf-enabled/remoteip.conf
RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxy 173.245.48.0/20
RemoteIPTrustedProxy 103.21.244.0/22
...
RemoteIPTrustedProxy 2606:4700::/32
RemoteIPTrustedProxy 2803:f800::/32
Run Code Online (Sandbox Code Playgroud)
或者,将 IP 列表放在单独的文件中:
# /etc/apache2/conf-enabled/remoteip.conf
RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxyList conf/trusted-proxies.lst
Run Code Online (Sandbox Code Playgroud)
和
# conf/trusted-proxies.lst
173.245.48.0/20
103.21.244.0/22
...
...
2803:f800::/32
2606:4700::/32
Run Code Online (Sandbox Code Playgroud)
如果请求中没有所述标头,Apache 将退回到 REMOTE_ADDR。来自不受信任的 IP 的请求也是如此。如果标头存在且来自 Cloudflare,您只需执行以下操作:
Require ip 1.2.3.4
Run Code Online (Sandbox Code Playgroud)
这种方法在您需要使用它的任何地方(日志、身份验证等)替换 IP,并在边缘情况下优雅地回退到原始 REMOTE_ADDR。
| 归档时间: |
|
| 查看次数: |
2688 次 |
| 最近记录: |