อัตรา nginx จำกัด ด้วยส่วนหัว X-Forwarded-For


23

ฉันกำลังมองหาในการ จำกัด อัตราการใช้ Nginx ของHttpLimitReqModule อย่างไรก็ตามคำขอทั้งหมดมาจาก IP เดียวกัน (loadbalancer) พร้อมกับที่อยู่ IP จริงในส่วนหัว

มีวิธีการ จำกัด อัตรา nginx ตาม ip ในX-Forwarded-Forส่วนหัวแทนที่จะเป็น ip ของแหล่งที่มาหรือไม่?

คำตอบ:


28

ใช่สตริงคำจำกัดความการกำหนดค่า จำกัด อัตราทั่วไปดูเหมือนว่า:

 limit_req_zone  $binary_remote_addr zone=zone:16m rate=1r/s;

ที่$binary_remote_addrเป็นกุญแจสำคัญที่ไม่ซ้ำกันสำหรับการ จำกัด คุณควรลองเปลี่ยนเป็น$http_x_forwarded_forตัวแปรที่รับค่าX-Forwarded-Forส่วนหัว แม้ว่าสิ่งนี้จะเพิ่มปริมาณการใช้หน่วยความจำเพราะ$binary_remote_addrใช้รูปแบบไบนารีที่บีบอัดสำหรับจัดเก็บที่อยู่ IP และ$http_x_forwarded_forไม่ใช่

 limit_req_zone  $http_x_forwarded_for zone=zone:16m rate=1r/s;

ฉันเพิ่งมาถึงข้อสรุปเดียวกันและในการทดสอบอย่างรวดเร็วมันทำงานได้ดี ขอบคุณที่ชี้ให้เห็นถึงการใช้งานหน่วยความจำเพิ่มขึ้น
John Brodie

2
ระวังอาจจะมีความกังวลด้านความปลอดภัยร้ายแรงนี้: blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
ircmaxell

โปรดทราบว่าข้อมูลในบล็อกโพสต์ที่เกี่ยวข้องกับ symfony คือที่อยู่ดังต่อไปนี้: symfony.com/doc/current/components/http_foundation/…
calumbrodie

5
หากคุณใช้โมดูล realip $binary_remote_addrตัวแปรจะได้รับการตั้งค่าอย่างถูกต้อง
Cenk Alti

5

limit_req_zoneสั่งกำหนดตัวแปรที่จะใช้เป็นกุญแจสำคัญสำหรับการร้องขอการจัดกลุ่ม
โดยปกติแล้ว$binary_remote_addrจะใช้มากกว่า$remote_addrเพราะมันมีขนาดเล็กและประหยัดพื้นที่

บางทีคุณอาจจะผลัดต้องการใช้RealipModule
สิ่งนี้จะเขียนตัวแปรที่อยู่ระยะไกลไปยังที่อยู่ที่ให้ไว้ในส่วนหัวที่กำหนดเองและจะทำให้การบันทึกและการใช้ตัวแปรอื่น ๆ ง่ายขึ้น


1
+1 สำหรับโมดูล RealIP เมื่อใช้โมดูลนี้$binary_remote_addrและ$remote_addrถูกกำหนดเป็นค่าของส่วนหัวที่ตั้งค่าไว้โดยทั่วไปX-Forwarded-For- ดังนั้นตัวแปรมาตรฐานของคุณจึงกลายเป็น "ที่อยู่ IP ของลูกค้าจริง" เรียกใช้nginx -Vเพื่อดูว่า NGINX --with-http_realipถูกสร้างขึ้นด้วย จากนั้นตั้งค่าได้ง่ายเหมือน: set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; โดยที่ช่วง CIDR เป็นของตัวโหลดอัพสตรีมของคุณซึ่งตั้งค่าX-Forwarder-Forส่วนหัว
แม่นปืน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.