2016-05-03 11 views
0

In meinem Varnish 2 Setup habe ich eine Spülung/Block Verbot etwa so:Varnish VCL ersetzen einfach client.ip für req.http.x-forwarded-for

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"; 
    } 
} 

ich erwarten würde, dass ich konnte einfach ersetzen Sie die client.ip in den if-Anweisungen für req.http.x-forwarded-for, aber wenn ich den folgenden Compiler-Fehler auftritt tun:

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 

ich habe Google und Stackoverflow gesucht, aber ich habe nicht eine gute Lösung für mein Problem noch nicht gefunden, oder der Grund, warum req.http.x-forwarded-for hier nicht an der richtigen Stelle wäre.

Wer kann helfen?

+2

Ihr Beispiel scheint nicht mit dem Fehler übereinzustimmen, Sie scheinen nur "client.ip" zu haben. Jedoch ist nur eine Notiz client.ip ein tatsächliches IP-Objekt, während req.http.x-forwarded-for eine Zeichenfolge ist. Purge ist im Grunde eine Liste von IP-Mappings und ist ein spezielles Varnish-Objekt –

+0

Danke! Interessante Notiz in der Tat :) – vrijdenker

Antwort

1

Versuchen Sie es mit "ip" von der vmod_std. Siehe: https://varnish-cache.org/docs/trunk/reference/vmod_std.generated.html#func-ip

Wie so:

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

Dies einfach konvertiert ein String-Objekt in ein IP-Objekt. Dann kann das IP-Objekt mit den IP-acl-Listen verglichen werden.

+0

Danke. Ich kann das derzeit nicht ausprobieren (mein Originalbeitrag war vor über einem Jahr), daher kann ich deine Antwort nicht als "die Antwort" bezeichnen. Ich hoffe jedoch, dass Ihre Antwort anderen - oder mir - in Zukunft helfen kann. Wenn ich das mal testen kann, werde ich es euch wissen lassen. – vrijdenker