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?

John Brodie
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;
Andrei Mikhaltsov
sumber
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.

Lukas
sumber
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