Varnish 4 + Pounds - 绕过特定 IP 地址的缓存

Varnish 4 + Pounds - Bypass cache for specific IP Address

我正在尝试将 Varnish 配置为不对特定 IP 使用缓存。

我已经在 CentosApache 上使用 配置了 Varnish 4 ]英镑管理HTTPS请求。

我试过采用这种方法:

Varnish - Bypass Cache for IP Address

基于

https://zcentric.com/2012/03/16/varnish-acl-with-x-forwarded-for-header/

使用一些 C 代码来管理 IP。建议的代码适用于 Varnish3(例如 "sp" 不再存在,现在有一个 ctx 变量)

我尝试过使用这种方法 Inline C Varnish (VCL_deliver) 但我收到 *"initialization from incompatible pointer type [-Werror] in struct sockaddr_storage client_ip_ss = VRT_r_client_ip(ctx); " 错误,可能是因为类型也已更改。

我尝试使用的代码是:

struct sockaddr_storage *client_ip_ss = VRT_r_client_ip(ctx); 
struct sockaddr_in *client_ip_si = (struct sockaddr_in *) client_ip_ss; 
struct in_addr *client_ip_ia = &(client_ip_si->sin_addr); 
const struct gethdr_s hdr = { HDR_REQ, "20X-Forwarded-For:" }; 
char *xff_ip = VRT_GetHdr(ctx, &hdr);

但我做错了。

我现在有点迷茫了,如何在 Varnish 4 上为特定 IP 禁用 varnish?

谢谢

请不要在 Varnish 中编写内联 C:这有风险,您正在寻找的解决方案已经在 Varnish 中自动实现。

Keep in mind that Varnish v3 & v4 are no longer supported, please use Varnish 6

清漆自动设置 X-Forwarded-For header

如果您想根据 X-Forwarded-For 值从缓存中排除项目,您仍然可以使用 client.ip 并将该值与 acl.

匹配

Varnish 会自动从其客户端获取 IP 并将其存储在 X-Forwarded-For header 中。这意味着 client.ip 的值与 req.http.X-Forwarded-For.

完全相同

多个代理和 PROXY 协议

如果在到达 Varnish 之前使用其他代理,您必须确保它们通过 PROXY 协议 进行通信。 Varnish 支持 PROXY 协议,你的其他代理也应该支持。

你的情况是英镑。 Varnish 社区建议 Hitch 终止 TLS。

在Varnish中启用PROXY协议支持是通过开放特定的监听地址来完成的:

varnishd -a :80 -a :8443,PROXY

然后 Varnish 可以通过 PROXY 协议接受端口 8443 上的连接。

The main advantage of using the PROXY protocol is that the original client IP address is transmitted all the way to Varnish. Regardless of the number of proxies in front of Varnish, the client.ip value will always be the IP address of the original client.

如果 Pound 不支持 PROXY 协议,我会建议你切换到 Hitch

定义 ACL

一旦您设法设置支持 PROXY 协议的 TLS 终止,您只需编写一些 VCL 来传递缓存中的项目,如下所示:

acl passem { "7x.xxx.xxx.xxx"; }
sub vcl_recv {
  if (!(client.ip ~ passem)) {
    return (pass);
  }
}