Saya memiliki aplikasi Flask yang saya kembangkan yang sangat bergantung pada interaksi situs web eksternal dan diprakarsai oleh pengguna akhir. Jika saya meninggalkan aplikasi tanpa kontrol bandwidth / pembatasan tingkat apa pun maka aplikasi ini dapat disalahgunakan oleh pelaku dengan niat jahat.
Tujuan saya adalah pendekatan 2 tahap yang cukup sederhana:
Batas tingkat sumber IP individu dari melakukan lebih dari
x
jumlah koneksi per menit. Ini bisa dicapai dengan mudahiptables
. Inilah contoh yang mirip dengan tujuan saya:iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 \ --connlimit-mask 32 -j REJECT --reject-with tcp-reset
Nilai membatasi kemampuan aplikasi untuk melakukan lebih dari
x
jumlah pencarian per URL . Contoh:APP ---- 10 pps ---> stackexchange.com PERMIT APP ---- 25 pps ---> google.com DENY / 15 SECOND BACKOFF
Sejauh yang saya tahu, iptables
tidak memiliki cara untuk melacak URL terpisah. Ini hanya dapat menilai batas koneksi ini secara keseluruhan. Itu juga sepertinya bukan satu-satunya batasan untuk apa yang saya coba capai. Jika ada cara untuk mensetup iptables
dengan cara ini, itu mungkin memberikan beberapa masalah dengan aplikasi web saya karena permintaan ini diprakarsai oleh pengguna.
Saya menggunakan Flask, opsi yang mungkin menggunakan before_request
hook dan secara manual melacak tujuan-tujuan ini dengan penyimpanan data seperti Redis. Namun, ini cukup tinggi di stack untuk berurusan dengan koneksi dengan cara ini. Yang benar-benar saya butuhkan (atau pikir saya lakukan) adalah aplikasi firewall cerdas yang dapat membedah permintaan dengan cara kustom dan menutup koneksi ketika breakpoints tertentu telah tercapai.
Apakah ada cara untuk mencapai apa yang saya coba lakukan?
Jika ya, bagaimana caranya?