Lack automagisch hinzufügen load balancer IP zu X-Forwarded-For-header
Meine Anfrage läuft wie folgt ab;
HAProxy --> Varnish (4.0.1) --> Apache web backends
Wenn ein neuer request kommt in HAProxy, die client-IP-Adresse Hinzugefügt wird, die X-Forwarded-For
header (was gut ist!). Aber es sieht aus wie Lack, ist das hinzufügen der HAProxy
IP-als auch. Wenn die Anfrage erhält, um mein vcl_recv
routine, die X-Forwarded-For
header:
X-Forwarded-For: end-user-ip, haproxy-ip
Können Sie sehen, dass in der varnishlog
Ausgabe:
* << Request >> 8
- Begin req 7 rxreq
- Timestamp Start: 1409262358.542659 0.000000 0.000000
- Timestamp Req: 1409262358.542659 0.000000 0.000000
- ReqStart 192.168.1.103 48193
- ReqMethod PURGE
- ReqURL /some/path
- ReqProtocol HTTP/1.1
- ReqHeader Authorization: Basic xxx
- ReqHeader User-Agent: curl/7.30.0
- ReqHeader Host: example.com
- ReqHeader Accept: */*
- ReqHeader X-Forwarded-For: 1.2.3.4
- ReqHeader Connection: close
- ReqUnset X-Forwarded-For: 1.2.3.4
- ReqHeader X-Forwarded-For: 1.2.3.4, 192.168.1.101
- VCL_call RECV
- ReqUnset X-Forwarded-For: 1.2.3.4, 192.168.1.101
- VCL_acl NO_MATCH purge_acl
- Debug "VCL_error(403, Not allowed.)"
- VCL_return synth
Den Grund brauche ich die genaue client-IP-Adresse, so kann ich es gegen ACL-Regeln für PURGE
/BAN
. Seit der letzten IP in der X-Forwarded-For
header ist, dass der HAProxy, die ACL-Prüfung fehlschlägt, für alle IPs. Hier ist der relevante Teil meiner config:
acl purge_acl {
"1.2.3.4";
}
sub vcl_recv {
set req.backend_hint = load_balancer.backend();
if (req.method == "PURGE") {
if (!std.ip(req.http.X-forwarded-for, "0.0.0.0") ~ purge_acl) {
return(synth(403, "Not allowed."));
}
ban("obj.http.x-url ~ " + req.url);
return(synth(200, "Ban added"));
}
}
Irgendwelche Ideen, wie kann ich verlassen sich ausschließlich auf die X-Forwarded-For
header von HAProxy, ohne Lack Manipulation mit es?
Einer seitlichen Anmerkung scheint es, dass der Lack tut genau dies (obwohl dies NICHT in mv VCL config):
if (req.restarts == 0) {
if (req.http.X-Forwarded-For) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich auch rempelte problem heute.
Den
default.vcl
im Lack 4.0 wurde umbenannt inbuiltin.vcl
und enthält nicht dieset req.http.X-Forwarded-For
Teil, den du erwähnt - link. Trotzdem er eindeutig an eine durch Kommas getrennte Liste der zwischengeschalteten proxy-IP-Adresse gemäß der Protokoll-Spezifikationen - Link zu Wikipedia.Eine Lösung wäre, um die
X-Real-IP
Kopf statt, und überschreiben Sie diesen header die ganze Zeit in HAProxy mit dem echten client-ip und verwenden diese für vcl ACL.Andere Lösung als (zu Unrecht) erwähnt in das Lack forum, wäre
regsub(req.http.X-Forwarded-For, "[, ].*$", "")
nimmt die am weitesten Links stehende IP-Adresse. Diese Methode ist jedoch NICHT SICHER, da diese header können problemlos manipuliert werden.Mein Vorschlag wäre zum extrahieren der bekannte Teil -, Lack-IP aus dem header wie dieser:
Das einzige problem mit diesem ist, wenn es mehr als 2 hops in die Verbindung, zB. ebenso verwenden Sie eine proxy Verbindung zum internet. Eine gute Lösung HIERFÜR ist
nginx
da können Sie definieren, vertrauenswürdigen Hopfen, und Sie werden ignoriert, rekursiv, bis die eigentliche client-ip.Sehen Sie mehr details darüber in dieser serverfault thread beantworten
Vielleicht wollen Sie auch zu prüfen, warum in Ihrem
VCL_call RECV
Sie eineReqUnset X-Forwarded-For
VOR dem ACL übereinstimmen.Lack fügt seine default-Logik, um alle Funktionen, die Sie definieren, wie
vcl_recv
eher als rein überschreiben es. Die Standard -vcl_recv
Logik enthält:als Sie bemerkt. Was scheint seltsam für mich ist, dass es scheint, wie der Lack in der default-Logik in
vcl_recv
Ausführung vor Ihrervcl_recv
Logik. Welchen Wert sehen Sie fürX-Forwarded-For
innerhalbvcl_deliver
wenn Sie Ihre eigenen definieren?Eine Sache, die Sie tun können, analysieren die erste IP-Adresse wie dieser, wo erforderlich:
Dem Verschwinden source-code ist umgezogen zu GitHub so, als Referenz, da die version 4.0 der X-Forwarded-For-Logik wurde verschoben aus der
builtin.vcl
(früherdefault.vcl
), und die Quelle der Logik finden sich in bin/varnishd/cache/cache_req_fsm.c.