我们正在使用Varnish 3.0.3。 Varnish是负载均衡器的背后。
我们希望绕过特定IP地址的Varnish缓存。经过研究,我发现了以下内容。不幸的是,它没有用。
acl passem { "7x.xxx.xxx.xxx"; }
sub vcl_recv {
if (!(client.ip ~ passem)) {
return (pass);
}
}
这会显示在varnishlog
"6 VCL_acl c NO_MATCH passem"
我不确定是什么问题。我唯一能想到的是Varnish没有看到传入的IP地址。这就是我在varnishlog
中看到的内容。
6 RxHeader c X-Real-IP: "7x.xxx.xxx.xxx"
6 RxHeader c X-Forwarded-For: "7x.xxx.xxx.xxx"
6 SessionOpen c 10.10.10.4 58143 0.0.0.0:80
6 ReqStart c 10.10.10.4 58143 1026834560
RxHeader正在接收正确的IP并匹配acl passem
,但我不知道acl passem
是否引用SessionOpen
IP地址,即IP地址。负载均衡器。
答案 0 :(得分:4)
在Varnish中,"X-Real-IP"
和"http.x-forwarded-for"
是字符串,"client.ip"
是对象。
将IP地址从"X-Forwarded-For"
标题复制到Varnish的client_ip结构中需要额外的代码。
以下是使其工作所需的内容。这成功了。积分转到http://zcentric.com/2012/03/16/varnish-acl-with-x-forwarded-for-header/
C{
#include <netinet/in.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
}C
acl passem { "7x.xxx.xxx.xxx"; }
sub vcl_recv {
C{
struct sockaddr_storage *client_ip_ss = VRT_r_client_ip(sp);
struct sockaddr_in *client_ip_si = (struct sockaddr_in *) client_ip_ss;
struct in_addr *client_ip_ia = &(client_ip_si->sin_addr);
char *xff_ip = VRT_GetHdr(sp, HDR_REQ, "\020X-Forwarded-For:");
if (xff_ip != NULL) {
inet_pton(AF_INET, xff_ip, client_ip_ia);
}
}C
if (!(client.ip ~ passem)) {
return (pass);
}
}
答案 1 :(得分:1)
是的,您的client.ip将是真正的IP,而不是标头中转发的任何内容。相反,您需要使用正确的标头req.http.X-Real-IP
。