Làm cách nào để triển khai giới hạn tốc độ với Apache? (yêu cầu mỗi giây)


84

Những kỹ thuật và / hoặc mô-đun nào có sẵn để thực hiện giới hạn tốc độ mạnh mẽ (yêu cầu | byte / ip / đơn vị thời gian) trong apache?


Tôi đang sử dụng tc của Linux trên máy chủ web, vì Red Hat 6 chỉ có Apache 2.2.
thúc

Câu trả lời:


55

Tốt nhất

  • mod_evasive (Tập trung nhiều hơn vào việc giảm phơi nhiễm DoS)
  • mod_cband (Tính năng tốt nhất để kiểm soát băng thông 'bình thường')

và phần còn lại


10
Tôi không thể tìm thấy bất kỳ điều gì để giới hạn kết nối mỗi ngày theo địa chỉ IP. Tôi đã mất cả đêm để tìm kiếm, thật là xấu hổ.
Greg

1
Có ai biết có cách nào để mod_evasive xem tiêu đề thay vì IP khi chạy phía sau proxy ngược không?
Stavros Korokithakis

6
4 năm sau, mod_evasive có còn là "nhất cử lưỡng tiện"?
Zac Thompson

6
Sao lưu yêu cầu của bạn. Tại sao _evasive và _cband là tốt nhất?
Reed

4
mod_evasivenhận được rất nhiều đề xuất trực tuyến nhưng vào giữa năm 2017, dường như nó đã bị tác giả của nó, Jonathan Zdziarski bỏ rơi, người đã xóa tất cả các tham chiếu đến nó khỏi blog của mình một cách kỳ lạ - mặc dù mã nguồn vẫn có sẵn dưới dạng tải lên . Không có dự án nào khác được cập nhật trong 6 năm qua (hoặc 15 năm trong trường hợp của mod_limitipconn).
Anthony Geoghegan

19

Như đã nêu trong bài đăng trên blog này , dường như có thể sử dụng mod_security để thực hiện giới hạn tốc độ trên giây.

Cấu hình như sau:

SecRuleEngine On

<LocationMatch "^/somepath">
  SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog
  SecAction "phase:5,deprecatevar:ip.somepathcounter=1/1,pass,nolog"
  SecRule IP:SOMEPATHCOUNTER "@gt 60" "phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog"
  SecAction "phase:2,pass,setvar:ip.somepathcounter=+1,nolog"
  Header always set Retry-After "10" env=RATELIMITED
</LocationMatch>

ErrorDocument 509 "Rate Limit Exceeded"

3
Điều này là hoàn hảo đối với tôi, với modsec2 đã chạy. Chỉ cần thêm id vào các quy tắc để phù hợp với phiên bản modsec, như sau: <LocationMatch "^ / somepath"> SecAction initcol: ip =% {REMOTE_ADDR}, pass, nolog, id: 10000001 SecAction "phase: 5 ,recatevar: ip.somepathcounter = 1/1, pass, nolog, id: 10000002 "SecRule IP: SOMEPATHCOUNTER" @gt 60 "" phase: 2, pause: 300, từ chối, trạng thái: 509, setenv: RATELIMITED, bỏ qua: 1, nolog, id: 10000003 Giai đoạn "SecAction": 2, vượt qua, setvar: ip.somepathcounter = + 1, nolog, id: 10000004 "Header luôn đặt Thử lại sau" 10 "env = RATELIMITED </LocationMatch>
Nathan Stretch

2
Cũng lưu ý rằng bạn có thể thay đổi số lượng yêu cầu liên tục ban đầu được phép bằng cách chỉnh sửa "@gt 60", cũng như tốc độ "sạc" lại giới hạn bằng cách chỉnh sửa ip.somepathcounter = 1/1 bit. 1/1 cho phép một yêu cầu bổ sung mỗi giây. 1/2 cho phép một yêu cầu bổ sung cứ sau 2 giây, v.v.
Nathan Stretch

3
Apache 2.4 sẽ phàn nàn về 509 trong ErrorDocument, một tùy chọn đang thay đổi nó thành 429 (điều này-dĩ nhiên- không được hỗ trợ trong Apache 2.2). Ngoài ra, tất cả SecAction và SecRule-s đều cần một id kể từ mod_security 2.7.
Mrten

1
FYI mod_securitykhông phải là một dự án Apache.
Christopher Schultz

12

Có rất nhiều cách bao gồm tường lửa ứng dụng web nhưng cách dễ nhất để thực hiện nếu sử dụng mod Apache.

Một trong những mod mà tôi muốn giới thiệu là mod_qos . Đây là một mô-đun miễn phí rất hiệu quả để chống lại các cuộc tấn công kiểu certin DOS, Bruteforce và Slowloris. Điều này sẽ làm giảm tải máy chủ của bạn khá nhiều.

