基于客户端 IP 的负载均衡器后面的清漆 ACL

KM.*_*KM. 3 varnish load-balancing access-control-list

在以下设置中:

Client -> LB -> Varnish
Run Code Online (Sandbox Code Playgroud)

我想配置 Varnish acls 以根据客户端的 IP 执行某些操作。LB 在一个名为“ClientIP”的变量中发送客户端的 IP,Varnish 可以通过它读取req.httpd.ClientIP.我试过这个:

acl admin_net {
  "10.10.1.160"/27;
}

sub vcl_deliever {
  if (req.http.ClientIP ~ admin_net) {
  // do something ... 
  }  
}
Run Code Online (Sandbox Code Playgroud)

但是 VCL 编译失败并显示“预期的 CSTR 得到了‘admin_net’”(C 字符串?)。我可以通过 解决这个问题req.http.ClientIP ~ "10.10.1.*"),但我必须注释掉 ACL 行。

有没有另一种方法可以让这个与 ACL 一起工作?我也看了看client.ip,这是一个只读变量。在上面的设置中,它包含 LB 的 IP 而不是客户端的 IP。

And*_*rei 5

这可以使用std.ip完成,假设 ClientIP 标头已经在 vcl_recv() 中设置。例如:

vcl 4.0;
import std;

acl admin_net {
  "10.10.1.160/27";
}

sub vcl_deliver {
  if (std.ip(req.http.ClientIP,"0.0.0.0") ~ admin_net) {
  // do something ... 
  }  
}
Run Code Online (Sandbox Code Playgroud)