ฉันเชื่อว่ากุญแจสำคัญในการแก้ปัญหา X-Forwarded-For woes เมื่อหลาย IP ถูกล่ามโซ่เป็นตัวเลือกการกำหนดค่าที่เพิ่งเปิดตัวreal_ip_recursive
(เพิ่มใน nginx 1.2.1 และ 1.3.0) จากเอกสาร nginx realip :
หากเปิดใช้การค้นหาแบบเรียกซ้ำที่อยู่ไคลเอ็นต์ดั้งเดิมที่ตรงกับหนึ่งในที่อยู่ที่เชื่อถือได้จะถูกแทนที่ด้วยที่อยู่ที่ไม่น่าเชื่อถือสุดท้ายที่ส่งในฟิลด์ส่วนหัวคำขอ
โดยค่าเริ่มต้น nginx กำลังดึงที่อยู่ IP สุดท้ายในห่วงโซ่เนื่องจากเป็นที่อยู่เดียวที่สันนิษฐานว่าเชื่อถือได้ แต่ด้วยการreal_ip_recursive
เปิดใช้งานใหม่และด้วยหลายset_real_ip_from
ตัวเลือกคุณสามารถกำหนดพร็อกซีที่เชื่อถือได้หลายรายการและจะดึง IP ที่ไม่น่าเชื่อถือล่าสุด
ตัวอย่างเช่นด้วยการกำหนดค่านี้:
set_real_ip_from 127.0.0.1;
set_real_ip_from 192.168.2.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
และส่วนหัว X-Forwarded-For ทำให้เกิด:
X-Forwarded-For: 123.123.123.123, 192.168.2.1, 127.0.0.1
nginx จะเลือก 123.123.123.123 เป็นที่อยู่ IP ของลูกค้า
สำหรับเหตุผลที่ nginx ไม่เพียงแค่เลือกที่อยู่ IP ซ้ายสุดและต้องการให้คุณกำหนดพร็อกซีที่เชื่อถือได้อย่างชัดเจนเพื่อป้องกันการแอบอ้าง IP ได้ง่าย
สมมติว่าที่อยู่ IP 123.123.123.123
จริงของลูกค้าคือ Let 's ยังบอกลูกค้าถึงไม่ดีและพวกเขากำลังพยายามที่จะหลอกที่อยู่ IP 11.11.11.11
ของพวกเขาจะ พวกเขาส่งคำขอไปยังเซิร์ฟเวอร์โดยมีส่วนหัวนี้อยู่แล้ว:
X-Forwarded-For: 11.11.11.11
เนื่องจาก reverse proxies เพียงแค่เพิ่ม IP ลงในเชน X-Forwarded-For นี้สมมติว่ามันจะเป็นแบบนี้เมื่อ nginx เข้ามา:
X-Forwarded-For: 11.11.11.11, 123.123.123.123, 192.168.2.1, 127.0.0.1
หากคุณเพียงแค่คว้าที่อยู่ทางซ้ายสุดนั่นจะทำให้ลูกค้าสามารถปลอมแปลงที่อยู่ IP ของพวกเขาได้อย่างง่ายดาย แต่ด้วยตัวอย่างข้างต้นการกำหนดค่า nginx nginx จะไว้วางใจที่อยู่สองรายการสุดท้ายเป็นพร็อกซีเท่านั้น ซึ่งหมายความว่า nginx จะเลือกอย่างถูกต้อง123.123.123.123
เป็นที่อยู่ IP แม้ว่า IP ปลอมแปลงนั้นจะอยู่ทางซ้ายสุด