Varnish PURGE 客户端 ip docker-compose

Varnish PURGE 客户端 ip docker-compose

我正在尝试为 Magento2 配置清漆。

问题:我无法配置 PURGE varnish 缓存。

这是我的构建:https://github.com/zhartaunik/magento2-docker

清漆设置:https://github.com/zhartaunik/magento2-docker/tree/master/docker/varnish

我正在使用 docker-compose。Varnish FROM varnish:6.2 vcl 4.0;

我正在尝试以安全的方式配置 purge 命令。我不确定如何配置 varnish 的最佳实践是什么,但 Magento 建议如下:

acl purge {
    "nginx";
}

并有如下验证:

sub vcl_recv {
    if (req.method == "PURGE") {
        if (!client.ip ~ purge) {
            return (synth(405, "Purging not allowed for " + client.ip));
        }

就我而言,当我尝试从控制台/管理 UI 中清除清漆时 - 我总是面临以下错误:

<!DOCTYPE html>
<html>
  <head>
    <title>405 Purging not allowed for 192.168.128.7</title>
  </head>
  <body>
    <h1>Error 405 Purging not allowed for 192.168.128.7</h1>
    <p>Purging not allowed for 192.168.128.7</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 32770</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>

在docker重启之后,这个IP地址就改变了。

当我尝试使用容器名称配置 acl purge 时,我仍然遇到相同的错误。但是,将容器名称添加到“白名单”并运行

curl-k-X清除https://magento2.docker

通过本次验证。

配置部分的最佳和最安全的方法是什么acl purge

答案1

如果你使用Nginx身为你的TLS 终止器client.ip价值有风险总是NginxIP。这是可以预见的,但不一定安全。

你应该做的是确保Nginx&使用相互连接PROXY 协议. 这将确保原始客户端 IP 被传输并存储在 中client.ip

在 Varnish 上设置 PROXY 协议

为了使PROXY 协议在 Varnish 中使用您的 Docker 设置在,您需要修改 的值${VARNISH_LISTEN}

你可以这样做:

ENV VARNISH_LISTEN  :6081,PROXY

此时,Varnish 不再接受传统的HTTP 连接

在 Nginx 中设置 PROXY 协议

根据文档,Nginx 支持proxy_protocol自版本起1.9.2。这似乎与您在 Dockerfile 中使用的版本兼容。

只需将以下行添加到您的/docker/nginx/etc/vhost.conf文件即可:

proxy_protocol on;

使用 PROXY 协议的附加值是,X-Forwarded-For无论 Varnish 前面有多少个代理节点,Varnish 设置的值将始终包含原始客户端的 IP 地址。

后备方案

如果PROXY 协议在 Nginx 中不是一个选项,我可以给你 3 个备选方案:

  1. 使用 Hitch 作为你的 TLS 代理:它支持PROXY 协议,它非常轻量,由 Varnish Software 开发
  2. 使用 HAProxy 作为你的 TLS 代理:他们发明了PROXY 协议,它比 Hitch 重一点
  3. 不要使用PROXY 协议并匹配X-Real-IP您的 ACL 中的值。此标头由 Nginx 设置,并根据 Nginx 包含客户端 IP。

相关内容