清漆清除仅允许来自 public ip

varnish purge allowed only from a public ip

我的设置如下: Nginx(443 https)-> Varnish(端口 6081)-> Nginx(端口 83 - 应用程序本身)

#nginx https 配置文件:

location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 1800;
        proxy_request_buffering off;
        proxy_buffering off;
        proxy_pass http://127.0.0.1:6081;
}

#part of default.vlc 会议:

backend default {
    .host = "127.0.0.1";
    .port = "83";
}

当然,还有一个83端口的nginx配置,就是应用本身。 我已经这样配置了,所以我可以 运行 在 HTTPS 后面进行清漆。

尝试设置清除以使特定端点的缓存无效,我在 default.vcl 中配置了以下内容:

acl purge {
    "127.0.0.1";
    "some_public_ip"
  }

sub vcl_recv {
    if (req.method == "PURGE") {
      if (!client.ip ~ purge) { 
         return (synth(405, "This IP is not allowed to send PURGE requests."));
      }
      return (purge);
    }
}

一切正常,我可以执行:

curl -X PURGE -I "https://web_server/index.php".

问题是,如果我从 acl 列表中删除“127.0.0.1”,只让“some_public_ip”,它将不再起作用。它将 return“不允许此 IP 发送 PURGE 请求”。 我只希望清除仅适用于那个“some_public_ip”。 可能吗?

因为 Nginx 位于 Varnish 之前,client.ip 变量总是通过 localhost 引用它。实际的客户端 IP 地址存储在 X-Forwarded-For header.

调用std.ip(req.http.X-Forwarded-For,client.ip)即可解压。这会将 X-Forwarded-For 的值从字符串转换为 IP 地址,并且在出现错误时仍将使用 client.ip 作为后备。

因为Nginx已经设置了X-Forwarded-Forheader,varnish会把客户端的IP地址加进去

我的 varnishlog 输出显示以下日志行:

-   ReqUnset       X-Forwarded-For: 178.118.13.77
-   ReqHeader      X-Forwarded-For: 178.118.13.77, 127.0.0.1

我们必须删除第二部分才能获得正确的 IP 地址。我们可以使用以下 VCL 片段来完成此操作:

set req.http.X-Forwarded-For = regsub(req.http.X-Forwarded-For,"^([^,]+),.*$","");

最后,这是完成这项工作所需的 VCL 代码:

vcl 4.0;

import std;

acl purge {
    "127.0.0.1";
    "some_public_ip"
  }

sub vcl_recv {
    if(req.http.X-Forwarded-For ~ ","){
        set req.http.X-Forwarded-For = regsub(req.http.X-Forwarded-For,"^([^,]+),.*$","");
    }
    if (req.method == "PURGE") {
      if (!std.ip(req.http.X-Forwarded-For,client.ip) ~ purge) {
         return (synth(405, "This IP is not allowed to send PURGE requests."));
      }
      return (purge);
    }
}