Bài viết hướng dẫn cách cấu hình phòng chống ddos website [Nginx protect ddos], DDoS được thực hiện bởi các chương trình, phần mềm (BOT) có thể được điều chỉnh để khai thác tốt nhất các lỗ hổng của các hệ thống cụ thể. BOT liên tục gửi request đến server và 1 lượng lớn request trong 1 thời gian ngắn khiến server không thể xử lý và dừng hoạt động.
Hướng dẫn cấu hình phòng chống ddos website [Nginx protect ddos]
Đặc điểm của các cuộc tấn công DDoS thường bắt nguồn từ một tập hợp địa chỉ IP cố định, thuộc về các máy được sử dụng để thực hiện cuộc tấn công. Do đó, mỗi địa chỉ IP chịu trách nhiệm cho nhiều kết nối và yêu cầu hơn bạn mong đợi từ người dùng thực. Đây không phải là tất cả những một số cách dưới đây có thể giúp bạn ngăn chặn DDoS.
1. Cấu hình Nginx giới hạn Requests đến server
![[HD] Cấu hình phòng chống ddos website [Nginx protect ddos] 25 Cách cấu hình phòng chống ddos website [Nginx protect ddos]](https://itsmeit.co/wp-content/uploads/2022/03/cach-phong-chong-ddos-website-voi-nginx-2.jpg)
Bạn có thể giới hạn tốc độ NGINX chấp nhận các yêu cầu đến ở một giá trị tiêu biểu cho người dùng thực. Ví dụ: bạn có thể quyết định rằng một người dùng thực truy cập trang đăng nhập chỉ có thể đưa ra yêu cầu sau mỗi 2 giây. Bạn có thể định cấu hình NGINX để cho phép một địa chỉ IP máy khách duy nhất cố gắng đăng nhập chỉ sau mỗi 2 giây (tương đương với 30 yêu cầu mỗi phút):
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; server { # ... location /login.html { limit_req zone=one; # ... } }
2. Xử lý bursts giới hạn nhiều truy cập hợp lệ đến cùng lúc trong Nginx
Nginx protect ddos, ngăn chặn ddos Nginx với tham số limit_req_zone, tham số limit_req_zone khai báo các thông số cho tính năng rate limit, trong khi limit_req kích hoạt rate limit trong những khu vực cụ thể mà nó xuất hiện (trong ví dụ trên là áp dụng limit cho tất cả các request đến location /login/). Đây là 1 cách cấu hình phòng chống ddos website với Nginx khá hiệu quả.
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; location /login/ { limit_req zone=mylimit burst=20; proxy_pass http://my_upstream; }
Tham số burst khai báo số lượng request một client có thể thực hiện vượt quá rate được chỉ định cho một zone (trong ví dụ của chúng ta là mylimit zone, giới hạn là 10 request mỗi giây, tương ứng 1 request mỗi 100ms). Một request đến sớm hơn 100ms so với request trước đó sẽ được đưa vào queue, và ở đây, ta set queue size là 20.
Điều đó có nghĩa, nếu 21 request đến cùng lúc từ 1 IP, NGINX sẽ forward request đầu tiên đến upstream server group ngay lập tức và put 20 request còn lại vào queue. Sau đó, nó forward từng request trong queue sau mỗi 100ms, và báo lỗi 503 cho client chỉ khi số lượng request trong queue vượt quá con số 20. Đây cũng là 1 cách cấu hình Nginx protect ddos hiệu quả..
3. Xử lý hàng đợi mà không delay request (Queueing with No Delay)
Cách phòng chống ddos website ở trên sử dụng burst giúp traffic flow trở nên mượt mà, tuy nhiên trong thực tế nó có thể khiến cho website của trông có vẻ bị chậm. Trong ví dụ của chúng ta, request thứ 20 trong queue phải đợi đến 2s mới được xử lý, mang lại trải nghiệm không tốt cho người dùng. Để giải quyết vấn đề này, sử dụng tham số nodelay bên cạnh tham số burst.
location /login/ { limit_req zone=mylimit burst=20 nodelay; proxy_pass http://my_upstream; }
Giả sử giống như lần trước, ta đang có 20 slot trống trong queue và nhận được 21 request đến đồng thời từ một địa chỉ IP. NGINX sẽ forward 21 request này ngay lập tức và đánh dấu 20 slot trong queue là “đã dùng”, sau đó, NGINX sẽ giải phóng (free) 1 slot sau mỗi 100ms. Nếu giả sử có 25 request đến cùng lúc, NGINX sẽ forward 21 request, đánh dấu 20 slot là đã dùng và reject 4 request với status code 503.
4. Cấu hình Nginx giới hạn số lượng kết nối
Một cách phòng chống ddos nữa là giới hạn số lượng kết nối có thể được mở bởi một địa chỉ IP máy khách. Ví dụ: bạn có thể cho phép mỗi địa chỉ IP của client mở không quá 10 kết nối đến trang web của bạn:
limit_conn_zone $binary_remote_addr zone=addr:10m; server { # ... location /store/ { limit_conn addr 10; # ... } }
5. Đóng kết nối chậm – Slowloris DDoS Nginx
Đóng các kết nối đang ghi dữ liệu quá thường xuyên. Slowloris là một ví dụ của kiểu tấn công này. Bạn có thể chỉ định client_body_timeout, client_header_timeout (mặc định là 60s). Nhưng có thể định cấu hình chờ 5s giữa các requets để đóng các kết nối chậm (Slowloris DDoS):
server { client_body_timeout 5s; client_header_timeout 5s; # ... }
6. Cách cấu hình từ chối 1 IP đang kết nối đến trên Nginx
![[HD] Cấu hình phòng chống ddos website [Nginx protect ddos] 26 Hướng dẫn cấu hình phòng chống ddos website [Nginx protect ddos]](https://itsmeit.co/wp-content/uploads/2022/03/cach-phong-chong-ddos-website-voi-nginx-3.jpg)
Nếu bạn có thể xác định các địa chỉ IP đang tấn công, bạn có thể từ chối kết nối đến server. Ví dụ ta đã xác định được IP 123.123.123.0 port 28 đang thực hiện liên tục requets đến server và cách cấu hình phòng chống ddos website với Nginx là thêm ip đó vào cấu hình như sau.
location / { deny 123.123.123.0/28; # ... }
Nếu xác định được nhiều IP bạn có thể cấu hình như sau
location / { deny 123.123.123.3; deny 123.123.123.5; deny 123.123.123.7; # ... }
7. Chặn Requests khi xác định được mục tiêu cụ thể trên Nginx
Ví dụ hacker đang DDoS trang web của bạn đến 1 link cụ thể như domain.com/login.php, domain.com/register.php ..v.v. Bạn có thể block riêng lẻ như sau.
location / { if ($http_user_agent ~* foo|bar) { return 403; } # ... }
Hoặc chặn hết tất cả truy cập vào một location cụ thể
location /register.php { deny all; }
Trên đây là cách cấu hình phòng chống ddos website với Nginx giúp bạn có thể ngăn chặn, hạn chế các cuộc tấn công trang web bằng ddos (Nginx protect ddos) hy vọng nó sẽ giúp ích cho trang web của bạn.
— Tài liệu tham khảo : https://www.nginx.com/blog/rate-limiting-nginx/