清漆 - 用于IP地址的旁路缓存

时间:2013-09-05 20:19:12

标签: varnish

我们正在使用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地址。负载均衡器。

2 个答案:

答案 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