HAProxy - Wie füge ich eine Client-IP in X-Client-IP- und X-Forwarded-For-Headern hinzu?

10

Ich habe ein Problem mit dem HAProxy-Server. Ich möchte im Header eine Client-IP weiterleiten. Ich habe es fast geschafft, aber es gibt einen interessanten Fall und ich kann es nicht herausfinden. Ich muss die Client-IP an zwei Stellen im Header schreiben, in den Tags X-CLIENT-IP und X-FORWARDED-FOR.

Das Problem ist: Wenn ich benutze

option http-server-close
option forwardfor

Auf dem Zielserver wird im Header X-FORWARDED-FOR = xxx.xxx.xxx.xxx (Client-IP) angezeigt, aber es gibt keinen x-Client-IP-Header.

Wenn ich benutze:

option forwardfor header X-Client-IP
option http-server-close

Auf dem Zielserver wird der Header X-CLIENT-IP = xxx.xxx.xxx (Client-IP), aber X-FORWARDED-FOR = xxx.xxx.xxx.xxx (HAProxy ip) angezeigt.

Ich muss im Zielheader sehen, wo X-CLIENT-IP und X-FORWARDED-FOR den Wert der Client-IP haben.

Ich versuche Konfigurationen wie zu mischen

 option forwardfor
 option forwardfor header X-Client-IP
 option http-server-close

Kein Effekt. Ich kann auch keine Module installieren. Das Ziel ist IIS.

Irgendwelche Ideen? :(

KacproSo
quelle

Antworten:

11

Sie können versuchen, einen benutzerdefinierten Header wie folgt einzurichten:

http-request set-header X-Client-IP %[src]

Oder Sie können es sogar aus dem X-Forwarded-For-Header kopieren. Ich denke, die Syntax würde ungefähr so ​​aussehen:

http-request set-header X-Client-IP req.hdr_ip([X-Forwarded-For])
Jakov Sosic
quelle
Die zweite Option gibt mir im Header x-client-ip = req.hdr_ip (% 5bX-Forwarded-For% 5d), also stimmt etwas nicht. Aber ich werde es zuerst versuchen.
KacproSo
Erste Auflösung http-Anfrage Set-Header X-Client-IP% [src] funktioniert perfekt.
KacproSo
Das letzte Beispiel ist falsch, die richtige Regel lautet: http-Anfrage Set-Header X-Client-IP% [req.hdr_ip (X-Forwarded-For)]
Rfraile
X-Client-IP und X-Forwarded-For haben unterschiedliche Zwecke. Das Kopieren von X-Forwarded-For ist nicht sicher, da HAProxy vom Client gesendete Werte zurückgeben kann.
Der_Meister
5

Wenn Sie beide verwenden möchten, müssen Sie die zweite mit einem http-requestSchlüsselwort hinzufügen .

# add X-FORWARDED-FOR
option forwardfor
# add X-CLIENT-IP
http-request add-header X-CLIENT-IP %[src]
GregL
quelle
Ich denke, Set-Header ist besser, um vom Client gesendete schädliche Header zu entfernen.
Der_Meister
@Der_Meister Sie haben vielleicht Recht, aber ich sehe nicht, wie das für diese Frage oder Antwort relevant ist. Möchtest du das näher erläutern?
GregL
1
Der Zweck des X-Client-IP-Headers besteht darin, dem Backend die tatsächliche IP-Adresse der Verbindung mitzuteilen, nicht einen zufälligen Wert aus einem eingehenden Header. Es wird in der Frage nicht erwähnt, ich möchte nur zukünftige Leser warnen.
Der_Meister
Auch hier haben Sie vielleicht Recht, aber in diesem Beispiel wird das X-CLIENT-IPnicht vom Client festgelegt, sondern von HAProxy basierend auf der Quell-IP. Ich würde vorschlagen, diese Kommentare bei Fragen zu hinterlassen, bei denen dies relevant ist , um die Leser nicht zu verwirren.
GregL
add-headerentfernt nicht das X-CLIENT-IP, was möglicherweise vom Client festgelegt wurde. Aus diesem Grund hat @Der_Meister empfohlen, set-headerstattdessen zu verwenden. Ich schlage vor, Ihre Antwort zu bearbeiten, um sie set-headerstattdessen zu verwenden .
Pistache
0

Die oben vorgeschlagene Antwort, die für KacproSo nicht funktionierte, musste nur den Wert durch Hinzufügen lesen &[...], daher sollte dies gut funktionieren:

http-request set-header X-Client-IP %[req.hdr_ip([X-Forwarded-For])]
user489680
quelle
0

Bei HAproxy 1.7 ist dies die richtige Syntax, mit der dies funktioniert, ohne die eckigen Klammern um X-Forwarded-For

   http-request set-header X-Client-IP %[req.hdr_ip(X-Forwarded-For)]
user3540644
quelle
-2

Sie können ein Modul namens mod_rpaf auf Ihren Backend-Servern installieren. Dadurch wird die X-FORWARDED-FOR-IP in die X-CLIENT-IP kopiert. Weitere Informationen finden Sie hier . Unter Windows sollten ähnliche Module vorhanden sein, z. B. X-Forwarded-For-ASAPI-Filter.

Jeroen
quelle
Er kann keine Module installieren ..
Neutrinus