问题描述
在其中带有ACL的清漆配置上进行工作,其中一部分引用ipv4通配符以确保匹配的ip格式正确。但是,这似乎剥夺了任何ipv6地址,因此我们不能基于ipv6列入白名单。
根据清漆文档,“ ||”运算符应作为逻辑或,因此我应该能够允许为ipv6通配符匹配0.0.0.0 OR ::的内容。但是,如果我使用||操作符,清漆不会重新启动,并且清漆状态专门标记了||。运营商作为问题。
Aug 26 10:40:47 server17 varnishd[14748]: ('/etc/varnish/default.vcl' Line 163 Pos 74)
Aug 26 10:40:47 server17 varnishd[14748]: if ((std.ip(req.http.X-Actual-IP,"0.0.0.0") !~ admin) && req.url ~ "^/") || if ((std.ip(req.http.X-Actu... "^/") {
Aug 26 10:40:47 server17 varnishd[14748]: -------------------------------------------------------------------------##----------------------------...---------
Aug 26 10:40:47 server17 varnishd[14748]: Running VCC-compiler Failed,exited with 2
这只是我尝试使用OR运算符进行的一种最新安排,但是无论它是否包含在原始查询的括号内,错误始终会突出显示该运算符
在清漆文档中的任何地方都没有给出使用中逻辑或的实际示例,因此我不确定在这里我是如何不正确地使用它。它刚刚被弃用了吗?
解决方法
我试图在某种程度上复制您的用例,但是以下有关VCL片段的最重要部分是使用||
运算符的事实。
在此示例中,匹配了 acl ,而使用 or子句完成了其他一些匹配。
vcl 4.1;
import std;
acl acl {
"172.21.0.1";
}
sub vcl_recv {
set req.http.x-ip = std.ip(client.ip,"0.0.0.0");
if ( std.ip(client.ip,"0.0.0.0") !~ acl || req.http.x-ip == "0.0.0.0" || req.http.x-ip == "::") {
return(synth(403,"Forbidden for " + req.http.x-ip));
}
}