Varnish VCL只需将client.ip替换为req.http.x-forwarded-for

时间:2016-05-03 09:47:18

标签: varnish varnish-vcl x-forwarded-for

在我的Varnish 2设置中,我有一个清除/禁止块,如下所示:

acl purge {
    "localhost";
    "x.x.x.x"/24;
}

sub vcl_recv {
    if (req.request == "PURGE") {
        if (!client.ip ~ purge) {
            error 405 "Not allowed.";
        }
        return (lookup);
    }
    if (req.request == "BAN") {
        if (!client.ip ~ purge) {
            error 405 "Not allowed.";
        }
        ban("obj.http.x-host == " +req.http.host+" && obj.http.x-url ~ "+req.url);

        # Throw a synthetic page so the
        # request wont go to the backend.
        error 200 "Ban added";
    }
}

我希望我可以简单地替换client.ip的if语句中的req.http.x-forwarded-for,但是当我执行以下编译错误时会发生:

Message from VCC-compiler:
Expected CSTR got 'purge'
(program line 944), at
('purging-banning.vcl' Line 16 Pos 41)
    if (!req.http.x-forwarded-for ~ purge) {

----------------------------------------#####----

Running VCC-compiler failed, exit 1
VCL compilation failed

我一直在搜索Google和StackOverflow,但我还没有找到解决问题的好方法,或者req.http.x-forwarded-for不能在这里找到正确位置的原因。

谁可以提供帮助?

2 个答案:

答案 0 :(得分:2)

尝试使用" ip"来自vmod_std。请参阅:https://varnish-cache.org/docs/trunk/reference/vmod_std.generated.html#func-ip

像这样:

if (std.ip(req.http.x-forwarded-for, "0.0.0.0") !~ purge) {
    error 405 "Not allowed.";
}

这只是将字符串对象转换为IP对象。然后,可以将IP对象与IP acl列表进行比较。

答案 1 :(得分:1)

我没有'rep'来评论,所以我尝试使用std.ip确认答案。我有相同的情况,并使用std.ip进行了修复。请记住在您的default.vcl中添加import std

另外,就我而言,nginx正在转发到清漆,并且X-Forwarded-For有时其中有2个IP,所以我使用了X-Real-IP,在我的nginx转发中将其设置为$remote_addr配置。