Nó rất mạnh mẽ .

Bản phát hành hiện tại của mô-đun mod_qos triển khai các cơ chế kiểm soát để quản lý:

  • Số lượng tối đa các yêu cầu đồng thời đến một vị trí / tài nguyên (URL) hoặc máy chủ ảo.

  • Giới hạn băng thông chẳng hạn như số lượng yêu cầu được phép tối đa mỗi giây đối với một URL hoặc tối đa / tối thiểu kbyte tải xuống mỗi giây.

  • Giới hạn số lượng sự kiện yêu cầu mỗi giây (điều kiện yêu cầu đặc biệt).

  • Giới hạn số lượng sự kiện yêu cầu trong một khoảng thời gian xác định.
  • Nó cũng có thể phát hiện những người rất quan trọng (VIP) có thể truy cập vào máy chủ web mà không có hoặc có ít hạn chế hơn.
  • Dòng yêu cầu chung và bộ lọc tiêu đề để từ chối các hoạt động trái phép.

  • Yêu cầu giới hạn và lọc dữ liệu nội dung (yêu cầu mod_parp).

  • Giới hạn số lượng sự kiện yêu cầu cho các máy khách (IP) riêng lẻ.

  • Các hạn chế về cấp độ kết nối TCP, ví dụ: số lượng kết nối tối đa được phép từ một địa chỉ nguồn IP duy nhất hoặc điều khiển duy trì động.

  • Ưu tiên các địa chỉ IP đã biết khi máy chủ hết kết nối TCP miễn phí.

Đây là cấu hình mẫu về những gì bạn có thể sử dụng nó. Có hàng trăm cấu hình có thể phù hợp với nhu cầu của bạn. Truy cập trang web để biết thêm thông tin về các điều khiển.

Sample configuration:
# minimum request rate (bytes/sec at request reading):
QS_SrvRequestRate                                 120

# limits the connections for this virtual host:
QS_SrvMaxConn                                     800

# allows keep-alive support till the server reaches 600 connections:
QS_SrvMaxConnClose                                600

# allows max 50 connections from a single ip address:
QS_SrvMaxConnPerIP                                 50

# disables connection restrictions for certain clients:
QS_SrvMaxConnExcludeIP                    172.18.3.32
QS_SrvMaxConnExcludeIP                    192.168.10.

http://opensource.adnovum.ch/mod_qos/


cái này chỉ hoạt động trong apache2.2 cũ không hoạt động trong apache2.4 +, phải không?
infiniteloop

@infiniteloop trên trang sourceforge mod_quos cho biết nó hoạt động tốt với apache2.4. Nhưng có một cuộc thảo luận cụ thể về một số tính năng không hoạt động ở đây: stackoverflow.com/a/15726540/1402498
JamesHoux

6

Trong Apache 2.4, có một mô-đun chứng khoán mới được gọi là mod_ratelimit . Để mô phỏng tốc độ modem, bạn có thể sử dụng mod_dialup . Mặc dù tôi không hiểu tại sao bạn không thể sử dụng mod_ratelimit cho mọi thứ.


Lưu ý rằng mod_dialup sử dụng SUSPENDEDtrạng thái không đồng bộ , không lãng phí các luồng khi chờ đợi, trong khi mod_ratelimit, kể từ bây giờ, hoàn toàn là luồng cho mỗi kết nối. cf. thread.gmane.org/gmane.comp.apache.cvs/20490
ArtemGr

6

Đáng buồn thay, mod_evasivesẽ không hoạt động như mong đợi khi được sử dụng trong các cấu hình không phải prefork (các thiết lập apache gần đây chủ yếu là MPM)



1

Phụ thuộc vào lý do bạn muốn xếp hạng giới hạn.

Nếu nó để bảo vệ khỏi quá tải máy chủ, thì việc đặt NGINX trước nó và định cấu hình giới hạn tốc độ ở đó sẽ rất hợp lý. Nó có ý nghĩa vì NGINX sử dụng ít tài nguyên hơn nhiều, chẳng hạn như vài MB trên một vạn kết nối. Vì vậy, nếu máy chủ bị ngập, NGINX sẽ thực hiện giới hạn tốc độ (sử dụng một lượng tài nguyên không đáng kể) và chỉ chuyển lưu lượng được phép tới Apache.

Nếu tất cả những gì bạn muốn là sự đơn giản, thì hãy sử dụng một cái gì đó như mod_evasive.

Như thường lệ, nếu để bảo vệ chống lại các cuộc tấn công DDoS hoặc DoS, hãy sử dụng một dịch vụ như Cloudflare cũng có giới hạn tốc độ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.