HAProxy - วิธีผนวกไคลเอ็นต์ ip ใน X-Client-IP และ X-Forwarded- สำหรับส่วนหัวได้อย่างไร


10

ฉันมีปัญหากับเซิร์ฟเวอร์ HAProxy ฉันต้องการส่งต่อ IP ส่วนหัวของไคลเอ็นต์ ฉันเกือบจะทำเสร็จแล้ว แต่มีกรณีที่น่าสนใจและฉันไม่สามารถเข้าใจได้ ฉันต้องเขียน IP ไคลเอ็นต์ใน 2 ตำแหน่งในส่วนหัวในแท็ก X-CLIENT-IP และ X-FORWARDED-FOR

ปัญหาคือ: เมื่อฉันใช้

option http-server-close
option forwardfor

บนเซิร์ฟเวอร์เป้าหมายฉันเห็นในส่วนหัว X-FORWARDED-FOR = xxx.xxx.xxx.xxx (ไคลเอ็นต์ ip) แต่ไม่มีส่วนหัว x-client-ip

เมื่อฉันใช้:

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

บนเซิร์ฟเวอร์เป้าหมายฉันเห็นส่วนหัว X-CLIENT-IP = xxx.xxx.xxx (IP ไคลเอ็นต์) แต่ X-FORWARDED-FOR = xxx.xxx.xxx.xxx (HAProxy ip)

ฉันต้องดูที่ส่วนหัวเป้าหมายที่ X-CLIENT-IP และ X-FORWARDED-FOR มีค่า IP ของไคลเอ็นต์

ฉันพยายามผสมผสานการกำหนดค่าเช่น

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

ไม่มีความสมบูรณ์ ฉันไม่สามารถติดตั้งโมดูลใด ๆ ได้ เป้าหมายคือ IIS

ความคิดใด ๆ :(

คำตอบ:


12

คุณสามารถลองตั้งค่าส่วนหัวที่กำหนดเองเช่นนี้:

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

หรือคุณสามารถคัดลอกจากส่วนหัว X-Forwarded-For ฉันคิดว่ารูปแบบของไวยากรณ์จะเป็นดังนี้:

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

ตัวเลือกที่สองให้ฉันในส่วนหัว x-client-ip = req.hdr_ip (% 5bX- ส่งต่อ - สำหรับ% 5d) ดังนั้นมีบางอย่างผิดปกติ แต่ฉันจะลองก่อน
KacproSo

ความละเอียดแรก http-request set-header X-Client-IP% [src] ทำงานได้อย่างสมบูรณ์แบบ
KacproSo

ตัวอย่างสุดท้ายไม่ถูกต้องกฎที่ถูกต้องคือ: http-request set-header X-Client-IP% [req.hdr_ip (X-Forwarded-For)]
Rfraile

X-Client-IP และ X-Forwarded- สำหรับมีวัตถุประสงค์ที่แตกต่างกัน การคัดลอก X-Forwarded-For นั้นไม่ปลอดภัยเนื่องจาก HAProxy สามารถส่งคืนค่าที่ลูกค้าส่งมา
Der_Meister

5

หากคุณต้องการใช้ทั้งสองอย่างคุณจะต้องเพิ่มคำที่สองด้วยhttp-requestคำหลัก

# add X-FORWARDED-FOR
option forwardfor
# add X-CLIENT-IP
http-request add-header X-CLIENT-IP %[src]

ฉันคิดว่า set-header ดีกว่าที่จะลบส่วนหัวที่เป็นอันตรายที่ส่งมาจากลูกค้า
Der_Meister

@Der_Meister คุณอาจพูดถูก แต่ฉันไม่เห็นว่ามันเกี่ยวข้องกับคำถามหรือคำตอบนี้อย่างไร สนใจที่จะทำอย่างละเอียด?
GregL

1
วัตถุประสงค์ของส่วนหัว X-Client-IP คือการบอกแบ็กเอนด์ที่อยู่ IP ที่แท้จริงของการเชื่อมต่อไม่ใช่ค่าสุ่มจากส่วนหัวที่เข้ามา มันไม่ได้กล่าวถึงในคำถามฉันแค่ต้องการเตือนผู้อ่านในอนาคต
Der_Meister

อีกครั้งคุณอาจพูดถูก แต่ในตัวอย่างX-CLIENT-IPนี้ลูกค้าไม่ได้ถูกตั้งค่า แต่เป็น HAProxy ที่อิงตาม IP ต้นทาง ผมขอแนะนำให้ออกความคิดเห็นเหล่านี้บนคำถามที่มันเป็นที่เกี่ยวข้องเพื่อที่จะไม่ให้ผู้อ่านสับสน
GregL

add-headerไม่ลบสิ่งX-CLIENT-IPที่ลูกค้าอาจตั้งค่าไว้ นี่คือเหตุผลที่ @Der_Meister แนะนำให้ใช้set-headerแทน ฉันขอแนะนำให้แก้ไขคำตอบของคุณเพื่อใช้set-headerแทน
pistache

0

คำแนะนำที่แนะนำข้างต้นที่ไม่ได้ผลสำหรับ KacproSo เพียงแค่ต้องการอ่านค่าด้วยการเพิ่ม&[...]ดังนั้นจึงควรใช้งานได้:

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

0

การลองใช้ HAproxy 1.7 นี่เป็นไวยากรณ์ที่ถูกต้องที่ทำให้ใช้งานได้โดยไม่มีเครื่องหมายวงเล็บเหลี่ยมรอบ X-Forwarded-For

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

-2

คุณสามารถติดตั้งโมดูลชื่อ mod_rpaf บนเซิร์ฟเวอร์ด้านหลังของคุณ สิ่งนี้คัดลอก X-FORWARDED-FOR IP ไปยัง X-CLIENT-IP สำหรับข้อมูลเพิ่มเติมโปรดดูที่นี้ บน Windows คุณควรมีโมดูลที่คล้ายกันบางอย่างเช่นตัวกรอง X-Forwarded-For ASAPI


เขาไม่สามารถติดตั้งโมดูลใด ๆ ..
นิวทริอุส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.