HAProxy - cara menambahkan ip klien di header X-Client-IP dan X-Forwarded-For?

10

Saya memiliki masalah dengan server HAProxy. Saya ingin meneruskan dalam header IP klien. Saya hampir melakukannya, tetapi ada kasus yang menarik dan saya tidak bisa mengetahuinya. Saya perlu menulis IP klien di 2 tempat di header, di tag X-CLIENT-IP dan X-FORWARDED-FOR.

Masalahnya adalah: Saat saya gunakan

option http-server-close
option forwardfor

Pada server target saya lihat di header X-FORWARDED-FOR = xxx.xxx.xxx.xxx (ip klien) tetapi tidak ada header x-client-ip.

Ketika saya menggunakan:

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

Pada server target saya melihat header X-CLIENT-IP = xxx.xxx.xxx (IP klien) tetapi X-FORWARDED-FOR = xxx.xxx.xxx.xxx (HAProxy ip)

Saya perlu melihat pada header target di mana X-CLIENT-IP dan X-FORWARDED-FOR memiliki nilai IP klien.

Saya mencoba mencampur konfigurasi seperti

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

Tidak berpengaruh. Saya juga tidak bisa menginstal modul apa pun. Targetnya adalah IIS.

Ada ide? :(

KacproSo
sumber

Jawaban:

12

Anda dapat mencoba mengatur tajuk khusus, seperti ini:

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

Atau, Anda bahkan dapat menyalinnya dari header X-Forwarded-For, saya pikir sintaksnya akan seperti:

http-request set-header X-Client-IP req.hdr_ip([X-Forwarded-For])
Jakov Sosic
sumber
Opsi kedua berikan saya di header x-client-ip = req.hdr_ip (% 5bX-Forwarded-For% 5d), jadi ada sesuatu yang salah. Tapi saya akan coba dulu.
KacproSo
Resolusi http-request set-header X-Client-IP% [src] berfungsi sempurna.
KacproSo
Contoh terakhir salah, aturan yang benar adalah: http-request set-header X-Client-IP% [req.hdr_ip (X-Forwarded-For)]
Rfraile
X-Client-IP dan X-Forwarded-For memiliki tujuan yang berbeda. Tidaklah aman untuk menyalin X-Forwarded-For, karena HAProxy dapat mengembalikan nilai yang dikirim oleh klien.
Der_Meister
5

Jika Anda ingin menggunakan keduanya, Anda harus menambahkan yang kedua dengan http-requestkata kunci.

# add X-FORWARDED-FOR
option forwardfor
# add X-CLIENT-IP
http-request add-header X-CLIENT-IP %[src]
GregL
sumber
Saya pikir set-header lebih baik untuk menghapus tajuk berbahaya yang dikirim dari klien.
Der_Meister
@Der_Meister Anda mungkin benar, tetapi saya tidak melihat bagaimana hal itu memiliki relevansi dengan pertanyaan atau jawaban ini. Peduli menguraikan?
GregL
1
Tujuan dari header X-Client-IP adalah untuk memberi tahu backend alamat IP asli dari koneksi, bukan nilai acak dari header yang masuk. Tidak disebutkan dalam pertanyaan, saya hanya ingin memperingatkan pembaca di masa depan.
Der_Meister
Sekali lagi, Anda mungkin benar tetapi dalam contoh ini, X-CLIENT-IPtidak diatur oleh klien, melainkan oleh HAProxy berdasarkan IP sumber. Saya sarankan meninggalkan komentar ini pada pertanyaan-pertanyaan di mana ia adalah relevan agar tidak pembaca bingung.
GregL
add-headertidak menghapus X-CLIENT-IPyang mungkin telah ditetapkan oleh klien. Inilah sebabnya mengapa @Der_Meister disarankan untuk menggunakannya set-header. Saya sarankan mengedit jawaban Anda untuk digunakan set-headersebagai gantinya.
pistache
0

Jawaban yang disarankan di atas yang tidak berfungsi untuk KacproSo hanya perlu membaca nilai dengan menambahkan &[...], jadi ini akan berfungsi dengan baik:

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

Mencoba pada HAproxy 1.7 ini adalah sintaks yang benar yang membuat ini bekerja, tanpa tanda kurung siku di sekitar X-Forwarded-For

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

Anda dapat menginstal modul bernama mod_rpaf di server backend Anda. Ini menyalin X-FORWARDED-FOR IP ke X-CLIENT-IP. Untuk informasi lebih lanjut, lihat ini . Pada Windows Anda harus memiliki modul yang serupa, seperti filter X-Forwarded-For ASAPI.

Jeroen
sumber
Dia tidak dapat menginstal modul apa pun ..
neutrinus