pembatasan nginx rate dengan header X-Forwarded-For


23

Saya melihat ke pembatasan tingkat menggunakan HttpLimitReqModule nginx . Namun, semua permintaan berasal dari IP yang sama (loadbalancer), dengan alamat IP asli di header.

Apakah ada cara untuk memiliki nginx rate-limit berdasarkan ip di X-Forwarded-Forheader bukan ip sumber?

Jawaban:


28

Ya, string definisi konfigurasi pembatasan tingkat yang khas terlihat seperti:

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

di mana $binary_remote_addrkunci unik untuk limiter. Anda harus mencoba mengubahnya ke $http_x_forwarded_forvariabel yang mendapatkan nilai X-Forwarded-Forheader. Meskipun ini akan meningkatkan konsumsi memori karena $binary_remote_addrmenggunakan format biner terkompresi untuk menyimpan alamat IP dan $http_x_forwarded_fortidak.

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

Saya baru saja sampai pada kesimpulan yang sama, dan dalam tes cepat berfungsi dengan baik. Terima kasih telah menunjukkan peningkatan penggunaan memori.
John Brodie

2
Waspadalah mungkin ada masalah keamanan yang serius untuk ini: blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
ircmaxell

Perhatikan bahwa informasi dalam posting blog mengenai symfony adalah alamat dengan yang berikut: symfony.com/doc/current/components/http_foundation/…
calumbrodie

5
Jika Anda menggunakan modul realip, $binary_remote_addrvariabel akan diatur dengan benar.
Cenk Alti

5

The limit_req_zonedirektif mendefinisikan variabel yang akan digunakan sebagai kunci untuk permintaan pengelompokan.
Biasanya, $binary_remote_addrini digunakan bukan $remote_addrkarena lebih kecil dan menghemat ruang.

Mungkin Anda juga ingin menggunakan RealipModule .
Ini akan menulis ulang variabel alamat jarak jauh ke alamat yang disediakan di header khusus dan juga akan membuat pencatatan dan penggunaan variabel lainnya lebih mudah.


1
+1 untuk modul RealIP. Saat menggunakan modul ini, $binary_remote_addrdan $remote_addrdiatur ke nilai header yang Anda konfigurasikan, biasanya X-Forwarded-For- jadi variabel standar Anda sekarang adalah "alamat IP klien nyata". Jalankan nginx -Vuntuk melihat apakah NGINX dibangun dengan --with-http_realip. Kemudian konfigurasi sesederhana set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; :, di mana rentang CIDR adalah penyeimbang beban hulu Anda yang mengatur X-Forwarder-Forheader.
markdsievers
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.