Tôi có một ứng dụng Flask tôi đang phát triển dựa nhiều vào tương tác trang web bên ngoài và được người dùng cuối khởi xướng. Nếu tôi rời khỏi ứng dụng mà không có bất kỳ loại giới hạn kiểm soát / tốc độ băng thông nào thì ứng dụng này có thể bị các tác nhân lạm dụng với mục đích bất chính.
Mục tiêu của tôi là một cách tiếp cận 2 giai đoạn khá đơn giản:
Tỷ lệ giới hạn các nguồn IP riêng lẻ thực hiện nhiều hơn
x
số lượng kết nối một phút. Điều này có thể dễ dàng đạt được vớiiptables
. Đây là một ví dụ tương tự với mục tiêu của tôi:iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 \ --connlimit-mask 32 -j REJECT --reject-with tcp-reset
Tỷ lệ giới hạn khả năng ứng dụng thực hiện nhiều hơn
x
số lần tra cứu trên mỗi URL . Thí dụ:APP ---- 10 pps ---> stackexchange.com PERMIT APP ---- 25 pps ---> google.com DENY / 15 SECOND BACKOFF
Theo như tôi có thể nói, iptables
không có cách nào để theo dõi các URL riêng biệt. Nó chỉ có thể đánh giá giới hạn các kết nối này nói chung. Đó dường như cũng không phải là giới hạn duy nhất cho những gì tôi đang cố gắng đạt được. Nếu có một cách để thiết lập iptables
theo cách này, nó có thể cung cấp một số vấn đề với ứng dụng web của tôi vì các yêu cầu này do người dùng khởi tạo.
Tôi đang sử dụng Flask, một tùy chọn khả thi có thể là sử dụng before_request
hook và theo dõi thủ công các điểm đến này bằng một kho lưu trữ dữ liệu như Redis. Tuy nhiên, điều này là khá cao trong ngăn xếp để xử lý các kết nối theo cách này. Những gì tôi thực sự cần (hoặc nghĩ rằng tôi làm) là một ứng dụng tường lửa thông minh có thể phân tích các yêu cầu theo cách tùy chỉnh và đóng các kết nối khi đã đạt đến một số điểm dừng nhất định.
Có cách nào để đạt được những gì tôi đang cố gắng làm không?
Nếu vậy thì thế nào?